介绍
Corosync是用于在应用程序中实现高可用性的开源集群引擎。 通常被称为一个消息层 ,Corosync为创建复制的状态机,其上的类似Pacemaker的群集资源管理器可以运行顶部的群集成员和封闭的通信模式。 Corosync可以看作是将集群节点连接在一起的基础系统,而Pacemaker监视集群并在发生故障时采取行动。
本教程将演示如何使用Corosync和Pacemaker在具有CentOS 7服务器和浮动IP的DigitalOcean上创建高可用性(HA)基础架构。 为了便于设置和管理集群节点的过程,我们将使用PCS,一个与Corosync和Pacemaker交互的命令行界面。
先决条件
为了遵循本指南,您将需要:
- 两个CentOS 7Droplet位于同一个数据中心,与专用网络启用
- 非根Sudo用户,您可以通过下面的设置初始服务器设置教程
- 一个个人访问令牌DigitalOcean API,你可以通过下面的教程产生如何使用API DigitalOcean V2
创建这些Droplet时,请使用描述性主机名来唯一标识它们。 在本教程中,我们将把这些Droplet的小学和中学 。
当你准备好继续前进,确保你登录到这两个服务器的与你的sudo
用户。
第1步 - 设置Nginx
为了加快速度,我们将使用一个简单的shell脚本 ,它安装的Nginx并设置包含有关特定服务器信息的基本的网页。 这样,我们可以轻松地识别我们的浮动IP设置中当前处于活动状态的服务器。 该脚本使用DigitalOcean的元数据服务来获取Droplet的IP地址和主机名。
为了执行脚本,请在两个服务器上运行以下命令:
sudo curl -L -o install.sh http://do.co/nginx-centos
sudo chmod +x install.sh
sudo ./install.sh
在脚本完成运行后,通过浏览器的公共IP地址访问Droplet应该给你一个基本的网页,显示Droplet的主机名和IP地址。
为了减少本教程的复杂性,我们将使用简单的Web服务器作为集群节点。 在生产环境中,节点通常将被配置为充当冗余负载平衡器。 有关负载均衡的更多信息,请访问我们介绍HAProxy的和负载平衡概念指南。
第2步 - 创建和分配浮动IP
第一步是创建一个浮动IP并将其分配给主服务器。 在DigitalOcean控制面板,单击网络顶部菜单,然后在侧面菜单浮动IP地址 。
你应该看到这样的页面:
选择您的主服务器,然后单击“分配浮动IP”按钮。 浮动IP已经被分配后,请检查您可以通过访问您的浏览器浮动IP地址达到第一Droplet:
http://your_floating_ip
您应该看到主Droplet的索引页。
第3步 - 创建IP重新分配脚本
在这一步中,我们将演示如何使用DigitalOcean API将浮动IP重新分配给另一个Droplet。 稍后,当集群在某个节点中检测到故障时,我们将配置Pacemaker以执行此脚本。
对于我们的示例,我们将使用一个基本的Python脚本,它使用浮动IP地址和Droplet ID作为参数,以便为给定的Droplet分配浮动IP。 Droplet的ID可以使用元数据服务从Droplet本身中获取。
让我们通过下载启动assign-ip
脚本,并使其可执行文件。 在下载之前,可以随意查看脚本的内容。
以下两条命令都应该服务器 (小学和中学)上执行:
sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip
sudo chmod +x /usr/local/bin/assign-ip
在assign-ip
脚本需要以下列信息将被执行:
- 浮动IP:第一个参数为脚本,浮动IP正被分配
- DropletID:第二个参数为脚本,Droplet的ID浮动IP应该被分配到
- DigitalOcean API令牌 :传递的环境变量DO_TOKEN,你的读/写DigitalOcean个人访问令牌
测试IP重分配脚本
要监视IP重新分配正在发生,我们可以使用一个curl
命令访问浮动IP地址在一个循环中,每个请求在1秒的间隔。
打开一个新的本地终端,运行以下命令,确保与实际的浮动IP地址来替换floating_IP_address:
while true; do curl floating_IP_address; sleep 1; done
此命令将继续运行在活动的终端,直到有中断CTRL+C
。 它只是提取您的浮动IP当前分配给服务器托管的网页。 输出应如下所示:
OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
...
现在,让我们运行assign-ip
脚本来重新分配浮动IP到辅助Droplet。 我们将使用DigitalOcean的元数据服务来获取当前的Droplet ID,并将其用作脚本的参数。 从元数据服务获取Droplet的ID可以通过:
curl -s http://169.254.169.254/metadata/v1/id
其中, 169.254.169.254
是由元数据服务使用静态IP地址,并且因此不应该被修改。 此信息仅在Droplet本身内可用。
之前,我们可以执行脚本,我们需要设置包含DigitalOcean API令牌DO_TOKEN环境变量。 从运行辅助服务器下面的命令,不要忘了你的念想更换your_api_token /写个人访问令牌DigitalOcean API:
export DO_TOKEN=your_api_token
还是在辅助服务器上,运行assign-ip
脚本与浮动IP地址替换floating_IP_address:
assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
OutputMoving IP address: in-progress
通过监控所产生的输出curl
你的本地终端上的命令,你会发现,浮动IP将改变其分配的IP地址,并开始指着几秒钟后第二Droplet:
OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: secondary, IP Address: secondary_IP_address
您还可以从浏览器访问浮动IP地址。 你应该得到示出二次Droplet信息的页面。 这意味着重新分配脚本按预期工作。
要重新分配浮动IP回主服务器,重复2步骤的过程,但是从主Droplet这个时候:
export DO_TOKEN=your_api_token
assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
几秒钟后,浮动IP应该再次指向您的主Droplet。
第4步 - 安装Corosync,Pacemaker和PCS
下一步是在Droplet上安装Corosync,Pacemaker和PCS。 因为Corosync是对Pacemaker的依赖,所以通常只是简单地安装Pacemaker并让系统决定应该安装哪个Corosync版本通常是一个更好的主意。
两台服务器上安装该软件包:
sudo yum install pacemaker pcs
在PCS实用程序将创建安装过程中一个新的系统用户,hacluster命名,具有禁用密码。 我们需要在两台服务器上为此用户定义密码。 这将使PCS能够执行任务,例如在多个节点上同步Corosync配置,以及启动和停止集群。
在两台服务器上,运行:
passwd hacluster
你应该在两台服务器上使用相同的密码 。 我们将在下一步中使用此密码配置群集。
用户hacluster有其帐户,这意味着它无法登录到使用其凭据服务器相关联的交互shell或主目录。
第5步 - 设置集群
现在我们在两台服务器上都安装了Corosync,Pacemaker和PCS,我们可以设置集群。
启用和启动PCS
要启用并启动PCS守护进程运行在两台服务器上执行以下操作:
sudo systemctl enable pcsd.service
sudo systemctl start pcsd.service
获取每个节点的专用网络IP地址
为改进的网络性能和安全性,该节点应该使用专用网络相连接。 获取Droplet的专用网络IP地址的最简单方法是通过元数据服务。 在每个服务器上,运行以下命令:
curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo
此命令会输出你登录,您还可以找到在DigitalOcean控制面板中的Droplet的页面上该信息(在设置选项卡下)Droplet的私网IP地址。
从两个Droplet收集专用网络IP地址以供下一步使用。
验证集群节点
验证使用的用户名和hacluster您在第3步中定义你需要为每个节点提供专用网络的IP地址相同的密码群集节点。 从主服务器上,运行:
sudo pcs cluster auth primary_private_IP_address secondary_private_IP_address
你应该得到这样的输出:
OutputUsername: hacluster
Password:
primary_private_IP_address: Authorized
secondary_private_IP_address: Authorized
生成Corosync配置
仍然在主服务器上,生成以下命令Corosync配置文件:
sudo pcs cluster setup --name webcluster \
primary_private_IP_address secondary_private_IP_address
输出应该类似于:
OutputShutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop pacemaker.service
Redirecting to /bin/systemctl stop corosync.service
Killing any remaining services...
Removing all cluster configuration files...
primary_private_IP_address: Succeeded
secondary_private_IP_address: Succeeded
Synchronizing pcsd certificates on nodes primary_private_IP_address, secondary_private_IP_address...
primary_private_IP_address: Success
secondary_private_IP_address: Success
Restaring pcsd on the nodes in order to reload the certificates...
primary_private_IP_address: Success
secondary_private_IP_address: Success
这将生成位于一个新的配置文件/etc/corosync/corosync.conf
根据提供的参数pcs cluster setup
命令。 我们使用集群网站中,如本例中的群集名称,但您可以使用您所选择的名称。
启动集群
要开始,你刚才设置的集群,请从主服务器下面的命令:
sudo pcs cluster start --all
Outputprimary_private_IP_address: Starting Cluster...
secondary_private_IP_address: Starting Cluster...
现在,您可以通过在任何服务器上运行以下命令来确认两个节点加入群集:
sudo pcs status corosync
OutputMembership information
----------------------
Nodeid Votes Name
2 1 secondary_private_IP_address
1 1 primary_private_IP_address (local)
要获取有关集群当前状态的更多信息,您可以运行:
sudo pcs cluster status
输出应类似于:
OutputCluster Status:
Last updated: Fri Dec 11 11:59:09 2015 Last change: Fri Dec 11 11:59:00 2015 by hacluster via crmd on secondary
Stack: corosync
Current DC: secondary (version 1.1.13-a14efad) - partition with quorum
2 nodes and 0 resources configured
Online: [ primary secondary ]
PCSD Status:
primary (primary_private_IP_address): Online
secondary (secondary_private_IP_address): Online
现在,您可以启用corosync
和pacemaker
服务,以确保他们会在系统启动时启动。 运行在两台服务器上执行以下操作:
sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service
禁用STONITH
STONITH(拍摄头中的其他节点)是一种防护技术,旨在防止由无响应但仍在访问应用程序数据的集群中的故障节点导致的数据损坏。 由于其配置取决于许多超出本指南范围的因素,因此我们将在集群设置中禁用STONITH。
要禁用STONITH,请在其中一个Droplet(主卷或辅助卷)上运行以下命令:
sudo pcs property set stonith-enabled=false
第6步 - 创建浮动IP重分配资源代理
唯一剩下要做的就是配置资源代理,当在一个集群节点中检测到故障时,它将执行IP重新分配脚本。 资源代理负责在集群和资源本身之间创建接口。 在我们的例子中,资源是assign-ip脚本。 在给定start,stop或monitor命令时,集群依靠资源代理执行正确的过程。 有不同类型的资源代理,但最常见的是OCF(开放式集群框架)标准。
我们将创建一个新的OCF资源代理到两台服务器上管理分配IP的服务。
首先,创建将包含资源代理的目录。 目录名称将由Pacemaker用作此自定义代理的标识符。 运行在两台服务器上执行以下操作:
sudo mkdir /usr/lib/ocf/resource.d/digitalocean
接下来,下载FloatIP资源代理脚本,并将其放置在新创建的目录, 这两个服务器上:
sudo curl -L -o /usr/lib/ocf/resource.d/digitalocean/floatip http://do.co/ocf-floatip
现在用做两台服务器上运行以下命令脚本可执行:
sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip
我们仍然需要使用PCS实用程序在集群中注册资源代理。 下面的命令应该从节点(别忘了与你DigitalOcean API令牌和floating_IP_address与您的实际浮动IP地址替换your_api_token) 之一来执行:
sudo pcs resource create FloatIP ocf:digitalocean:floatip \
params do_token=your_api_token \
floating_ip=floating_IP_address
资源现在应该在集群中注册并处于活动状态。 你可以从任何与节点检查注册资源pcs status
的命令:
sudo pcs status
Output...
2 nodes and 1 resource configured
Online: [ primary secondary ]
Full list of resources:
FloatIP (ocf::digitalocean:floatip): Started primary
...
第7步 - 测试故障转移
您的群集现在应该准备好处理节点故障。 测试故障转移的一种简单方法是重新启动当前在浮动IP设置中处于活动状态的服务器。 如果你已经按照本教程中的所有步骤,这应该是主服务器。
再次,让我们通过使用监控IP重新分配curl
在一个循环命令。 从本地终端运行:
while true; do curl floating_IP_address; sleep 1; done
从主服务器上,运行reboot命令:
sudo reboot
稍后,主服务器应该变得不可用。 这将导致辅助服务器接管作为活动节点。 您应该看到类似这样的输出在你的本地终端运行curl
:
Output...
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
curl: (7) Failed connect to floating_IP_address; Connection refused
Droplet: secondary, IP Address: secondary_IP_address
Droplet: secondary, IP Address: secondary_IP_address
…
当正在进行IP重新分配之前或同时进行请求时,发生“连接拒绝”错误。 它可能或可能不会显示在输出中。
如果你想点的浮动IP回主节点,同时在辅助节点上测试故障转移,重复刚才的过程,但是从二级Droplet这个时候:
sudo reboot
结论
在本指南中,我们看到了浮动IP可以与Corosync,Pacemaker和PCS一起使用,以在CentOS 7服务器上创建高可用性的Web服务器环境。 我们使用了一个相当简单的基础设施来演示浮动IP的使用,但这个设置可以扩展到在应用程序的任何级别实现高可用性。