<$>[注]
注:这是导航员指南书的内容的早期版本,这是数字海洋解决方案工程师的报价。本书的目的是帮助企业客户规划他们的基础设施需求,提供沿途的工作示例,并包括技术细节和为什么
使一些决定比其他更好。
该书和附加代码将在GitHub存储库中公开获取,因为这是一个早期版本,该书尚未完成,存储库尚未公开,但保持定制! <$>
无论你是运行一个小博客,一个大应用程序,还是一个API,都无关紧要,你永远不想让它离线。
单点故障是您的基础设施的任何部分,如果故障,会导致停机时间。一个例子是使用一个服务器来托管您的网页服务器和数据库。
高可用性基础设施没有一个单一的故障点,这通常意味着您的基础设施是由服务分开的,并在多个服务器上运行每个服务。如果一个服务器失败,则有其他服务器可处理请求。
想象一个网站服务托管你的文件. 现在想象它在三个独立的服务器上运行。 我们有一些即时问题. 用户将如何访问这些服务器? 我们可以为每个独立的服务器添加DNS记录。
我们可以通过将负载平衡器添加到我们的基础设施来避免这些陷阱。负载平衡器将对其配置中的每个服务器进行健康检查。如果服务器离线,负载平衡器将不会向其发送任何用户请求。
我们在执行此添加时会有一个额外的担忧是确保负载平衡器本身不是一个单一的故障点,我们已经考虑到这一点,并且有两个完整的解决方案,在负载平衡器层和后端服务器上非常可用。
我们的设置
在本章中,我们将探讨两种方法来部署一个负载平衡解决方案,使用几个Web服务器. 在本节(章节4 - 6),我们将有多个负载平衡器设置在Web和数据库服务前面,确保我们没有单一的故障点。
设置负载平衡有几种不同的方法,我们将通过两个示例设置,两者都在后端提供 Nginx Web 服务。
第一个解决方案使用了 DigitalOcean Load Balancers,这是一个高度可用的服务,自动处理故障恢复,它们还包括基于 标签而不是手动列表的流量指向 Droplets的能力,简化您的扩展。
第二种解决方案是使用 HAProxy 和 DigitalOcean Reserved IPs的更定制的负载平衡解决方案,这些是静态的 IP 地址,可以通过控制面板或 API 自动在一个区域内分配和重新分配。
因为这是我们第一次在本书中使用Terraform和Ansible,我们将通过这个部分手动一些,为您提供手动创建自己的项目的经验.随着我们在下一章中向更复杂的设置前进,我们将自动化大多数配置。
使用数字海洋负载平衡器
设置数字海洋负载平衡器
在控制器 Droplet 上,移动到我们的存储库中的本章目录(https://github.com/digitalocean/navigators-guide/tree/master/example-code/02-scale/ch04/digitalocean_loadbalancer)。
1cd /root/navigators-guide/example-code/02-scale/ch04/digitalocean_loadbalancer
在此目录中,有 a terraform.tfvars.sample
文件. 此样本文件包含评论和注释,以帮助您找到所需的信息。
1do_token = ""
2
3project = "DO-LB"
4
5region = "sfo2"
6
7image_slug = "debian-9-x64"
8
9keys = ""
10
11private_key_path = ""
12
13ssh_fingerprint = ""
14
15public_key = ""
这将创建一个DigitalOcean负载平衡器以及运行 Nginx 的几个Dropplets,每个Web服务器将显示一个简单的欢迎消息,其中包含每个Dropplets的主机名称。
按照评论中的说明填写变量,然后将文件更名为 terraform.tfvars
。
1mv terraform.tfvars.sample terraform.tfvars
此配置不需要 TLS 证书,但可以添加到 DigitalOcean 负载平衡器中。 DigitalOcean 负载平衡器功能还与 Let's Encrypt 集成,可免费提供证书。
接下来,准备并执行Terraform部署。 首先,使用terraform init
分析计划文件和模块。 可选的是,您可以运行terraform plan
来查看当您运行实际脚本时会发生什么。
1terraform init
2terraform apply
您需要通过输入是
来确认执行,并在申请完成后通知您。
在此时,您可以在浏览器中访问 Load Balancer 的公共 IP 地址(您可以通过terraform 显示
获取)以查看您的 Web 服务器的示例内容。
您可以使用此工作流程进行快速测试,但请记住,将删除任何存储到集群的数据。 **破坏
选项将删除您的集群。
在你拆除这个示例集群之前,让我们测试它是否像我们预期的那样非常可用。
测试集群可用性
为了测试后端 Web 服务器的可用性,我们可以将一个服务器脱机,同时不断向负载平衡器请求连接。如果连接继续进行,我们会知道服务在服务器故障的情况下保持在线(我们无法测试负载平衡器本身的故障,因为它作为服务运行,这意味着您没有或需要直接访问其个别组件)。
在终端中运行下面的命令,它将每秒连接到负载平衡器一次。
1while true; do curl -k load_balancer_ip; sleep 1; done
你会看到这样的连续输出:
1Welcome to DO-LB-backend-01!
2Welcome to DO-LB-backend-02!
3Welcome to DO-LB-backend-03!
4Welcome to DO-LB-backend-01!
5Welcome to DO-LB-backend-02!
6Welcome to DO-LB-backend-03!
尝试关闭一个后端 Droplets. 使用 Droplet 离线,你仍然应该看到测试从你的其他负荷平衡器的后端返回有效响应. 你会注意到你关闭的 Droplet 不再响应。
(如果您需要帮助阻止运行测试,您可以使用键盘命令CTRL-C
离开循环)
扩展群集
初始集群设置使用3个后端Dropplets。后端Dropplets数量的设置是在变量.tf 文件中的默认变量声明中。我们可以通过将一个行添加到 terraform.tfvars
并将变量 node_count
设置为 5。
1terraform apply
它处理了基于这种变量改变 Droplets 数量的逻辑,因此它会自动创建或摧毁 Droplets 随着 node_count
变量增加或减少。
在运行弯曲
的终端到您的负载平衡器,看看输出. 一旦新的Droplets提供,你会看到他们自动开始响应。
1Welcome to DO-LB-backend-02!
2Welcome to DO-LB-backend-03!
3Welcome to DO-LB-backend-01!
4Welcome to DO-LB-backend-02!
5Welcome to DO-LB-backend-03!
6Welcome to DO-LB-backend-04!
7Welcome to DO-LB-backend-05!
8Welcome to DO-LB-backend-01!
9Welcome to DO-LB-backend-02!
10Welcome to DO-LB-backend-03!
11Welcome to DO-LB-backend-04!
12Welcome to DO-LB-backend-05!
13Welcome to DO-LB-backend-01!
在继续前,您将想要摧毁这个测试项目 Terraform 将计划的当前状态保存在当前工作目录中. 当您通过 Terraform 摧毁资源时,它将自动清除该状态。
1terraform destroy
使用 HAProxy 和 DigitalOcean 保留 IP 地址
部署自定义负载平衡解决方案可能是正确的选择. 有一些选项是DigitalOcean Load Balancer目前不支持的. 此类例子包括托管多个网站或应用程序,如后端,多个TLS证书,代理协议支持或特定的TCP参数调节。
此示例使用 HAProxy v1.8 负载平衡器,使用 DigitalOcean Reserved IP 来分组。
安裝 HAProxy
在控制器 Droplet 上,移动到我们的存储库中的本章目录(https://github.com/digitalocean/navigators-guide/tree/master/example-code/02-scale/ch04/haproxy_loadbalancer)。
1cd /root/navigators-guide/example-code/02-scale/ch04/haproxy_loadbalancer
在此目录中,有 a terraform.tfvars.sample
文件. 此样本文件包含评论和注释,以帮助您找到所需的信息。
1do_token = ""
2
3project = "HAPROXY-LB"
4
5region = "sfo2"
6
7image_slug = "debian-9-x64"
8
9keys = ""
10
11private_key_path = ""
12
13ssh_fingerprint = ""
14
15public_key = ""
按照评论中的说明填写变量,然后将文件更名为 terraform.tfvars
。
1mv terraform.tfvars.sample terraform.tfvars
接下来,准备并执行Terraform部署。 首先,使用terraform init
分析计划文件和模块。 可选的是,您可以运行terraform plan
来查看当您运行实际脚本时会发生什么。
1terraform init
2terraform apply
您需要通过输入是
来确认执行,并在申请完成后通知您。
如果您现在运行terraform 显示
,您可以看到所部署的资源. 每个资源集(即 Droplets)都按 Terraform 配置文件中的资源名称放置在组名中。
三个组为load_balancer
用于HAProxy,web_node
用于Nginx,以及fip
用于保留IP.您可以使用terraform-inventory -inventory
来获取INI格式的Ansible库存,或使用-list
选项输出JSON。
在此时,您需要的 Droplets 已经创建并运行,但它们仍然需要配置。
使用 Ansible 配置 Droplets
我们将使用 Ansible 自动配置 Droplets. 我们有一个基本的 Ansible 播放本,它已预先配置以下载几个 Ansible 角色. 你会发现这些 Ansible 角色列在 the requirements.yml
文件中)。你不需要单独安装它们;你可以使用 Ansible Galaxy 下载所需的角色。
此命令将角色放置在角色
目录中。
1ansible-galaxy install -r requirements.yml
我们将回到 /root/navigators-guide/example-code/02-scale/ch04/haproxy_loadbalancer/group_vars/load_balancer/ 目录. 如果您查看现有的 vars.yml 文件,您将看到 do_token
和 ha_auth_key
分别被分配到 vault_do_token
和 vault_ha_auth_key
的值。
在设置变量之前,您需要两件事:一个用于处理故障场景的保留IP分配的DigitalOcean API代币,以及一个用于验证集群成员的SHA-1哈希。
1cd /root/navigators-guide/example-code/02-scale/ch04/haproxy_loadbalancer/
2./gen_auth_key
一旦 auth_key 被创建,继续创建 group_vars/load_balancer/vault.yml 文件。
1---
2vault_do_token: "79da2e7b8795a24c790a367e4929afd22bb833f59bca00a008e2d91cb5e4285e"
3vault_ha_auth_key: "c4b25a9f95548177a07d425d6bc9e00c36ec4ff8"
这些密钥的安全性和保密性对我们的基础设施至关重要,我们希望限制谁可以查看或编辑这个 vault.yml 文件。
使用此命令来加密文件:
1ansible-vault encrypt vault.yml
此过程会提示您发送密码. 每次我们运行 Ansible 播放簿,我们也会被要求发送此密码. 如果您需要编辑加密文件,您需要通过 ansible-vault
进行编辑。 对于 Ansible Vault 的 文档 提供了该功能的所有功能的完整列表。
1ansible-vault edit vault.yml
Ansible 将每次运行我们的播放簿都需要解密密码,这对于自动化来说并不理想,我们可以存储密码在我们的系统中其他地方,这使我们能够通过添加权限控制来保护它。 为了创建一个存储密码的文件,您可以执行echo
password > ~/.vaultpass.txt
或使用文本编辑器来手动创建该文件。 您可以确认非特权用户对该文件没有任何访问权限。 Uncomment `vault_password_file’ 行在 /root/navigators-guide/example-code/02-scale/ch04/haproxy_balancer/ansible.cfg 配置文件中。 这将阻止 Ansible 每次运行播放簿时请求您的保密密码。 您也可以
现在我们已经准备好执行主 Ansible 播放簿了。 回到存储库的根部,然后执行 ansible-playbook -i /usr/local/bin/terraform-inventory site.yml
. 再次,您将开始在屏幕上看到一个文本流,显示当前正在运行的角色,目前正在执行的角色任务,以及是否发现了更改或错误。 在播放结束时,您将看到一个播放复制片,每个主机的所有总数看起来像这样:
1PLAY RECAP *********************************************************************
2138.68.50.232 : ok=1 changed=0 unreachable=0 failed=0
3159.65.78.225 : ok=1 changed=0 unreachable=0 failed=0
4165.227.9.176 : ok=40 changed=38 unreachable=0 failed=0
5178.128.128.168 : ok=1 changed=0 unreachable=0 failed=0
6178.128.3.35 : ok=40 changed=38 unreachable=0 failed=0
7206.189.174.220 : ok=1 changed=0 unreachable=0 failed=0
现在你可以转到你的网站,在我们的情况下,一个简单的HTML页面,通过访问你的保留IP地址或你可以 添加域指向保留IP地址。
测试集群可用性
为了测试后端 Web 服务器的可用性,我们可以使用一个离线服务器,同时不断请求负载平衡器的连接。
在终端中运行下面的命令,它将每秒连接到负载平衡器一次。
1while true; do curl -k reserved_ip; sleep 1; done
你会看到这样的连续输出:
1Welcome to HAPROXY-LB-backend-01!
2Welcome to HAPROXY-LB-backend-02!
3Welcome to HAPROXY-LB-backend-03!
4Welcome to HAPROXY-LB-backend-01!
5Welcome to HAPROXY-LB-backend-02!
6Welcome to HAPROXY-LB-backend-03!
尝试关闭后端 Droplets 之一. 使用 Droplet 离线,您仍然应该看到 Curl 从其他 Load Balancer 后端返回有效响应. 您会注意到您关闭的 Droplets 不再响应。
如果测试仍在运行,请关闭主HAProxy Droplet,您将看到保留IP地址在几次丢失请求后重定向到次要HAProxy Droplet。
(如果您需要帮助阻止运行测试,您可以使用键盘命令CTRL-C
离开循环)
扩展群集
初始集群设置使用3个后端Droplets。后端Droplets的数量设置是在变量.tf 文件中的默认变量声明中。
1terraform apply
它处理了基于这种变量改变 Droplets 数量的逻辑,因此它会自动创建或摧毁 Droplets 随着 node_count
变量增加或减少。
随着资源计数的每一次变化,您将需要再次运行 Ansible 与您的 Droplets,以配置您的后端 Droplets 并修改 HAProxy 的配置。
1ansible-playbook -i /usr/local/bin/terraform-inventory site.yml
在运行弯曲
的终端到您的负载平衡器,看看输出. 一旦新的Droplets提供,你会看到他们自动开始响应。
1Welcome to HAPROXY-LB-backend-02!
2Welcome to HAPROXY-LB-backend-03!
3Welcome to HAPROXY-LB-backend-01!
4Welcome to HAPROXY-LB-backend-02!
5Welcome to HAPROXY-LB-backend-03!
6Welcome to HAPROXY-LB-backend-04!
7Welcome to HAPROXY-LB-backend-05!
8Welcome to HAPROXY-LB-backend-01!
9Welcome to HAPROXY-LB-backend-02!
10Welcome to HAPROXY-LB-backend-03!
11Welcome to HAPROXY-LB-backend-04!
12Welcome to HAPROXY-LB-backend-05!
13Welcome to HAPROXY-LB-backend-01!
完成后,您可以清理使用破坏
创建的 Terraform 资源,当您以这种方式破坏集群时,您将失去所有数据。
1terraform destroy
什么是下一步?
我们采用了一个简单的Web应用程序,并通过在多个Dropplets上运行并将流量与两种不同类型的负载平衡器直接导向,使其高度可用。
在下一章中,我们将扩展这些概念,以涵盖如何维护负载平衡器的配置,如何管理您的应用程序和其位置的 Droplets,以及如何处理用户会话,文件存储和数据库。