如何在CentOS7上使用Pacemaker设置Apache主动-被动集群

来自菜鸟教程
跳转至:导航、​搜索

介绍

高可用性是当今的一个重要主题,因为服务中断可能会造成非常高的成本。 谨慎的做法是采取措施让您的网站或 Web 应用程序在中断时保持运行。 使用 Pacemaker 堆栈,您可以配置高可用性集群。

Pacemaker 是一个 集群资源管理器。 它管理所有集群服务(resources)并使用底层集群引擎的消息传递和成员资格功能。 我们将使用 Corosync 作为我们的集群引擎。 资源有一个资源代理,它是一个抽象服务的外部程序。

在主动-被动集群中,所有服务都在主系统上运行。 如果主系统发生故障,所有服务都会转移到备份系统。 主动-被动集群可以在不中断的情况下进行维护工作。

在本教程中,您将学习如何构建高可用性 Apache 主动-被动集群。 Web 集群将通过其虚拟 IP 地址进行寻址,并在节点发生故障时自动进行故障转移。

您的用户将通过 Pacemaker 管理的虚拟 IP 地址访问您的 Web 应用程序。 Apache 服务和虚拟 IP 始终位于同一主机上。 当这台主机出现故障时,它们会迁移到第二台主机,您的用户不会注意到中断。

先决条件

在开始学习本教程之前,您将需要以下内容:

  • 两个 CentOS 7 Droplet,它们将是集群节点。 我们将它们称为 webnode01(IP 地址:your_first_server_ip)和 webnode02(IP 地址:your_second_server_ip)。
  • 两台服务器上具有 root 权限的用户。 您可以按照 Initial Server Setup with CentOS 7 教程进行设置。

您必须在两台服务器上运行一些命令,而仅在一台服务器上运行一些命令。

第 1 步 — 配置名称解析

首先,我们需要确保两台主机都可以解析两个集群节点的主机名。 为此,我们将向 /etc/hosts 文件添加条目。 在 webnode01 和 webnode02 上执行此步骤。

使用 nano 或您喜欢的文本编辑器打开 /etc/hosts

sudo nano /etc/hosts

将以下条目添加到文件末尾。

/etc/hosts

your_first_server_ip webnode01.example.com webnode01
your_second_server_ip webnode02.example.com webnode02

保存并关闭文件。

第 2 步 — 安装 Apache

在本节中,我们将安装 Apache Web 服务器。 您必须在两台主机上完成此步骤。

首先,安装 Apache。

sudo yum install httpd

Apache 资源代理使用 Apache 服务器状态页面来检查 Apache 服务的运行状况。 您必须通过创建文件 /etc/httpd/conf.d/status.conf 来激活状态页面。

sudo nano /etc/httpd/conf.d/status.conf

将以下指令粘贴到此文件中。 这些指令允许从 localhost 但不允许从任何其他主机访问状态页面。

/etc/httpd/conf.d/status.conf

<Location /server-status>
   SetHandler server-status
   Order Deny,Allow
   Deny from all
   Allow from 127.0.0.1
</Location>

保存并关闭文件。

第 3 步 — 安装 Pacemaker

现在我们将安装 Pacemaker 堆栈。 您必须在两台主机上完成此步骤。

安装 Pacemaker 堆栈和 pcs 集群 shell。 稍后我们将使用后者来配置集群。

sudo yum install pacemaker pcs

现在我们必须启动 pcs 守护进程,该守护进程用于跨节点同步 Corosync 配置。

sudo systemctl start pcsd.service

为了在每次重新启动后启动守护程序,我们还将启用该服务。

sudo systemctl enable pcsd.service

安装这些软件包后,您的系统上将有一个名为 hacluster 的新用户。 安装后,该用户禁用远程登录。 对于同步配置或在其他节点上启动服务等任务,我们必须为该用户设置相同的密码。

sudo passwd hacluster

第 4 步 — 配置 Pacemaker

接下来,我们将允许 FirewallD 中的集群流量以允许我们的主机进行通信。

首先,检查 FirewallD 是否正在运行。

sudo firewall-cmd --state

如果它没有运行,请启动它。

sudo systemctl start firewalld.service

您需要在两台主机上执行此操作。 运行后,将 high-availability 服务添加到 FirewallD。

sudo firewall-cmd --permanent --add-service=high-availability

此更改后,您需要重新加载 FirewallD。

sudo firewall-cmd --reload

如果您想了解有关 FirewallD 的更多信息,可以阅读此 指南,了解如何在 CentOS 7 上配置 FirewallD。

现在我们的两台主机可以相互通信,我们可以通过在一台主机上运行此命令来设置两个节点之间的身份验证(在我们的例子中,webnode01)。

sudo pcs cluster auth webnode01 webnode02
Username: hacluster

您应该看到以下输出:

输出

webnode01: Authorized
webnode02: Authorized

