十三、开发高可用性网站
网站的高可用性是指网站持续可用,没有服务中断。通过在 Docker Swarm 应用中提供容错功能,网站变得高度可用。高可用性在不同的级别上提供。入口负载均衡器在多个服务任务之间平衡传入的客户端请求,并在任务级别提供容错。如果一个服务任务失败,客户端流量将被路由到另一个服务任务。为跨多个可用性区域托管的 Docker 群使用外部负载均衡器是提供高可用性的另一种方法。外部负载均衡器在节点级别提供容错。如果一个节点出现故障,客户端流量将被路由到另一个节点上的群节点。
问题
使用外部负载均衡器(如 AWS 弹性负载均衡器) 可以在 AWS 区域的多个可用性区域中提供容错能力。客户端主机可以通过其 DNS 名称访问弹性负载均衡器,如图 13-1 所示。Swarm 的可用性不高,因为单个 AWS 区域的故障会导致网站不可用。

图 13-1。
The elastic load balancer may be accessed at its DNS name by a client host
解决方案
Amazon Route 53 通过各种 DNS 故障转移选项提供高可用性,包括使用别名资源记录集的主动-主动和主动-被动故障转移。Amazon Route 53 提供跨地理上分散的 AWS 区域的 DNS 故障转移,如图 13-2 所示。我们使用 Amazon Route 53 主动-被动故障转移配置,该配置基于负载均衡器 DNS 的主-从架构模式。

图 13-2。
Amazon Route 53 provides DNS failover across AWS regions
本章涵盖以下主题:
- 设置环境
- 创建多个停靠站群
- 部署 Docker 群服务
- 创建 AWS 路线 53
- 创建托管区域
- 配置名称服务器
- 创建记录集
- 测试高可用性
- 删除托管区域
设置环境
我们使用两个 Docker for AWS 托管集群,为主动-被动 DNS 故障转移配置提供两个 DNS。路由 53 为两个 DNS 提供了主-从架构模式。唯一的先决条件是一个 AWS 帐户,可以在 https://aws.amazon.com/resources/create-account/ 创建。创建一个密钥对(Swarm ),用于 SSH 登录到 Swarm manager 节点,如图 13-3 所示。仅由所有者使用 chmod 400 swarm.pem 命令将密钥对的权限设置为只读。

图 13-3。
Key pair
必须注册域名才能用于创建 Amazon Route 53 托管区域。
创建多个停靠站群
在 https://docs.docker.com/docker-for-aws/ 使用 AWS 托管服务的 Docker 创建两个 Docker 群组。这两个 Docker 集群必须位于两个不同的 AWS 区域,才能使用地理上分布的 AWS 区域提供的高可用性。创建一个 Docker Swarm Oregon 地区作为例子,如图 13-4 所示。

图 13-4。
CloudFormation stack for Docker Swarm
每个 Docker 群都有分布在 AWS 区域中的 AWS 可用性区域的管理器和工作者节点。管理节点的公共 IP 可以从 EC2 控制台获取,如图 13-5 所示。

图 13-5。
Obtaining the public IP of the Swarm manager node
使用第一个停靠站群中管理节点的公共 IP 地址,SSH 登录到管理节点 EC2 实例。
[root@localhost ∼]# ssh -i "swarm.pem" docker@54\. 149.86.148 Welcome to Docker! ∼$
以俄亥俄州 AWS 地区创建其他 Docker Swarm 为例,如图 13-6 所示。对于不同的用户,区域可能是不同的。

图 13-6。
CloudFormation stack for the Docker Swarm in one region
第二停靠站群的群节点 EC2 实例也分布在第二 AWS 区域中的 AWS 可用性区域,如图 13-7 所示。获取管理器节点的公共 IP。

