如何在CentOS7上使用Pacemaker、Corosync和浮动IP创建高可用性设置

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

###介绍

Corosync 是一个开源集群引擎,用于在应用程序中实现高可用性。 通常被称为 消息传递层 ,Corosync 提供集群成员资格和封闭的通信模型,用于创建复制状态机,在其之上可以运行像 Pacemaker 这样的集群资源管理器。 Corosync 可以被视为将集群节点连接在一起的底层系统,而 Pacemaker 则监控集群并在发生故障时采取行动。

本教程将演示如何使用 Corosync 和 Pacemaker 在具有 CentOS 7 服务器和浮动 IP 的 DigitalOcean 上创建高可用性 (HA) 基础架构。 为了方便设置和管理集群节点的过程,我们将使用 PCS,这是一个与 Corosync 和 Pacemaker 交互的命令行界面。 ##先决条件

为了遵循本指南,您需要:

创建这些 Droplet 时,请使用描述性主机名来唯一标识它们。 在本教程中,我们将这些 Droplet 称为 primarysecondary

当您准备好继续前进时,请确保您已使用 sudo 用户登录到您的两台服务器。

    1. Step 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 和负载均衡概念简介 指南。


    1. Step 2 - 创建和分配浮动 IP 第一步是创建一个浮动 IP 并将其分配给 primary 服务器。 在 DigitalOcean 控制面板中,单击顶部菜单中的 Networking,然后单击侧面菜单中的 Floating IPs

你应该看到这样的页面:

选择您的 服务器,然后单击“分配浮动 IP”按钮。 分配浮动 IP 后,检查是否可以通过从浏览器访问浮动 IP 地址来访问 primary Droplet:

http://your_floating_ip

你应该看到你的主要 Droplet 的索引页。 ##Step 3 - 创建 IP 重新分配脚本 在这一步中,我们将演示如何使用 DigitalOcean API 将浮动 IP 重新分配给另一个 Droplet。 稍后,我们将配置 Pacemaker 以在集群检测到其中一个节点出现故障时执行此脚本。

对于我们的示例,我们将使用一个基本的 Python 脚本,该脚本将浮动 IP 地址和液滴 ID 作为参数,以便将浮动 IP 分配给给定的液滴。 可以使用元数据服务从 Droplet 本身中获取 Droplet 的 ID。

让我们首先下载 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
  • Droplet ID:脚本的第二个参数,浮动 IP 应该分配给的 Droplet ID
  • DigitalOcean API Token : 作为环境变量 DO_TOKEN 传入,你的读/写 DigitalOcean 个人访问令牌
      1. 测试 IP 重新分配脚本 要监控 IP 重新分配发生的情况,我们可以使用 curl 命令循环访问浮动 IP 地址,每个请求之间的间隔为 1 秒。

打开一个新的本地终端并运行以下命令,确保将 floating_IP_address 替换为您的实际浮动 IP 地址:

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 重新分配给 secondary 液滴。 我们将使用 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 环境变量。 从 secondary 服务器运行以下命令,不要忘记将 your_api_token 替换为您对 DigitalOcean API 的读/写个人访问令牌:

export DO_TOKEN=your_api_token

仍然在 secondary 服务器上,运行 assign-ip 脚本,将 floating_IP_address 替换为您的浮动 IP 地址:

assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`
OutputMoving IP address: in-progress

通过监视本地终端上 curl 命令产生的输出,您会注意到浮动 IP 将更改其分配的 IP 地址并在几秒钟后开始指向 secondary Droplet:

OutputDroplet: primary, IP Address: primary_IP_address
Droplet: primary, IP Address: primary_IP_address
Droplet: secondary, IP Address: secondary_IP_address

您还可以从浏览器访问浮动 IP 地址。 你应该得到一个显示 secondary Droplet 信息的页面。 这意味着重新分配脚本按预期工作。

要将浮动 IP 重新分配回主服务器,请重复两步过程,但这次是从 primary Droplet:

export DO_TOKEN=your_api_token
assign-ip floating_IP_address `curl -s http://169.254.169.254/metadata/v1/id`