接下来,我们将在同一主机上生成和同步 Corosync 配置。 在这里,我们将集群命名为 webcluster,但您可以随意命名。

sudo pcs cluster setup --name webcluster webnode01 webnode02

您将看到以下输出:

输出

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 上运行以下命令来启动集群。

sudo pcs cluster start --all

为了确保 Pacemaker 和 corosync 在启动时启动,我们必须在两台主机上启用服务。

sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service

我们现在可以通过在任一主机上运行以下命令来检查集群的状态。

sudo pcs status

检查两个主机是否在输出中都标记为在线。

输出

. . .

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
. . .

这是什么意思,你为什么要关心?

当集群资源管理器无法确定节点或节点上资源的状态时,fencing 用于使集群再次进入已知状态。

资源级防护主要通过配置资源确保在中断的情况下没有数据损坏。 您可以使用资源级别的防护,例如,使用 DRBD(分布式复制块设备)在通信链路断开时将节点上的磁盘标记为过期。

节点级防护确保节点不运行任何资源。 这是通过重置节点来完成的,它的 Pacemaker 实现称为 STONITH(代表“射击头部的另一个节点”)。 Pacemaker 支持多种击剑设备,例如 服务器的不间断电源或管理接口卡。

由于节点级别的防护配置在很大程度上取决于您的环境,因此我们将在本教程中禁用它。

sudo pcs property set stonith-enabled=false

注意: 如果您计划在生产环境中使用 Pacemaker,您应该根据您的环境计划一个 STONITH 实现并保持启用它。


什么是法定人数?

当超过一半的节点在线时,集群有 quorum。 如果集群没有仲裁,Pacemaker 的默认行为是停止所有资源。 但是,这在双节点集群中没有意义。 如果一个节点发生故障,集群将失去仲裁。

在本教程中,我们将通过设置 no-quorum-policy 来告诉 Pacemaker 忽略 quorum:

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 地址资源。 在这里,我们将使用 127.0.0.2 作为我们的虚拟 IP,并使用 Cluster_VIP 作为资源名称。

sudo pcs resource create Cluster_VIP ocf:heartbeat:IPaddr2 ip=127.0.0.2 cidr_netmask=24 op monitor interval=20s

接下来,检查资源的状态。

sudo pcs status

在输出中查找以下行:

输出

...
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

我们可以像以前一样查询资源的状态。

sudo pcs status

您应该在 webnode02 上运行的输出中看到 WebServer

输出

...
Full list of resources:

 Cluster_VIP    (ocf::heartbeat:IPaddr2):   Started webnode01
 WebServer  (ocf::heartbeat:apache):    Started webnode02
...

如您所见,资源在不同的主机上运行。 我们还没有告诉 Pacemaker 这些资源必须在同一主机上运行,因此它们是均匀分布在节点上的。

注意:你可以通过运行sudo pcs resource restart WebServer重启Apache资源(例如 如果您更改 Apache 配置)。 确保不要使用 systemctl 来管理 Apache 服务。


第 9 步 — 配置托管约束

几乎 Pacemaker 集群中的每一个决定,比如选择资源应该在哪里运行,都是通过比较分数来完成的。 分数是按资源计算的,集群资源管理器会为特定资源选择得分最高的节点。 (如果某个节点的资源得分为负,则该资源无法在该节点上运行。)

我们可以通过约束来操纵集群的决策。 约束有一个分数。 如果约束的分数低于 INFINITY,则它只是一个建议。 INFINITY 分数意味着它是必须的。

我们希望确保两个资源都在同一主机上运行,因此我们将定义一个得分为 INFINITY 的托管约束。

sudo pcs constraint colocation add WebServer Cluster_VIP INFINITY

约束定义中资源的顺序很重要。 在这里,我们指定 Apache 资源 (WebServer) 必须在虚拟 IP (Cluster_VIP) 处于活动状态的同一主机上运行。 这也意味着如果 Cluster_VIP 未激活,则不允许 WebSite 在任何地方运行。

也可以通过创建排序约束来定义资源应该以什么顺序运行,或者通过创建位置约束来为某些资源选择某些主机。

验证两个资源是否在同一主机上运行。

sudo pcs status

输出

...
Full list of resources:

 Cluster_VIP    (ocf::heartbeat:IPaddr2):   Started webnode01
 WebServer  (ocf::heartbeat:apache):    Started webnode01
...

这两个资源现在都在 webnode01 上。

结论

您已经设置了一个可通过虚拟 IP 地址访问的 Apache 两节点主动-被动集群。 您现在可以进一步配置 Apache,但请确保跨主机同步配置。 您可以为此编写自定义脚本(例如 使用 rsync) 或者您可以使用 csync2 之类的东西。

如果您想在主机之间分发您的 Web 应用程序的文件,您可以设置一个 DRBD 卷并将 与 Pacemaker 集成。