图 13-7。
The Availability Zone column lists multiple zones
SSH 登录到实例。
[root@1oca1.host - ]# ssh -i docker.pem docker@52.14.23.163 Welcome to Docker! ∼$
用 Docker 节点列出 Docker 群中的群节点。
∼ $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS fncv7ducej3ind4u2sy9xtwi7 ip-172-31-34-223.us-east-2.compute.internal. Ready Active Reachable grdeu2x49yi2fmvuy9lmoogqg ip-172-31-43-174.us-east-2.compute.internal Ready Active keOd75qef9bg8t22eqv9spdpm ip-172-31-30-180.us-east-2.compute.internal. Ready Active Reachable m2mmifbrnjbdriub5r36zxyjc * ip-172-31-8-11.us-east-2.compute.internal Ready Active Leader qenbfrmsOxv7wom6wpw9yspw4 ip-172-31-27-178.us-east-2.compute.ìnternal Ready Active tipzy29hgh3m6og5bzkgsego8 ip-172-31-12-37.us-east-2.compute.internal Ready Active v4xdl4jvthovrzsamujoxy3ju ip-172-31-7-219.us-east-2.compute.internal Ready Active vuq68yex58vzgx3audj3sm23a ip-172-31-28-182.us-east-2.compute.internal Ready Active
部署 Docker 群服务
接下来,我们部署一个 Hello World 服务,它将被托管在一个网站上。在管理器实例上为 DockerSwarm-1 Swarm 运行以下命令,创建一个 tutum/hello-world 服务,在主机节点的端口 8080 公开两个副本。
docker service create \ --name hello-world \ --publish 8080:80 \ --replicas 2 \ tutum/hello-world
创建了一个具有两个服务任务的 Docker 服务。
∼ $ docker service create \ > --name hello-world \ > --publish 8080:80 \ > -- replicas 2 \ > tutum/hello-world vn5fl8h7t65sjwk54dwcoklhu ∼ $ docker service 1s ID NAME MODE REPLICAS IMAGE vn5tl8h7t65s hello-world replicated 2/2 tutum/hello-world:latest ∼ $ docker service ps hello-world ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ac9ks5y9duni2 hello-world.l tutum/hello-wor1d:latest ip-172-31-19-220.us-west-2.compute.internal Running Running 13 seconds ago 8s6r48wUui9 hello-world.2 tutum/hello-world:latest ip-172-31-24-250.us-west-2.compute.internal Running Running 13 seconds ago Scale the service to 10 replicas to provide load distribution. Subsequently, list the services to list 10/10 replicas as running.∼ $ docker service scale hello-world=10 hello-world scaled to 10 ∼ $ docker service ls ID NAME MODE REPLICAS IMAGE vn5U8h7t65s hello-world replicated 10/10 tutum/hello-world:latest ∼ $
10 个服务任务副本跨群节点进行调度,如图 13-8 所示。

图 13-8。
Service tasks scheduled across the Swarm nodes
从 EC2 仪表板获取第一个 Docker 群组的负载均衡器 DNS,如图 13-9 所示。

图 13-9。
Docker Swarm load balancer
在 web 浏览器中访问 <DNS>:<LoadBalancerPort> 处的服务,如图 13-10 所示;负载均衡器端口设置为 8080,该端口用于公开服务。

图 13-10。
Accessing the service in a browser
类似地,对于第二个 Docker Swarm,创建一个 tutum/hello-world 服务,将发布端口设置为 8080。将服务扩展到 10 个副本,以便在整个集群中分配负载。
S docker service create \ > --name hello-world \ > --publish 8080:80 \ ,> --replicas 2 \ > tutum/hello-world woqx2ltuibv53ctmuvssrsq8j ∼ $ docker service ls ID NAME MODE REPLICAS IMAGE woqx2ltuibv5 hello-world replicated 2/2 tutum/hello-world:latest ∼ $ docker service ps hello-world NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ny9ermdgb7a4 hello-world.1 tutum/hello-world:latest ip-172-31-34-223.us-east-2.compute.internal Running Running 15 seconds ago 5w3thlgleinme hello-world.2 tutum/hello-world:latest ip-172-31-30-180.us-east-2.compute.internal Running Running 15 seconds ago ∼ $ docker service scale hello-world=10 hello-world scaled to 10
服务副本分布在群节点上,如图 13-11 所示。

