简介

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

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

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

  • 两个 CentOS 7 Droplet 位于同一个数据中心,启用专用网络

  • 非root sudo 用户,可以按照Initial Server Setup教程进行设置

  • DigitalOcean API 的个人访问令牌,您可以按照教程生成它如何使用 DigitalOcean API V2

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

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

##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 和负载平衡概念简介指南。

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

你应该看到这样的页面:

保留 IP 控制面板

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

http://your_reserved_ip

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

对于我们的示例,我们将使用一个基本的 Python 脚本,该脚本将保留 IP 地址和 Droplet ID 作为参数,以便将保留 IP 分配给给定的 Droplet。可以使用元数据服务从 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脚本需要以下信息才能执行:

  • Reserved IP:脚本的第一个参数,正在分配的Reserved IP

  • Droplet ID:脚本的第二个参数,保留 IP 应分配给的 Droplet ID

  • DigitalOcean API Token : 作为环境变量 DO_TOKEN 传入,您的读/写 DigitalOcean 个人访问令牌

###测试 IP 重新分配脚本 要监控 IP 重新分配的发生,我们可以使用curl命令循环访问保留的 IP 地址,每个请求之间的间隔为 1 秒。

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

while true; do curl reserved_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 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 环境变量。从 secondary 服务器运行以下命令,不要忘记将您的_api_token 替换为您对 DigitalOcean API 的读/写个人访问令牌:

export DO_TOKEN=your_api_token

仍在辅助服务器上,运行assign-ip脚本,将 reserved_IP_address 替换为您的预留 IP 地址:

assign-ip reserved_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 重新分配回主服务器,请重复 2 步过程,但这次来自 primary Droplet:

export DO_TOKEN=your_api_token
assign-ip reserved_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 或主目录,这意味着无法使用其凭据登录服务器。

##Step 5 — 设置集群 现在我们在两台服务器上都安装了 Corosync、Pacemaker 和 PCS,我们可以设置集群了。 ###Enabling 和启动 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

此命令将简单地输出您登录的 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

###Generating 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

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

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

sudo pcs property set stonith-enabled=false

##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 实用程序在集群中注册资源代理。以下命令应从一个节点执行(不要忘记将您的_api_token 替换为您的 DigitalOcean API 令牌,并将 reserved_IP_address 替换为您的实际保留 IP 地址):

sudo pcs resource create FloatIP ocf:digitalocean:floatip \
    params do_token=your_api_token \
    reserved_ip=reserved_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

...

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

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

while true; do curl reserved_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 reserved_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 的使用,但可以扩展此设置以在应用程序堆栈的任何级别实现高可用性。

Logo

CentOS社区为您提供最前沿的新闻资讯和知识内容

更多推荐