介绍
Corosync 是一个开源集群引擎,用于在应用程序中实现高可用性。 通常称为 messaging layer ,Corosync 提供了集群会员和封闭的通信模型,用于创建复制状态机器,像 Pacemaker 这样的集群资源管理器可以运行。
本教程将展示如何使用Corosync和Pacemaker在DigitalOcean上创建高可用性(HA)基础设施,使用CentOS 7服务器和保留IP。
为了遵循这个指南,你将需要:
- 两个CentOS 位于同一数据中心的7个滴滴, 启用了 [私有网络] (https://andsky.com/tech/tutorials/how-to-set-up-and-use-digitalocean-private-networking)
- 一个非根基的sudo用户, 您可以通过遵循 [初始服务器设置] (https://andsky.com/tech/tutorials/initial-server-setup-with-centos-7 ) 教程设置 。
- DigitalOcean API 的个人访问键,您可以通过遵循教程来生成 [如何使用 DigitalOcean API V2] (https://andsky.com/tech/tutorials/how-to-use-the-digitalocean-api-v2)
在创建这些Dropplets时,请使用描述性主机名称来独特地识别它们. 在本教程中,我们将将这些Dropplets称为 主要 和** 次要** 。
当您准备好继续运行时,请确保您已与您的sudo
用户登录到您的两个服务器。
第1步:设置 Nginx
为了加速事情,我们将使用一个简单的 shell 脚本 安装 Nginx 并设置一个包含有关该特定服务器的信息的基本网页。这样,我们可以很容易地识别哪个服务器目前在我们的保留 IP 设置中活跃。该脚本使用 DigitalOcean 的 Metadata 服务来获取 Droplet 的 IP 地址和主机名称。
要执行脚本,请在两个服务器上运行以下命令:
1sudo curl -L -o install.sh http://do.co/nginx-centos
2sudo chmod +x install.sh
3sudo ./install.sh
在脚本完成运行后,通过浏览器的公共 IP 地址访问 Droplet 应该为您提供一个显示 Droplet 的主机名称和 IP 地址的基本网页。
<$>[注]为了减少本教程的复杂性,我们将使用简单的Web服务器作为集群节点。在生产环境中,节点通常会被配置为多余的负荷平衡器。有关负荷平衡器的更多信息,请参阅我们的(https://andsky.com/tech/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts)指南。
步骤 2 — 创建和分配保留IP 第一步是创建保留IP,并将其分配给 主要 服务器。
你应该看到这样的页面:
选择您的 主要 服务器,然后点击分配保留IP
按钮。保留IP分配后,请检查您是否可以通过访问您的浏览器的保留IP地址访问** 主要** Droplet:
1http://your_reserved_ip
您应该看到您的主要 Droplet 的索引页面。 # 步骤 3 — 创建 IP 重新分配脚本 在此步骤中,我们将展示如何使用 DigitalOcean API 将保留的 IP 重新分配到另一个 Droplet。
对于我们的例子,我们将使用一个基本的Python脚本,该脚本将保留IP地址和Droplet ID作为参数,以便将保留IP分配给给定的Droplet。
让我们开始下载assign-ip
脚本并使其可执行。在下载之前,请自由查看脚本的内容。
以下两个命令应在两个服务器(主要和次要)上执行:
1sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip
2sudo chmod +x /usr/local/bin/assign-ip
assign-ip
脚本需要以下信息才能执行:
保留IP :第一个参数为脚本,被分配的保留IP* Droplet ID* :第二个参数为脚本,应该分配的保留IP的 Droplet ID** DigitalOcean API Token* : 作为环境变量 DO_TOKEN传入,您的读/写DigitalOcean个人访问标记
IP 重新分配脚本的测试 为了监控 IP 重新分配的发生,我们可以使用弯曲
命令在循环中访问保留的 IP 地址,每个请求之间间隔为 1 秒。
打开一个新的本地终端并运行以下命令,确保将 reserved_IP_address 替换为您的实际保留 IP 地址:
1while true; do curl reserved_IP_address; sleep 1; done
此命令将继续在活跃的终端中运行,直到被CTRL+C
中断. 它只会检索由服务器托管的网页,您的保留IP目前被分配到。
1[secondary_label Output]
2Droplet: primary, IP Address: primary_IP_address
3Droplet: primary, IP Address: primary_IP_address
4Droplet: primary, IP Address: primary_IP_address
5...
现在,让我们运行assign-ip
脚本来重新分配保留的IP到 二级 滴。我们将使用DigitalOcean的元数据服务来获取当前的Droplet ID,并将其用作脚本的论点。
1curl -s http://169.254.169.254/metadata/v1/id
其中「169.254.169.254」是元数据服务使用的静态IP地址,因此不应修改。
在我们可以执行脚本之前,我们需要设置包含 DigitalOcean API 代币的 DO_TOKEN 环境变量,从 secondary 服务器执行以下命令,并且不要忘记用您的读/写个人访问代币代替 your_api_token 到 DigitalOcean API:
1export DO_TOKEN=your_api_token
仍然在 二级 服务器上,运行assign-ip
脚本,以您的保留IP地址替换 reserved_IP_address:
1assign-ip reserved_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
1[secondary_label Output]
2Moving IP address: in-progress
通过监控本地终端上的弯曲
命令产生的输出,您会注意到保留的IP会改变其分配的IP地址,并在几秒钟后开始指向 次要 滴:
1[secondary_label Output]
2Droplet: primary, IP Address: primary_IP_address
3Droplet: primary, IP Address: primary_IP_address
4Droplet: secondary, IP Address: secondary_IP_address
您也可以从您的浏览器访问保留的 IP 地址. 您应该得到一个显示 二级 Droplet 信息的页面. 这意味着重新分配脚本按照预期工作。
若要将保留的 IP 重新分配到主服务器,请重复 2 步进程,但这一次从 primary Droplet:
1export DO_TOKEN=your_api_token
2assign-ip reserved_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
几秒钟后,保留的 IP 应该再次指向您的主要 Droplet。 # 步骤 4 - 安装 Corosync, Pacemaker 和 PCS 下一步是将 Corosync, Pacemaker 和 PCS 安装在您的 Droplets 上。
在两个服务器上安装软件包:
1sudo yum install pacemaker pcs
PCS 实用程序在安装过程中创建一个新的系统用户,名为 hacluster ,具有禁用密码. 我们需要在两个服务器上为该用户定义密码. 这将使 PCS 能够执行诸如在多个节点上同步 Corosync 配置以及启动和停止集群等任务。
在两个服务器上,运行:
1passwd hacluster
您应该在两个服务器上使用相同的密码,我们将在下一步使用此密码来配置集群。
用户 hacluster 没有与其帐户相关的交互式壳或主目录,这意味着无法使用其凭据登录服务器。
步骤 5 — 设置集群 现在我们已经在两个服务器上安装了 Corosync、Pacemaker 和 PCS,我们可以设置集群。
1sudo systemctl enable pcsd.service
2sudo systemctl start pcsd.service
获取每个节点的私人网络 IP 地址 为了提高网络性能和安全性,节点应使用 私人网络 连接。
1curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo
此命令将简单地输出您登录的 Droplet 的私人网络 IP 地址,您也可以在您的 Droplet 页面上找到此信息,在 DigitalOcean 控制面板(在 Settings 选项卡下)。
從兩個 Droplets 收集私人網路 IP 地址以進行下一步步驟。 #### 驗證集群節點 使用使用使用者名稱 hacluster 和您在步驟 3 中定義的相同密碼驗證集群節點。
1sudo pcs cluster auth primary_private_IP_address secondary_private_IP_address
你应该得到这样的输出:
1[secondary_label Output]
2Username: hacluster
3Password:
4primary_private_IP_address: Authorized
5secondary_private_IP_address: Authorized
在主服务器上生成 Corosync Configuration Still,使用以下命令生成 Corosync 配置文件:
1sudo pcs cluster setup --name webcluster \
2primary_private_IP_address secondary_private_IP_address
结果应该是这样的:
1[secondary_label Output]
2Shutting down pacemaker/corosync services...
3Redirecting to /bin/systemctl stop pacemaker.service
4Redirecting to /bin/systemctl stop corosync.service
5Killing any remaining services...
6Removing all cluster configuration files...
7primary_private_IP_address: Succeeded
8secondary_private_IP_address: Succeeded
9Synchronizing pcsd certificates on nodes primary_private_IP_address, secondary_private_IP_address...
10primary_private_IP_address: Success
11secondary_private_IP_address: Success
12
13Restaring pcsd on the nodes in order to reload the certificates...
14primary_private_IP_address: Success
15secondary_private_IP_address: Success
这将生成位于 /etc/corosync/corosync.conf
位置的新配置文件,基于对 pcs cluster setup
命令提供的参数。我们在本示例中使用了 webcluster 作为集群名称,但您可以使用您选择的名称。
1sudo pcs cluster start --all
1[secondary_label Output]
2primary_private_IP_address: Starting Cluster...
3secondary_private_IP_address: Starting Cluster...
现在,您可以通过在任何服务器上运行以下命令来确认两个节点已加入集群:
1sudo pcs status corosync
1[secondary_label Output]
2Membership information
3----------------------
4 Nodeid Votes Name
5 2 1 secondary_private_IP_address
6 1 1 primary_private_IP_address (local)
要获取有关集群当前状态的更多信息,您可以运行:
1sudo pcs cluster status
结果应该是这样的:
1[secondary_label Output]
2Cluster Status:
3 Last updated: Fri Dec 11 11:59:09 2015 Last change: Fri Dec 11 11:59:00 2015 by hacluster via crmd on secondary
4 Stack: corosync
5 Current DC: secondary (version 1.1.13-a14efad) - partition with quorum
6 2 nodes and 0 resources configured
7 Online: [ primary secondary ]
8
9PCSD Status:
10 primary (primary_private_IP_address): Online
11 secondary (secondary_private_IP_address): Online
现在您可以启用corosync
和pacemaker
服务,以确保它们在系统启动时启动。
1sudo systemctl enable corosync.service
2sudo systemctl enable pacemaker.service
禁用STONITH STONITH(射击头部的其他节点)是一种围栏技术,旨在防止在集群中不响应但仍然访问应用数据的故障节点引起的数据损坏,因为它的配置取决于本指南范围之外的一些因素,我们将在集群设置中禁用STONITH。
若要禁用 STONITH,请在主要或次要的 Droplets 中运行下列命令:
1sudo pcs property set stonith-enabled=false
^ 第6步 — 创建所保留的IP 重分配资源代理 唯一要做的是配置资源代理,当一个集群节点检测出失败时执行 IP 重分配脚本. 资源代理负责创建集群与资源本身之间的接口. 就我们而言,资源是指定脚本。 集群依赖资源代理在给定启动,停止或监视命令时执行正确的程序. 资源代理有不同类型,但最常见的是OCF(开放式集群框架)标准.
我们将创建一个新的OCF资源代理来管理两个服务器上的 assign-ip 服务。
首先,创建包含资源代理的目录. 目录名称将被 Pacemaker 用作此自定义代理的标识符。
1sudo mkdir /usr/lib/ocf/resource.d/digitalocean
接下来,下载FloatIP资源代理脚本并将其放置在新创建的目录中,在两个服务器上:
1sudo curl -L -o /usr/lib/ocf/resource.d/digitalocean/floatip http://do.co/ocf-floatip
现在,使用以下命令在 两个服务器上 执行脚本:
1sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip
我们仍然需要在集群中注册资源代理,使用PCS实用程序。下列命令应该从一个节点中执行(不要忘记用您的DigitalOcean API代码代替 your_api_token,并用您的实际保留IP地址代替 reserved_IP_address):
1sudo pcs resource create FloatIP ocf:digitalocean:floatip \
2 params do_token=your_api_token \
3 reserved_ip=reserved_IP_address
该资源现在应该在集群中注册并活跃,您可以通过pcs status
命令从任何节点检查注册的资源:
1sudo pcs status
1[secondary_label Output]
2...
32 nodes and 1 resource configured
4
5Online: [ primary secondary ]
6
7Full list of resources:
8
9 FloatIP (ocf::digitalocean:floatip): Started primary
10
11...
步骤7 — 测试故障 您的集群现在应该准备好处理节点故障. 测试故障的简单方法是重新启动当前在您的保留IP设置中活跃的服务器。
再次,让我们通过在循环中使用弯曲
命令来监控IP重新分配,从本地终端运行:
1while true; do curl reserved_IP_address; sleep 1; done
从 primary 服务器运行重启命令:
1sudo reboot
几秒钟后,主服务器应该变得不可用,这将导致二级服务器作为活跃节点来接管,你应该在本地终端中看到类似的输出运行弯曲
:
1[secondary_label Output]
2...
3Droplet: primary, IP Address: primary_IP_address
4Droplet: primary, IP Address: primary_IP_address
5curl: (7) Failed connect to reserved_IP_address; Connection refused
6Droplet: secondary, IP Address: secondary_IP_address
7Droplet: secondary, IP Address: secondary_IP_address
8…
<$>[注意] 连接被拒绝
错误发生时,请求是在 IP 重新分配发生之前或在同一时间进行时。
如果您想将保留的 IP 指向主节点,同时在次节点上测试故障,只需重复这个过程,但这一次从 次节点 :
1sudo reboot
结论
在本指南中,我们看到了如何与 Corosync、Pacemaker 和 PCS 一起使用 Reserved IPs,在 CentOS 7 服务器上创建一个高度可用的 Web 服务器环境。