图 13-11。
Service replicas distributed across the Swarm
获取第二个集群的弹性负载均衡器的 DNS,如图 13-12 所示。

图 13-12。
Obtaining the DNS name for the Swarm ELB
在 web 浏览器中访问 <DNS>:<LoadBalancerPort> 处的服务,如图 13-13 所示。

图 13-13。
Accessing the service in a browser
创建亚马逊路线 53
Amazon Route 53 是一个高度可用和可扩展的云域名服务(DNS ) web 服务,它将用户请求连接到运行在 AWS 上的基础设施,包括 Amazon EC2 实例、负载均衡器和 Amazon S3 存储桶。我们已经使用 Docker AWS 托管服务创建了两个托管相同 Docker 服务的 Docker 群组,该服务会自动为每个 Docker 群组创建一个 AWS ELB。
在本节中,我们创建一个 Amazon Route 53,将用户对 nosqlsearch.com 域的请求路由到两个 Docker 集群的弹性负载均衡器。在 Amazon Route 53 中,我们创建了两个资源记录集,指向为故障转移配置的两个不同的 elb,其中一个 elb 是主资源记录集,另一个是辅助资源记录集。
当在 web 浏览器中打开 nosqlsearch.com 域时,路由 53 将请求路由到主资源记录集。如果主记录集失败,Route 53 将用户请求路由到辅助记录集,实际上提供了托管在 nosqlsearch.com 域上的 Hello World Docker 服务的高可用性。要创建 AWS 路线 53,从 AWS 服务中选择路线 53,如图 13-14 所示。

图 13-14。
Selecting the Amazon Route 53 service
创建托管区域
托管区域是一种配置,用于确定如何路由互联网上某个域的流量。要创建托管区域,在网页浏览器中打开 https://console.aws.amazon.com/route53/ ,在 DNS 管理中点击创建托管区域,如图 13-15 所示。

图 13-15。
Creating the hosted zone
或者,选择托管区域或在浏览器中打开 https://console.aws.amazon.com/route53/home#hosted-zones ,点击创建托管区域,如图 13-16 所示。

图 13-16。
Creating a hosted zone
再次点击创建托管区域,如图 13-17 所示。

图 13-17。
Creating a hosted zone
在创建托管区域对话框中,指定域名( nosqlsearch.com )。域名必须向用户注册。类型选择公共托管区域,如图 13-18 所示。

图 13-18。
Configuring the hosted zone
创建一个新的公共托管区域,如图 13-19 所示。托管区域的名称服务器(默认情况下有四个) 已分配。

图 13-19。
The new public hosted zone
配置名称服务器
接下来,我们需要通过域名注册机构来配置域名服务器。不同的域名注册商配置域名服务器的程序是不同的,但是应该提供一个为域名添加区域记录的选项。
将记录类型指定为名称服务器,如图 13-20 所示。将主机指定为 @ 。每个区域记录应该指向一个名称服务器,该服务器可以从我们之前创建的公共托管区域获得。

图 13-20。
Adding a name server record
为要创建托管区域的域添加四台名称服务器(统称为委托集),如图 13-21 所示。

图 13-21。
Name servers configured on a domain
创建资源记录集
创建和配置托管区域后,创建一个或多个资源记录集。资源记录集是用于将流量路由到域的域名系统(DNS) 配置。点击创建记录集,创建一个资源记录集,如图 13-22 所示。

图 13-22。
Creating a record set
在创建记录集选项卡中,类型应设置为–IP v4 地址,如图 13-23 所示。每个记录集的名称都以域名结尾。为别名选择是。

图 13-23。
Configuring a record set
接下来,选择别名目标作为其中一个 Docker 集群的 AWS 弹性负载均衡器 DNS,如图 13-24 所示。

图 13-24。
Selecting an alias target
接下来,选择路由策略,如图 13-25 所示。

