介绍
高可用性是当今的一个重要主题,因为服务中断可能非常昂贵。谨慎采取措施,以便在发生中断时保持您的网站或Web应用程序正常运行。使用Pacemaker堆栈,您可以配置高可用性群集。
Pacemaker是一个集群资源管理器。它管理所有集群服务(资源)并使用底层集群引擎的消息传递和成员资格功能。我们将使用Corosync作为我们的集群引擎。资源有一个资源代理,它是一个抽象服务的外部程序。
在主动 - 被动群集中,所有服务都在主系统上运行。如果主系统发生故障,则所有服务都将移至备份系统。主动 - 被动群集可以在不中断的情况下进行维护工作。
在本教程中,您将学习如何构建高可用性Apache主动 - 被动群集。Web群集将通过其虚拟IP地址进行寻址,并在节点发生故障时自动进行故障转移。
您的用户将通过虚拟IP地址访问您的Web应用程序,该地址由Pacemaker管理。Apache服务和虚拟IP始终位于同一主机上。当此主机出现故障时,它们将迁移到第二台主机,您的用户将不会注意到该中断。
准备
在开始学习本教程之前,您需要具备以下条件:
- 两台已经设置好可以使用
sudo
命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。它们将成为集群节点。我们将这些称为webnode01(IP地址:your_first_server_ip
)和webnode02(IP地址:your_second_server_ip
) 。
您必须在两台服务器上运行一些命令,或在一台服务器上运行一些命令。
第1步 - 配置名称解析
首先,我们需要确保两个主机都可以解析两个群集节点的主机名。为此,我们将向/etc/hosts
文件添加条目。在webnode01和webnode02上执行此步骤。
用nano
或你喜欢的文本编辑器打开/etc/hosts
。
sudo nano /etc/hosts
将以下条目添加到文件末尾。
代码语言:javascript复制your_first_server_ip webnode01.example.com webnode01
your_second_server_ip webnode02.example.com webnode02
保存并关闭文件。
第2步 - 安装Apache
在本节中,我们将安装Apache Web服务器。您必须在两台主机上完成此步骤。
首先,安装Apache。
代码语言:javascript复制sudo yum install httpd
Apache资源代理使用Apache服务器状态页来检查Apache服务的运行状况。您必须通过创建文件/etc/httpd/conf.d/status.conf
来激活状态页面。
sudo nano /etc/httpd/conf.d/status.conf
将以下指令粘贴到此文件中。这些指令允许从localhost访问状态页面,但不允许从任何其他主机访问。
代码语言:javascript复制<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>
保存并关闭文件。
第3步 - 安装起搏器
现在我们将安装Pacemaker堆栈。您必须在两台主机上完成此步骤。
安装Pacemaker堆栈和pcs集群shell。稍后我们将使用后者来配置群集。
代码语言:javascript复制sudo yum install pacemaker pcs
现在我们必须启动pcs守护程序,该守护程序用于跨节点同步Corosync配置。
代码语言:javascript复制sudo systemctl start pcsd.service
为了在每次重启后启动守护程序,我们还将启用该服务。
代码语言:javascript复制sudo systemctl enable pcsd.service
安装这些软件包后,系统上将有一个名为hacluster的新用户。安装后,将禁用此用户的远程登录。对于同步配置或在其他节点上启动服务等任务,我们必须为该用户设置相同的密码。
代码语言:javascript复制sudo passwd hacluster
第4步 - 配置起搏器
接下来,我们将允许FirewallD中的群集流量允许我们的主机进行通信。
首先,检查FirewallD是否正在运行。
代码语言:javascript复制sudo firewall-cmd --state
如果它没有运行,请启动它。
代码语言:javascript复制sudo systemctl start firewalld.service
您需要在两台主机上执行此操作。一旦运行,将high-availability
服务添加到FirewallD。
sudo firewall-cmd --permanent --add-service=high-availability
完成此更改后,您需要重新加载FirewallD。
代码语言:javascript复制sudo firewall-cmd --reload
现在我们的两个主机可以相互通信,我们可以通过在一个主机(在我们的例子中是webnode01)上运行此命令来设置两个节点之间的身份验证。
代码语言:javascript复制sudo pcs cluster auth webnode01 webnode02
Username: hacluster
您应该看到以下输出:
代码语言:javascript复制webnode01: Authorized
webnode02: Authorized
接下来,我们将在同一主机上生成并同步Corosync配置。在这里,我们将命名集群webcluster,但您可以随意调用它。
代码语言:javascript复制sudo pcs cluster setup --name webcluster webnode01 webnode02
您将看到以下输出:
代码语言:javascript复制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...
webnode01: Succeeded
webnode02: Succeeded
现在,corosync配置已在所有节点上创建和分发。配置存储在文件/etc/corosync/corosync.conf
中。
第5步 - 启动群集
可以通过在webnode01上运行以下命令来启动集群。
代码语言:javascript复制sudo pcs cluster start --all
为了确保Pacemaker和corosync在启动时启动,我们必须在两台主机上启用服务。
代码语言:javascript复制sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service
我们现在可以通过在任一主机上运行以下命令来检查群集的状态。
代码语言:javascript复制sudo pcs status
检查两个主机是否在输出中标记为联机。
代码语言:javascript复制. . .
Online: [ webnode01 webnode02 ]
Full list of resources:
PCSD Status:
webnode01: Online
webnode02: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
注意:首次设置后,可能需要一些时间才能将节点标记为联机。
第6步 - 禁用STONITH和忽略仲裁
什么是STONITH?
您将在pcs status
输出中看到一条警告,表示未配置STONITH设备且未禁用STONITH:
. . .
WARNING: no stonith devices and stonith-enabled is not false
. . .
这意味着什么,为什么要关心?
当群集资源管理器无法确定节点或节点上的资源的状态时,将使用防护将群集再次置于已知状态。
资源级别防护主要通过配置资源来确保在发生中断时不会出现数据损坏。例如,您可以使用资源级别防护,使用DRBD(分布式复制块设备)将通信链路断开时节点上的磁盘标记为过时。
节点级别防护可确保节点不运行任何资源。这是通过重置节点完成的,它的Pacemaker实现称为STONITH(代表“射击头部的其他节点”)。Pacemaker支持各种各样的防护设备,例如用于服务器的不间断电源或管理接口卡。
由于节点级别防护配置在很大程度上取决于您的环境,因此我们将在本教程中禁用它。
代码语言:javascript复制sudo pcs property set stonith-enabled=false
注意:如果您计划在生产环境中使用Pacemaker,则应根据您的环境规划STONITH实施并使其保持启用状态。
什么是法定人数?
当超过一半的节点在线时,群集具有仲裁。如果群集没有仲裁,Pacemaker的默认行为是停止所有资源。但是,这在双节点集群中没有意义; 如果一个节点发生故障,群集将丢失仲裁。
对于本教程,我们将通过设置no-quorum-policy
告诉Pacemaker忽略仲裁:
sudo pcs property set no-quorum-policy=ignore
步骤7 - 配置虚拟IP地址
从现在开始,我们将通过pcs
shell 与集群进行交互,因此所有命令只需要在一台主机上执行; 哪一个没关系。
Pacemaker集群现已启动并运行,我们可以向其添加第一个资源,即虚拟IP地址。为此,我们将配置ocf:heartbeat:IPaddr2
资源代理,但首先,让我们介绍一些术语。
每个资源代理名称都有三个或两个以冒号分隔的字段:
- 第一个字段是资源类,它是资源代理符合的标准。它还告诉Pacemaker在哪里找到脚本。该
IPaddr2
资源代理符合OCF(开放式集群架构)标准。 - 第二个字段取决于标准。OCF资源使用OCF名称空间的第二个字段。
- 第三个字段是资源代理的名称。
资源可以具有元属性和实例属性。元属性不依赖于资源类型; 实例属性是特定于资源代理的。此资源代理程序唯一必需的实例属性是ip
(虚拟IP地址),但为了显式,我们还将设置cidr_netmask
(CIDR表示法中的子网掩码)。
资源操作是群集可以对资源执行的操作(例如,启动,停止,监视)。它们由关键字指示op
。我们将以20秒的间隔添加操作monitor
,以便群集每20秒检查资源是否仍然健康。是否被认为是健康的取决于资源代理。
首先,我们将创建虚拟IP地址资源。在这里,我们将使用虚拟IP127.0.0.2
和Cluster_VIP作为资源名称。
sudo pcs resource create Cluster_VIP ocf:heartbeat:IPaddr2 ip=127.0.0.2 cidr_netmask=24 op monitor interval=20s
接下来,检查资源的状态。
代码语言:javascript复制sudo pcs status
在输出中查找以下行:
代码语言:javascript复制...
Full list of resources:
Cluster_VIP (ocf::heartbeat:IPaddr2): Started webnode01
...
虚拟IP地址在主机webnode01上处于活动状态。
第8步 - 添加Apache资源
现在我们可以将第二个资源添加到集群中,这将是Apache服务。服务的资源代理是ocf:heartbeat:apache
。
我们将命名资源WebServer
并设置实例属性configfile
(Apache配置文件的位置)和statusurl
(Apache服务器状态页面的URL)。我们将再次选择20秒的监视间隔。
sudo pcs resource create WebServer ocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.conf statusurl="http://127.0.0.1/server-status" op monitor interval=20s
我们可以像以前一样查询资源的状态。
代码语言:javascript复制sudo pcs status
您应该在webnode02上运行的输出中看到WebServer。
代码语言:javascript复制...
Full list of resources:
Cluster_VIP (ocf::heartbeat:IPaddr2): Started webnode01
WebServer (ocf::heartbeat:apache): Started webnode02
...
如您所见,资源在不同的主机上运行。我们还没有告诉Pacemaker这些资源必须在同一主机上运行,因此它们均匀分布在节点上。
注意:您可以通过运行重新启动Apache资源sudo pcs resource restart WebServer
(例如,如果您更改Apache配置)。确保不要用systemctl
管理Apache服务。
第9步 - 配置主机托管约束
Pacemaker集群中的每一个决策,例如选择资源应该在哪里运行,都是通过比较分数来完成的。每个资源计算得分,并且群集资源管理器选择具有特定资源的最高得分的节点。(如果某个节点的资源得分为负,则该资源无法在该节点上运行。)
我们可以通过约束来操纵集群的决策。约束有一个分数。如果约束的分数低于INFINITY,则仅为建议。INFINITY的分数意味着它是必须的。
我们希望确保两个资源都在同一主机上运行,因此我们将定义一个评分为INFINITY的共置约束。
代码语言:javascript复制sudo pcs constraint colocation add WebServer Cluster_VIP INFINITY
约束定义中的资源顺序很重要。在这里,我们指定Apache resource(WebServer
)必须在虚拟IP(Cluster_VIP
)处于活动状态的相同主机上运行。这也意味着如果Cluster_VIP
不活动,则不允许在任何地方运行WebSite
。
还可以通过创建排序约束来定义资源应该以何种顺序运行,或者通过创建位置约束来定义某些资源的某些主机。
验证两个资源是否在同一主机上运行。
代码语言:javascript复制sudo pcs status
代码语言:javascript复制...
Full list of resources:
Cluster_VIP (ocf::heartbeat:IPaddr2): Started webnode01
WebServer (ocf::heartbeat:apache): Started webnode01
...
这两个资源现在都在webnode01上。
结论
您已设置Apache双节点主动 - 被动群集,可通过虚拟IP地址访问。您现在可以进一步配置Apache,但请确保跨主机同步配置。您可以为此编写自定义脚本(例如,使用rsync
),或者您可以使用类似csync2的内容。
如果要在主机之间分发Web应用程序的文件,可以设置DRBD卷并将其与Pacemaker集成。
更多CentOS教程请前往腾讯云 社区学习更多知识。
参考文献:《How To Set Up an Apache Active-Passive Cluster Using Pacemaker on CentOS 7》