导航指南:配置管理部署解决方案

<$>[注] :这是导航员指南书的内容的早期版本,这是数字海洋解决方案工程师的报价。本书的目的是帮助企业客户规划他们的基础设施需求,提供沿途的工作示例,并包括技术细节和为什么使一些决定比其他更好。

该书和附加代码将在GitHub存储库中公开获取,因为这是一个早期版本,该书尚未完成,存储库尚未公开,但保持定制! <$>

上一章展示了如何通过在基础设施的网页前端层添加多余性来减少停机时间. 如果您的服务与文件和数据一起工作,您还需要一个集中式的后端 - 它应该同样多余,以避免成为一个单一的故障点。

前端和后端都可以使用负载平衡解决方案来分发流量到多个服务器。这个结构在后端提供了一些独特的优势,例如在不出现停机的情况下更新应用程序代码的能力,支持诸如A/B测试,可口可乐部署和蓝色/绿色部署等东西。然而,这也为您的基础设施增加了一些复杂性。您需要考虑如何维护负载平衡器的配置,如何管理您的应用程序和运行的服务器,以及如何处理用户会话,文件存储和数据库等事情的一致性。

无论您使用的是 DigitalOcean 负载平衡器还是自控负载平衡器,您需要保持其配置的一致性。 使用自控负载平衡器设置的配置管理工具来管理配置文件更实用,需要一些额外的工作,而 DigitalOcean 负载平衡器是一个自动处理负载平衡器冗余的管理服务。

对于DigitalOcean Load Balancers,配置选项是简化的,但您仍然需要确保设置是正确的和一致的。使用Droplet标签来确定Load Balancer的后端是最直接的成功之路,因为它允许您自动添加和删除Droplets(而不是单独的IP),这意味着您的配置只能由Terraform处理而无需Ansible。

如果你的负荷平衡要求更复杂,你可能选择使用自己的负荷平衡器(与HAProxy,如上一章,或其他负荷平衡软件)。

我们的设置

当您的后端可以从任何一个多个服务器中提供服务时,您需要确保每个服务器都有访问相同的一致数据集,或者某个特定会话将继续连接到特定服务器。

我们将用此作为一个机会来展示更强大的配置管理软件的使用。在我们托管运行WordPress的网站的例子中,我们将不得不决定如何确保集群中的每个节点都有正确的数据。最终用户需要有一个一致的体验,无论节点在处理请求的哪个节点。

通过配置来确保一致性,我们将审查三个相关组件:用户会话、文件存储和数据库。

了解配置

实际上,在配置完成后,建立群集是一个相对较短的过程,但了解配置和其中决策是能够将这些模式应用到自己的基础设施的关键。

负载平衡器配置

数字海洋负载平衡器

如同之前的章节,我们将使用Terraform来管理负载平衡器配置。下面的条目创建了一个负载平衡器,并提供后端Droplet标签,转发规则,使用的TLS证书,以及负载平衡器将使用的健康检查。

以下是位于 example-code/02-scale/ch05/init_deploy/main.tf 文件中的资源块:

 1...
 2
 3resource "digitalocean_loadbalancer" "public" {
 4  name                   = "${var.project}-lb"
 5  region                 = "${var.region}"
 6  droplet_tag            = "${digitalocean_tag.backend_tag.id}"
 7  redirect_http_to_https = true
 8  depends_on             = ["digitalocean_tag.backend_tag"]
 9
10  forwarding_rule {
11    entry_port     = 80
12    entry_protocol = "http"
13
14    target_port     = 80
15    target_protocol = "http"
16  }
17
18  healthcheck {
19    port                     = 80
20    protocol                 = "http"
21    path                     = "/"
22    check_interval_seconds   = 5
23    response_timeout_seconds = 3
24    unhealthy_threshold      = 2
25    healthy_threshold        = 2
26  }
27}

由于负载平衡器是一个服务,而不是一个不可变的资源(如Droplet),对配置参数的更改不会重塑整个负载平衡器;它会立即更新,有关支持的参数和输出属性的更多细节,请参阅 Terraform 文档

我们正在使用DigitalOcean负载平衡器来处理公共网络流量的负载平衡到我们的Web服务器。

HAProxy 集群

如果您需要更复杂的配置,例如访问较低级别的负载平衡设置或支持多个后端服务,您可以设置自己的负载平衡器集群。

Ansible 使用 Jinja2 模板系统,这简化了创建和更新配置文件的过程。 Jinja2 支持在编程语言中找到的变量和控制结构的使用,例如语句、循环、数学操作以及内置过滤器的大型库。

当您的配置发生变化时,有几种方法可以触发更新。如果您的网站的需求变化不大,或者您知道何时会提前发生更改,您可能不需要或不想设置完全自动扩展。

另一种选择是使用 Consul 来发现服务,并在负载平衡器上配置consul 模板,以便自动更新配置文件。