图 13-25。
Selecting a routing policy
为路由策略选择故障转移。这将配置 DNS 故障转移,如图 13-26 所示。选择故障转移记录类型为主记录类型。

图 13-26。
Selecting failover record type
对于评估目标健康,选择是,如图 13-27 所示。

图 13-27。
Selecting the Evaluate Target Health option
对于关联健康检查,选择否,点击创建,如图 13-28 所示。

图 13-28。
Creating a record set
创建一个主记录集,如图 13-29 所示; 主要 意味着网站流量将首先被路由到记录集。

图 13-29。
Primary record set
要创建辅助记录集,再次点击创建记录集,如图 13-30 所示。

图 13-30。
Creating another record set
选择类型为–IP v4 地址,并为别名选择是。选择别名目标作为第二个 ELB DNS,如图 13-31 所示。

图 13-31。
Selecting an alias target
选择故障转移路由策略和辅助故障转移记录类型,如图 13-32 所示。

图 13-32。
Selecting failover record type as secondary
为评估目标健康状况选择是,为与健康状况检查关联选择否。点击创建,如图 13-33 所示。

图 13-33。
Creating a secondary record set
创建辅助记录集; 次要 意味着如果主要记录集出现故障,流量将被路由到该记录集,如图 13-34 所示。点击返回托管区域。

图 13-34。
Secondary record set is created
域( nosqlsearch.com ) 配置了四个记录集,如图 13-35 所示。

图 13-35。
Hosted zone created
测试高可用性
接下来,我们测试我们配置的高可用性。在 web 浏览器中打开域,包括服务发布端口( nosqlsearch.com:8080 ),如图 13-36 所示。应该会显示 Docker 服务输出。

图 13-36。
Invoking a service in a browser
为了测试高可用性,删除与主记录集关联的 Docker Swarm 的 CloudFormation 栈,如图 13-37 所示。

图 13-37。
Deleting a stack
在删除栈对话框中单击是,删除。栈应该开始被删除,如图 13-38 中的 DELETE_IN_PROGRESS 状态所示。

图 13-38。
The delete is in progress
DNS 故障转移到二级资源记录集,域继续服务 Docker 服务,如图 13-39 所示。

图 13-39。
Domain continues to serve
如果请求被转发到不同的服务任务副本,浏览器中的主机名可能会变得不同,如图 13-40 所示。但是无论是否启动了故障转移,主机名也可能变得不同,因为入口负载均衡器在不同的服务副本之间分配流量。

图 13-40。
Different hostname
删除托管区域
在删除托管区域之前,必须删除与托管区域关联的所有资源记录集。选择要删除的资源记录集,点击【删除记录集】,如图 13-41 所示。

图 13-41。
Deleting the record sets
在确认对话框中点击确认,如图 13-42 所示。

图 13-42。
Confirmation dialog
点击返回托管区域,如图 13-43 所示。

图 13-43。
Going back to the hosted zones
选择要删除的托管区域,点击删除托管区域,如图 13-44 所示。

图 13-44。
Deleting a hosted zone
在确认对话框中点击确认,如图 13-45 所示。

图 13-45。
Confirmation dialog for deleting a hosted zone
托管区域被删除。
摘要
本章使用 Amazon Route 53 托管区域开发了一个高度可用的网站。首先,我们使用 Docker for AWS 托管服务创建了两个 Docker 群组,并在每个群组上部署了相同的 Docker 服务。每个 Docker 群服务可以使用由 Docker for AWS 自动创建的 Docker 群的 AWS 弹性负载均衡器来访问。路由 53 托管区域将为域创建一个托管区域,以将流量路由到在主/辅助故障转移模式中配置的 DNS。随后,我们测试了如果主记录集的 Docker Swarm 关闭,网站仍然可用,因为托管区域会将流量路由到辅助 ELB DNS。在下一章,我们将讨论在 Docker Cloud 中使用 Docker Swarm 模式。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论