几秒钟后,浮动 IP 应该再次指向您的主 Droplet。 ##Step 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 或主目录,这意味着无法使用其凭据登录服务器。


    1. Step 5 — 设置集群 现在我们在两台服务器上都安装了 Corosync、Pacemaker 和 PCS,我们可以设置集群了。 ###启用和启动 PCS 要启用和启动 PCS 守护程序,请在 两台服务器 上运行以下命令:
sudo systemctl enable pcsd.service
sudo systemctl start pcsd.service
      1. 获取每个节点的专用网络 IP 地址 为了提高网络性能和安全性,应使用 专用网络 连接节点。 获取 Droplet 的私有网络 IP 地址的最简单方法是通过元数据服务。 在每台服务器上,运行以下命令:
curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo

此命令将简单地输出您登录的 Droplet 的专用网络 IP 地址。 您还可以在 DigitalOcean 控制面板(在 设置 选项卡下)的 Droplet 页面上找到此信息。

从两个 Droplet 收集专用网络 IP 地址以进行后续步骤。 ###Authenticating the Cluster Nodes 使用用户名 hacluster 和您在步骤 3 中定义的相同密码对集群节点进行身份验证。 您需要为每个节点提供专用网络 IP 地址。 从 primary 服务器,运行:

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
      1. 生成 Corosync 配置 仍然在 primary 服务器上,使用以下命令生成 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

这将根据提供给 pcs cluster setup 命令的参数生成位于 /etc/corosync/corosync.conf 的新配置文件。 在此示例中,我们使用 webcluster 作为集群名称,但您可以使用您选择的名称。 ###Starting the Cluster 要启动刚刚设置的集群,请从 primary 服务器运行以下命令:

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

现在您可以启用 corosyncpacemaker 服务,以确保它们在系统启动时启动。 在 两台服务器 上运行以下命令:

sudo systemctl enable corosync.service
sudo systemctl enable pacemaker.service
      1. Disabling STONITH STONITH(射击头部中的另一个节点)是一种防护技术,旨在防止由集群中的故障节点导致数据损坏,这些节点无响应但仍在访问应用程序数据。 由于其配置取决于许多超出本指南范围的因素,因此我们将在集群设置中禁用 STONITH。

要禁用 STONITH,请在其中一个 Droplet(主要或辅助)上运行以下命令:

sudo pcs property set stonith-enabled=false
    1. Step 6 — 创建浮动 IP 重新分配资源代理 剩下要做的就是配置资源代理,当在其中一个集群节点中检测到故障时,该资源代理将执行 IP 重新分配脚本。 资源代理负责在集群和资源本身之间创建一个接口。 在我们的例子中,资源是 assign-ip 脚本。 当给定启动、停止或监控命令时,集群依靠资源代理执行正确的过程。 有不同类型的资源代理,但最常见的一种是 OCF(开放集群框架)标准。

我们将创建一个新的 OCF 资源代理来管理两台服务器上的 assign-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 实用程序在集群中注册资源代理。 以下命令应从节点的 one 执行(不要忘记将 your_api_token 替换为您的 DigitalOcean API 令牌,并将 floating_IP_address 替换为您的实际浮动 IP 地址):

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

...
    1. Step 7 — 测试故障转移 您的集群现在应该准备好处理节点故障。 测试故障转移的一种简单方法是重新启动浮动 IP 设置中当前处于活动状态的服务器。 如果您已按照本教程中的所有步骤进行操作,那么这应该是 primary 服务器。

同样,让我们通过在循环中使用 curl 命令来监控 IP 重新分配。 从本地终端运行:

while true; do curl floating_IP_address; sleep 1; done

primary 服务器,运行重启命令:

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 指向主节点,只需重复该过程,但这次从 secondary Droplet 开始:

sudo reboot

##结论

在本指南中,我们了解了如何将浮动 IP 与 Corosync、Pacemaker 和 PCS 一起使用,以在 CentOS 7 服务器上创建一个高度可用的 Web 服务器环境。 我们使用了一个相当简单的基础架构来演示浮动 IP 的使用,但可以扩展此设置以在应用程序堆栈的任何级别实现高可用性。