我们正在使用一个HAProxy集群来处理我们的数据库集群的负载平衡。

用户会议

会议评论 **

当用户访问一个通过负载平衡器托管的网站时,没有保证他们的下一个请求将由相同的后端服务器处理。对于简单的静态页面,这不会是一个问题,但如果服务需要对用户的会话的了解(例如如果他们已登录),则需要处理。

您选择处理用户会话的方法取决于您的使用案例。

IP源亲密性将所有请求从同一个IP地址转移到同一个后端,这在用户可能使用NAT连接的路由器后面的情况下不是最好的选择,因为他们都将具有相同的IP地址。

负载平衡器会话和应用程序会话的选项相似,它们都配置负载平衡器以查看 IP 标题信息,以确定向哪个后端发送请求。 与 IP 源亲属方法不同,NAT 背后的用户将被识别为单个用户。

** 文件系统复制** 复制在您的文件系统中存储的会话的路径,使所有后端可以访问所有会话。 考虑的一个关键方面是复制的速度。

使用数据库或内存数据库是相似的。这两者都要求您以一种方式创建您的应用程序,以存储用户会话在数据库或内存缓存中,如Redis。使用数据库可以方便,因为您的应用程序已经设置了以连接到其它数据请求。对于一个非常活跃的网站,这可以使数据库本身变得更高,但它大多数情况下使用,额外的负载是微不足道的。使用内存缓存,如Redis或Memcached意味着您需要创建一些更多的Dropplets,但它们是非常快速和多功能的解决方案,您也可以使用来缓存数据库查询响应以提高性能。

因为WordPress已经配置为会话使用数据库,这就是我们将使用的解决方案。

档案存储

** 文件存储审查:**

您的应用程序所使用的文件需要一致;所有服务器都需要访问相同的资源集合。解决这个问题的一个好方法是将存储功能从您的后端应用程序服务器中分离开来,而不是使用单独的文件存储服务。

与会话一样,您可以使用应用程序节点之间的本地文件系统复制来处理文件存储,但这可以为您的基础设施添加另一个服务,以及额外的配置更改。

一个更简单的解决方案是使用对象存储,如DigitalOcean Spaces,特别是因为WordPress已经有一个DigitalOcean Spaces Sync(https://wordpress.org/plugins/do-spaces-sync/)插件。

数据库

数据库评论(简称)

与文件存储一样,您的数据库需要能够访问所有后端 Droplets. 您在集群中复制数据库插件和更新的方式对于一个功能性集群数据库解决方案至关重要。

此外,您的数据库应该高度可用 - 也就是说,它具有冗余性和自动故障转移,这可能比仅仅将其置于负载平衡器后面更为复杂,因为系统需要处理数据一致性,例如如果对不同节点进行冲突更新时会发生什么。

在我们的示例中,我们使用 MariaDB Galera 集群来处理这些问题。Galera 处理每个数据库节点的同步复制,每个节点都作为一个完整的主要数据库服务器。

对于我们的练习,Galera给了我们最大的好处,因为数据一致性是自动处理的,集群中的每个节点都可以作为一个主要服务器。

WordPress 几乎依靠其数据库做任何事情,一个单一的外部数据库服务器是一个单一的失败点. 数据库集群有几个选项,不同的部分可以混合和匹配,根据您的情况最有效。

在本章中,我们将构建一个在MariaDB上运行的Galera集群,这是一种MySQL的叉子,这将运行在几个HAProxy节点后面,附带一个DigitalOcean Reserved IP。

你可以访问源存储在这里: https://github.com/DO-Solutions/galera-tf-mod. 它设置了TCP路由到群集,其中有三个节点默认情况下. 如果我们使用的节点少于三个节点,一个 Galera Arbitrator节点将被要求避免分裂大脑的情况,并保持群集运行。 您可以增加节点的数量,也可以通过在我们的主要地形文件 _example-code/02-scale/ch05/init_deploy/maintf_添加下列行到模块代码块块。 请注意,您将需要一个奇怪的节点数量,以便群集在执行定数投票时可以拥有多数。 一个例子是如果两个节点认为记录应该存在,而两个节点

1module "sippin_db" {
2...
3   db_node_count = "5"
4}

创建WordPress集群

在我们的项目中,设置WordPress集群只需要几个命令,我们将从/root/navigators-guide/example-code/02-scale/ch05/init_deploy工作到控制Droplet,其中包含本章的示例代码。

从该目录中运行我们提供的初始化脚本,它将引导您通过您需要设置的所有设置和变量。

1./bin/init_config

你可以在 GitHub上查看初始化脚本的代码)。你会看到脚本正在执行很多功能。它真正做的是自动创建必要的Terraform和Ansible变量文件,并确保没有已知的问题。脚本会做的第一件事是请求有效的DigitalOcean API代码。之后,脚本将创建一些用于集群创建所需的独特密钥。您将看到的下一个提示将是命名项目并选择一个区域。如果SSH密钥已经配置(如我们在第4章中所做的),脚本将告诉Terraform使用它。如果SSH密钥尚未配置,则将自动创建并添加到您的DigitalOcean帐户中。最后,脚本将提示任何需要的密码。

