提供:ZStack云计算
Corosync是一套开源集群引擎,用于实现应用的高可用性。其通常被作为消息收发层,能够提供一整套集群成员关系及封闭式通信模式以创建复制状态设备,并以此为基础利用Pacemaker等对集群资源进行管理。Corosync可作为维系各集群节点的底层系统,而Pacemaker则监控集群整体并在发生故障时加以应对。
本教程将探讨如何利用Corosync与Pacemaker在CentOS 7服务器上创建一套可高用性基础设施。为了完成集群各节点的设置与管理工作,我们还将使用PCS——一款命令行界面,旨在与Corosync与Pacemaker实现交互。
要完成本教程,大家需要:
在创建Droplet时,请使用不同主机名称进行区分。在本示例中,我们将二者分别命名为主Droplet与从Droplet。
准备就绪后,利用sudo用户登录两套服务器。
要加快这部分工作,可以使用简单的shell脚本以安装Nginx并设置一套包含特定服务器信息的基础网页。大家可以借此轻松了解Floating IP设置中的服务器活动情况。这套脚本使用DigitalOcean的Metadata服务以获取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与负载均衡概念介绍一文。
第一步是创建一条Floating IP并将其分配给主服务器。在DigitalOcean控制面板中点击顶部菜单中的Networking,而后选择子菜单中的Floating IPs。
显示页面如下:
选定主服务器并点击“Assign Floating IP”按钮。在Floating IP分配完成后,检查能够在浏览器中通过访问Floating IP接入主Droplet:
http://your_floating_ip
这时大家应该会看到主Droplet的目录页面。
在这里,我们将探讨如何利用DigitalOcean API将Floating IP分配给另一Droplet。在此之后,我们将配置Pacemaker在集群检测到某一节点出现故障时执行此脚本。
在示例中,我们将使用一套基础Python脚本,其将Floating IP地址与Droplet ID作为参数,负责将Floating IP分配给指定Droplet。Droplet的ID可利用Metadata服务提取自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分配情况,我们可以使用curl命令以循环访问Floating IP地址,每次请求之间间隔1秒。
打开新的本地终端并运行以下命令,确保将floating_IP_address替换为实际Floating IP地址:
这条命令将不断执行,直到我们以Ctrl+C中止。其作用是获取Floating IP被分配到的服务器提供的网页,输出结果为:
Output
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
...
现在运行assign-ip脚本将Floating IP重新分配至从Droplet。我们将使用DigitalOcean的Metadata服务获取当前Droplet ID并利用它作为脚本参数。获取操作使用以下命令:
其中169.254.169.254为Metadata服务所使用的静态IP地址,因此不要进行修改。这部分信息只适用于该Droplet内部。
在执行此脚本前,我们需要设置包含有DigitalOcean API令牌的DO_TOKEN环境变量。在从服务器上运行以下命令,注意将your_api_token替换为实际个人访问令牌:
仍然在从服务器上,运行assign-ip,将floating_IP_address替换为实际Floating IP地址:
assign-ip floating_IP_address curl -s http://169.254.169.254/metadata/v1/id
Output
Moving IP address: in-progress
使用curl检查输出结果,大家会注意到数秒之后,Floating IP将变更所分配IP地址并将其指向从Droplet:
Output
Droplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: secondary, IP Address: secondary_IP_address
大家也可以通过浏览器访问该FLoating IP地址,显示的页面中包含从Droplet信息。这意味着重分配脚本已经顺利起效。
要将Floating IP重新分配至主服务器,重复第二步流程即可,但这一次需要立足于主Droplet执行:
curl -s http://169.254.169.254/metadata/v1/id
数秒之后,Floating IP即应重新指向主Droplet。
下一步是在Droplet上安装Corosync、Pacemaker与PCS。由于Corosync与Pacemaker存在关联性,因此最好先安装Pacemaker并由系统自行决定使用哪个Corosync版本。
在两套服务器上安装软件包:
PCS工具会在安装过程中创建名为hacluster的新系统用户,且禁用密码。我们需要在两套服务器上为该用户定义密码,从而使得PCS能够在各节点上执行Corosync配置同步以及集群启动与停止等任务。
在两套服务器上运行:
大家应当在两套服务器上使用同样的密码。在这里我们将使用下一节集群配置中设定的密码。
hacluster用户不具备交互shell或者账户关联主目录,这意味着其无法利用自身凭证登录至服务器。
现在Corosync、Pacemaker与PCS已经安装完成,接下来设置集群。
要启用并运行PCS守护程序,在两套服务器上运行以下命令:
sudo systemctl enable pcsd.service
sudo systemctl start pcsd.service
为了提升网络性能与安全性,各节点应当利用专有网络进行连接。最简单的Droplet专有网络IP地址获取方式就是使用Metadata服务。在各服务器上,运行以下命令:
此命令将直接输出当前所登录Droplet的专有网络IP地址。大家也可以在DigitalOcean控制面板的Droplet页面(位于Settings标签下)中找到这些信息。
收集两套Droplet的专有网络IP地址以备接下来使用。
利用hacluster用户名及第三步定义的密码验证各集群节点。大家需要提供每个节点的专有网络IP地址。在主服务器上运行:
输出结果如下:
Output
Username: hacluster
Password:
primary_private_IP_address: Authorized
secondary_private_IP_address: Authorized
还是在主服务器上,利用以下命令生成Corosync配置文件:
sudo pcs cluster setup –name webcluster \
primary_private_IP_address secondary_private_IP_address
输出结果如下:
Output
Shutting 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 集群设置命令。在本示例中,我们使用的集群名称为webcluster,但大家也可以随意使用其它名称。
要启动这套集群,在主服务器上运行以下命令:
sudo pcs cluster start –all
Output
primary_private_IP_address: Starting Cluster…
secondary_private_IP_address: Starting Cluster…
大家现在可以在任意服务器上运行以下命令以确认两个节点是否都已经加入集群:
sudo pcs status corosync
Output
Nodeid Votes Name
2 1 secondary_private_IP_address
1 1 primary_private_IP_address (local)
要获取更多当前集群状态信息,可运行:
输出结果如下:
Output
Cluster 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(全称为Shoot The Other Node In The Head)是一项用于防止集群内节点故障造成数据损坏的技术。由于其配置方式取决于多项因素,因此我们在这里暂时将其禁用。
要禁用STONITH,在任一Droplet上运行以下命令:
最后一项任务就是配置资源代理,其负责在检测到集群节点发生故障时执行IP重分配脚本。该资源代理会在集群及自身资源之间创建接口。在本示例中,该资源即为assign-ip脚本。集群依靠该资源代理在接收到start、stop或monitor命令时执行正确的操作。资源代理分为多种不同类型,但其中最为常见的为OCF(即开放集群框架)标准。
我们将创建一个新的OCF资源代理以管理assign-ip服务。
首先,创建用于容纳该资源代理的目录。目录名称将由Pacemaker作为该自定义代理的标识符。在两套服务器上运行以下命令:
接下来,下载FloatIP资源代理脚本并将其放置在两套服务器上刚刚创建的目录内:
现在利用以下命令在两套服务器上为该脚本赋予执行权限:
我们需要在集群内使用PCS工具注册该资源代理。以下命令可执行在任一节点上(注意替换其中的your_api_token与floating_IP_addres):
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
…
现在我们的集群已经能够实现节点故障转移。要对其效果进行测试,大家可以遵循以下方法。
首先在本地终端上利用curl命令循环监控IP重分配:
From the primary server, run a reboot command:
稍等一会儿,主服务器即不再可用。这时从服务器将顶替其作为活动节点,运行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重新分配之前或者同时,则会出现“Connection refused”错误。输出结果中可能包含或不包含该信息。
如果大家希望在对从节点进行故障转移测试的同时将Floating IP分配回主节点,则可在从Droplet上重复以上步骤:
在本教程中,我们了解了如何利用Floating IP将Corosync、Pacemaker与PCS结合起来,共同在CentOS 7服务器上构建一套高可用性Web服务器环境。我们在示例中使用的基础设施非常简单,但其设计思路完全适用于任何级别的高可用性应用堆栈。
本文来源自DigitalOcean Community。英文原文:How to Create a High Availability Setup with Pacemaker, Corosync and Floating IPs on CentOS 7 By Erika Heidi
翻译:diradw