一旦脚本完成,Terraform计划和Ansible播放簿已经准备好执行,这与第4章中的示例非常相似,但正在创建和配置更多的资源。

如果你要手动配置所有内容,你需要在 terraform.tvfars文件中输入的变量,在 group_vars文件夹中需要多个文件夹中的变量。

初始化脚本将打印有关如何在退出之前继续使用Terraform的指示,但我们也将通过这里。

首先,运行terraform 计划将在您的 DigitalOcean 帐户中创建以下项目:

一个负载平衡器,将提供访问您的WordPress网站 2三个Dropplets作为WordPress网页节点使用 3个Dropplets作为数据库节点使用 4两个HAProxy负载平衡器节点为数据库集群 5个保留的IP地址为数据库负载平衡器

1terraform plan

接下来,分析计划文件和模块以使用init来准备Terraform部署。

1terraform init

最后,通过DigitalOcean API使用应用来执行创建请求。

1terraform apply

一旦Terraform完成创建所有基础设施组件,使用Ansible来配置它们,有三个Ansible角色可执行:一个用于配置数据库服务器,一个用于配置数据库负载平衡器,一个用于在所有Web节点上设置WordPress。

您可以使用一个命令运行所有三个角色:

1ansible-playbook -i /usr/local/bin/terraform-inventory site.yml

一旦播放簿完成,您将需要完成WordPress的设置。

请访问您的浏览器中的负载平衡器的 IP 地址,并按照屏幕上的说明完成您的 WordPress 配置。

配置空间

我们将使用 DigitalOcean Spaces Sync插件来同步来自WordPress应用程序服务器的媒体文件以存储对象。

DigitalOcean Spaces Sync 插件已预安装作为 Ansible 播放书的一部分. 要使用此插件,您首先需要 使用控制面板创建一个空间

一旦空间被创建,在控制面板的API页面上(https://www.digitalocean.com/docs/spaces/how-to/administrative-access/#access-keys)创建空间访问密钥。在生成密钥后,您将看到主密钥和秘密。注意这些,因为您将需要它们来设置WordPress插件。

现在,回到WordPress,访问插件页面,你应该看到DigitalOcean Spaces Sync已经安装了,感谢我们的Ansible播放书。点击激活链接来激活这个插件。

在此设置页面上,输入您的空间密钥、空间秘密、空间名称(在此设置页面上标记为DO Spaces Container)和终端点,请记住终端将取决于您为您的空间选择的数据中心:例如,NYC3将是https://nyc3.digitaloceanspaces.com

在检查连接后,在完整的URL路径到文件下添加您的空间的完整URL。 对于在纽约州的空间,这将是https://space-name.nyc3.digitaloceanspaces.com(在那里 space-name是您的空间的名称)。 一旦输入,是时候保存您的设置,并通过上传文件来测试插件。

当你上传一个文件在媒体选项卡,你应该看到它自动同步到你的空间. 你可以通过查看空间的文件列表在你的DigitalOcean控制面板来检查这一点。

在生产环境中,我们绝对建议使用CDN,因为这将使您能够快速、可靠地为所有访客提供这些媒体文件。

如果您稍后添加 CDN,请记住,您需要将完整的 URL 路径向文件指向这个新的 CDN 地址。我们还正在开发一个与 Spaces 集成的 CDN。

检查设置

通过在您的浏览器中访问 Load Balancer IP 地址,您可以看到默认的 WordPress 网站,类似于此:

WordPress default installation screenshot

最终的结果是一个功能齐全的WordPress网站,你可以通过配置博客或创建帖子来测试,你可以关闭两个Web服务器,一个HAProxy服务器,一个数据库节点,网站仍然应该完全功能。

一旦测试完成,您可以用一个命令从您的DigitalOcean帐户中删除所有这些基础设施组件,这将删除整个集群来清理该章的工作。

1terraform destroy

您可以重新运行应用,然后重新运行 Ansible 播放簿来再生集群。

什么是下一步?

我們採取了我們的高可用性的例子,並將這個概念應用於整個應用程序堆積中。本章中的例子被用來創建一個完全冗余且可擴展的WordPress網站。這通過利用配置管理工具實現了。在下一章,我們將探索一個方法來進一步自動化和改善我們的部署。本書的其餘部分將涵蓋與儲存、監控和安全相關的概念,但更重要的是,這些概念如何適用於您的業務,以及在計劃您的基礎設施時要考慮什麼。

Published At
Categories with 技术
comments powered by Disqus