如何在 Ubuntu 14.04 上使用 Corosync、Pacemaker 和保留 IP 创建高可用性设置
介绍
本教程将演示如何使用带有保留 IP 的 Corosync 和 Pacemaker 在 DigitalOcean 上创建高可用性 (HA) 服务器基础架构。
Corosync 是一个开源程序,它向客户端服务器提供集群成员资格和消息传递功能,通常称为消息传递层。 Pacemaker 是一个开源集群资源管理器 (CRM),它是一个协调资源和服务的系统,这些资源和服务由集群管理并使其高度可用。从本质上讲,Corosync 使服务器能够作为集群进行通信,而 Pacemaker 则提供了控制集群行为方式的能力。
目标
完成后,HA 设置将包含两个主动/被动配置的 Ubuntu 14.04 服务器。这将通过将保留 IP(您的用户将如何访问您的 Web 服务)指向主(活动)服务器来完成,除非检测到故障。如果 Pacemaker 检测到主服务器不可用,辅助(被动)服务器将自动运行一个脚本,该脚本将通过 DigitalOcean API 将保留 IP 重新分配给自己。因此,到保留 IP 的后续网络流量将被定向到您的辅助服务器,该服务器将充当活动服务器并处理传入流量。
此图演示了所描述设置的概念:

注意:本教程仅涵盖在网关级别设置主动/被动高可用性。也就是说,它包括保留 IP 和负载平衡器 服务器——主要和次要服务器。此外,出于演示目的,我们不会在每台服务器上配置反向代理负载平衡器,而是简单地将它们配置为使用各自的主机名和公共 IP 地址进行响应。
为实现这一目标,我们将遵循以下步骤:
- 创建 2 个将接收流量的 Droplet
- 创建保留 IP 并将其分配给其中一个 Droplet
- 安装和配置 Corosync
- 安装和配置 Pacemaker
- 配置保留 IP 重新分配集群资源
- 测试故障转移
- 配置Nginx集群资源
先决条件
为了自动重新分配保留 IP,我们必须使用 DigitalOcean API。这意味着您需要生成一个个人访问令牌 (PAT),这是一个 API 令牌,可用于对您的 DigitalOcean 帐户进行身份验证,具有读取和写入权限按照 API 教程的如何生成个人访问令牌部分进行操作。您的 PAT 将在脚本中使用,该脚本将添加到集群中的两个服务器,因此请务必将其保存在安全的地方——因为它允许对您的 DigitalOcean 帐户进行完全访问——以供参考。
除了 API 之外,本教程还利用了以下 DigitalOcean 功能:
- 预留 IP
- 元数据
- 用户数据(云配置脚本)
如果您想了解更多信息,请阅读链接的教程。
创建液滴
第一步是在同一个数据中心创建两个启用专用网络的 Ubuntu Droplet,它们将充当上述的主服务器和辅助服务器。在我们的示例设置中,我们将它们命名为“primary”和“secondary”以便于参考。我们将在两个 Droplets 上安装 Nginx,并用唯一标识它们的信息替换它们的索引页面。这将使我们能够通过一种简单的方式来证明 HA 设置正在运行。对于真正的设置,您的服务器应该运行您选择的 Web 服务器或负载均衡器,例如 Nginx 或 HAProxy。
创建两个 Ubuntu 14.04 Droplet,主要的和次要的。如果您想遵循示例设置,请使用此 bash 脚本作为用户数据:
#!/bin/bash
apt-get -y update
apt-get -y install nginx
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, IP Address: $PUBLIC_IPV4 > /usr/share/nginx/html/index.html
此用户数据将安装 Nginx 并将 index.html
的内容替换为 droplet 的主机名和 IP 地址(通过引用元数据服务)。通过其公共 IP 地址访问任一 Droplet 将显示一个包含 Droplet 主机名和 IP 地址的基本网页,这将有助于测试保留 IP 在任何给定时刻指向哪个 Droplet。
创建保留 IP
在 DigitalOcean 控制面板中,单击顶部菜单中的网络,然后单击侧面菜单中的保留 IP。

为您的主要 Droplet 分配一个保留 IP,然后单击“分配保留 IP”按钮。
分配保留 IP 后,记下其 IP 地址。通过在 Web 浏览器中访问保留 IP 地址,检查您是否可以访问分配给它的 Droplet。
http://your_reserved_ip
您应该会看到主 Droplet 的索引页。
配置 DNS(可选)
如果您希望能够通过域名访问您的 HA 设置,请继续在您的 DNS 中创建一条 A 记录,将您的域指向您的保留 IP 地址。如果您的域正在使用 DigitalOcean 的名称服务器,请按照如何使用 DigitalOcean 教程设置主机名的第三步进行操作。传播后,您可以通过域名访问您的活动服务器。
我们将使用的示例域名是 example.com
。如果您现在没有可使用的域名,您将使用保留的 IP 地址来访问您的设置。
配置时间同步
每当您有多个服务器相互通信时,尤其是使用集群软件时,确保它们的时钟同步是很重要的。我们将使用 NTP(网络时间协议)来同步我们的服务器。
在两台服务器上,使用此命令打开时区选择器:
- sudo dpkg-reconfigure tzdata
选择您想要的时区。例如,我们将选择 America/New_York
。
接下来,更新 apt-get:
- sudo apt-get update
然后使用此命令安装 ntp
包;
- sudo apt-get -y install ntp
您的服务器时钟现在应该使用 NTP 同步。要了解有关 NTP 的更多信息,请查看本教程:配置时区和网络时间协议同步。
配置防火墙
Corosync 在端口 5404
和 5406
之间使用 UDP 传输。如果您正在运行防火墙,请确保服务器之间允许这些端口上的通信。
例如,如果您使用的是 iptables
,则可以使用以下命令允许这些端口和 eth1
(专用网络接口)上的流量:
- sudo iptables -A INPUT -i eth1 -p udp -m multiport --dports 5404,5405,5406 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
- sudo iptables -A OUTPUT -o eth1 -p udp -m multiport --sports 5404,5405,5406 -m conntrack --ctstate ESTABLISHED -j ACCEPT
建议使用比提供的示例更严格的防火墙规则。
安装 Corosync 和 Pacemaker
在两台服务器上,使用 apt-get 安装 Corosync 和 Pacemaker:
- sudo apt-get install pacemaker
请注意,Corosync 是作为 Pacemaker 软件包的依赖项安装的。
Corosync 和 Pacemaker 现已安装,但需要先对其进行配置,然后才能执行任何有用的操作。
配置Corosync
必须配置 Corosync,以便我们的服务器可以作为集群进行通信。
创建集群授权密钥
为了允许节点加入集群,Corosync 要求每个节点都拥有相同的集群授权密钥。
在主服务器上,安装 haveged
包:
- sudo apt-get install haveged
该软件包使我们能够轻松增加服务器上的熵量,这是 corosync-keygen
脚本所需要的。
在主服务器上,运行 corosync-keygen
脚本:
- sudo corosync-keygen
这将生成一个 128 字节的集群授权密钥,并将其写入 /etc/corosync/authkey
。
现在我们不再需要 haveged
包,让我们从主服务器中删除它:
- sudo apt-get remove --purge haveged
- sudo apt-get clean
在主服务器上,将 authkey
复制到辅助服务器:
- sudo scp /etc/corosync/authkey username@secondary_ip:/tmp
在辅助服务器上,将 authkey
文件移动到适当的位置,并将其权限限制为 root:
- sudo mv /tmp/authkey /etc/corosync
- sudo chown root: /etc/corosync/authkey
- sudo chmod 400 /etc/corosync/authkey
现在,两台服务器在 /etc/corosync/authkey
文件中应该有相同的授权密钥。
配置 Corosync 集群
为了让我们想要的集群启动并运行,我们必须设置这些
在两台服务器上,打开 corosync.conf
文件以在您喜欢的编辑器中进行编辑(我们将使用 vi
):
- sudo vi /etc/corosync/corosync.conf
这是一个 Corosync 配置文件,它允许您的服务器作为集群进行通信。请务必将突出显示的部分替换为适当的值。 bindnetaddr
应设置为您当前正在使用的服务器的私有 IP 地址。另外两个突出显示的项目应设置为指定服务器的私有 IP 地址。除了 bindnetaddr
之外,两台服务器上的文件应该相同。
使用此配置替换 corosync.conf
的内容,并根据您的环境进行特定更改:
- totem {
- version: 2
- cluster_name: lbcluster
- transport: udpu
- interface {
- ringnumber: 0
- bindnetaddr: server_private_IP_address
- broadcast: yes
- mcastport: 5405
- }
- }
-
- quorum {
- provider: corosync_votequorum
- two_node: 1
- }
-
- nodelist {
- node {
- ring0_addr: primary_private_IP_address
- name: primary
- nodeid: 1
- }
- node {
- ring0_addr: secondary_private_IP_address
- name: secondary
- nodeid: 2
- }
- }
-
- logging {
- to_logfile: yes
- logfile: /var/log/corosync/corosync.log
- to_syslog: yes
- timestamp: on
- }
图腾部分(第 1-11 行)指的是 Corosync 用于集群成员身份的 Totem 协议,指定集群成员应如何相互通信。在我们的设置中,重要的设置包括 transport:udpu
(指定单播模式)和 bindnetaddr
(指定 Corosync 应该绑定到哪个网络地址)。
仲裁部分(第 13-16 行)指定这是一个双节点集群,因此仲裁只需要一个节点 (two_node: 1
)。这是实现法定人数需要集群中至少三个节点这一事实的解决方法。此设置将允许我们的双节点集群选择一个协调器 (DC),它是在任何给定时间控制集群的节点。
节点列表部分(第 18-29 行)指定集群中的每个节点,以及如何到达每个节点。在这里,我们配置了主节点和辅助节点,并指定可以通过各自的私有 IP 地址访问它们。
日志记录部分(第 31-36 行)指定 Corosync 日志应写入 /var/log/corosync/corosync.log
。如果您在本教程的其余部分遇到任何问题,请务必在进行故障排除时查看此处。
保存并退出。
接下来,我们需要配置 Corosync 以允许 Pacemaker 服务。
在两台服务器上,使用编辑器在 Corosync 服务目录中创建 pcmk
文件。我们将使用 vi
:
- sudo vi /etc/corosync/service.d/pcmk
然后添加 Pacemaker 服务:
service {
name: pacemaker
ver: 1
}
保存并退出。这将包含在 Corosync 配置中,并允许 Pacemaker 使用 Corosync 与我们的服务器通信。
默认情况下,Corosync 服务处于禁用状态。在两台服务器上,通过编辑 /etc/default/corosync
来更改它:
- sudo vi /etc/default/corosync
将 START
的值更改为 yes
:
START=yes
保存并退出。现在我们可以启动 Corosync 服务了。
在两台服务器上,使用以下命令启动 Corosync:
- sudo service corosync start
一旦 Corosync 在两台服务器上运行,它们应该集群在一起。我们可以通过运行以下命令来验证这一点:
- sudo corosync-cmapctl | grep members
输出应该看起来像这样,这表明主节点(节点 1)和辅助节点(节点 2)已加入集群:
corosync-cmapctl output:runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(primary_private_IP_address)
runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.1.status (str) = joined
runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(secondary_private_IP_address)
runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.2.status (str) = joined
现在您已经正确设置了 Corosync,让我们继续配置 Pacemaker。
启动和配置 Pacemaker
Pacemaker 依赖于 Corosync 的消息传递功能,现在可以启动并配置其基本属性。
启用并启动起搏器
Pacemaker 服务需要运行 Corosync,因此默认情况下它是禁用的。
在两台服务器上,使用以下命令启用 Pacemaker 在系统启动时启动:
- sudo update-rc.d pacemaker defaults 20 01
通过前面的命令,我们将 Pacemaker 的启动优先级设置为 20
。重要的是指定一个高于 Corosync 的启动优先级(默认情况下为 19
),以便 Pacemaker 在 Corosync 之后启动。
现在让我们启动 Pacemaker:
- sudo service pacemaker start
要与 Pacemaker 交互,我们将使用 crm
实用程序。
使用 crm
检查 Pacemaker:
- sudo crm status
这应该输出如下内容(如果没有,请等待 30 秒,然后再次运行命令):
crm status:Last updated: Fri Oct 16 14:38:36 2015
Last change: Fri Oct 16 14:36:01 2015 via crmd on primary
Stack: corosync
Current DC: primary (1) - partition with quorum
Version: 1.1.10-42f2063
2 Nodes configured
0 Resources configured
Online: [ primary secondary ]
关于此输出,有几点需要注意。首先,当前 DC(指定协调器)应设置为 primary (1)
或 secondary (2)
。其次,应该配置 2 个节点和 0 个资源。第三,两个节点都应标记为在线。如果它们被标记为离线,请尝试等待 30 秒并再次检查状态以查看它是否自行更正。
从现在开始,您可能希望在另一个 SSH 窗口(连接到任一集群节点)中运行交互式 CRM 监视器。这将为您提供每个节点状态的实时更新,以及每个资源的运行位置:
- sudo crm_mon
此命令的输出看起来与 crm status
的输出相同,只是它连续运行。如果要退出,请按 Ctrl-C
。
配置集群属性
现在我们准备配置 Pacemaker 的基本属性。请注意,所有 Pacemaker (crm
) 命令都可以从任一节点服务器运行,因为它会自动同步所有成员节点中所有与集群相关的更改。
对于我们想要的设置,我们要禁用 STONITH——许多集群用来移除故障节点的一种模式——因为我们正在设置一个双节点集群。为此,请在任一服务器上运行此命令:
- sudo crm configure property stonith-enabled=false
我们还想在日志中禁用与仲裁相关的消息:
- sudo crm configure property no-quorum-policy=ignore
同样,此设置仅适用于 2 节点集群。
如果您想验证您的 Pacemaker 配置,请运行以下命令:
- sudo crm configure show
这将显示所有活动的起搏器设置。目前,这将仅包括两个节点,以及您刚刚设置的 STONITH 和 quorum 属性。
创建保留 IP 重新分配资源代理
现在 Pacemaker 正在运行和配置,我们需要添加资源以供其管理。正如介绍中提到的,资源是集群负责提供高可用性的服务。在 Pacemaker 中,添加资源需要使用资源代理,它充当将要管理的服务的接口。 Pacemaker 附带了几个用于公共服务的资源代理,并允许添加自定义资源代理。
在我们的设置中,我们希望确保我们的 Web 服务器(主要和辅助)提供的服务在主动/被动设置中高度可用,这意味着我们需要一种方法来确保我们的保留 IP 始终指向一个可用的服务器。为此,我们需要设置一个资源代理,每个节点都可以运行该资源代理来确定它是否拥有保留 IP,并在必要时运行脚本将保留 IP 指向自身。保留 IP 有时称为浮动 IP。在以下示例中,我们将资源代理称为“FloatIP OCF”,将保留 IP 重新分配脚本称为 assign-ip
。安装 FloatIP OCF 资源代理后,我们可以定义资源本身,我们将其称为 FloatIP
。
下载 assign-ip 脚本
正如我们刚才提到的,我们需要一个脚本来重新分配我们的保留 IP 指向哪个 Droplet,以防 FloatIP
资源需要移动到不同的节点。为此,我们将下载一个基本的 Python 脚本,该脚本使用 DigitalOcean API 将保留 IP 分配给给定的 Droplet ID。
在两台服务器上,下载 assign-ip
Python 脚本:
- 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 PAT(API 令牌):作为环境变量
DO_TOKEN
传入,您的读/写 DigitalOcean PAT
在继续之前,请随意查看脚本的内容。
所以,如果你想手动运行这个脚本来重新分配一个保留 IP,你可以这样运行它:DO_TOKEN=your_digitalocean_pat /usr/local/bin/assign-ip your_reserved_ip droplet_id
。但是,如果需要将 FloatIP
资源移动到其他节点,将从 FloatIP OCF 资源代理调用此脚本。
接下来让我们安装 Float IP Resource Agent。
下载 FloatIP OCF 资源代理
Pacemaker 允许通过将 OCF 资源代理放置在特定目录中来添加它们。
在两台服务器上,使用以下命令创建 digitalocean
资源代理提供程序目录:
- sudo mkdir /usr/lib/ocf/resource.d/digitalocean
在两台服务器上,下载 FloatIP OCF 资源代理:
- sudo curl -o /usr/lib/ocf/resource.d/digitalocean/floatip https://gist.githubusercontent.com/thisismitch/b4c91438e56bfe6b7bfb/raw/2dffe2ae52ba2df575baae46338c155adbaef678/floatip-ocf
在两台服务器上,使其可执行:
- sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip
在继续之前,请随意查看资源代理的内容。这是一个 bash 脚本,如果使用 start
命令调用,它将查找调用它的节点的 Droplet ID(通过元数据),并将保留 IP 分配给 Droplet ID。此外,它通过返回调用 Droplet 是否分配了保留 IP 来响应 status
和 monitor
命令。
它需要以下 OCF 参数:
- do_token:: 用于保留 IP 重新分配的 DigitalOcean API 令牌,即您的 DigitalOcean 个人访问令牌
- reserved_ip:: 您的保留 IP(地址),以防需要重新分配
现在我们可以使用 FloatIP OCF 资源代理来定义我们的 FloatIP
资源。
添加 FloatIP 资源
安装 FloatIP OCF 资源代理后,我们现在可以配置我们的 FloatIP
资源。
在任一服务器上,使用此命令创建 FloatIP
资源(请务必使用您自己的信息指定两个突出显示的参数):
- sudo crm configure primitive FloatIP ocf:digitalocean:floatip \
- params do_token=your_digitalocean_personal_access_token \
- reserved_ip=your_reserved_ip
这将使用我们之前创建的 FloatIP OCF 资源代理 (ocf:digitalocean:floatip
) 创建一个原始资源,它是一种通用类型的集群资源,称为“FloatIP”。请注意,它需要do_token
和 reserved_ip
作为参数传递。如果保留 IP 需要重新分配,将使用这些。
如果您检查集群的状态(sudo crm status
或 sudo crm_mon
),您应该会看到 FloatIP
资源已定义并启动您的节点之一:
crm_mon:...
2 Nodes configured
1 Resource configured
Online: [ primary secondary ]
FloatIP (ocf::digitalocean:floatip): Started primary
假设一切设置正确,您现在应该有一个主动/被动 HA 设置!就目前而言,如果启动 FloatIP
的节点离线或进入 standby
模式,保留 IP 将被重新分配给在线服务器。现在,如果活动节点(在我们的示例输出中为主要节点)变得不可用,集群将指示辅助节点启动 FloatIP
资源并为自己申请保留 IP 地址。重新分配发生后,保留 IP 会将用户定向到新激活的辅助服务器。
目前,仅当活动主机脱机或无法与集群通信时才会触发故障转移(保留 IP 重新分配)。此设置的更好版本将指定应由 Pacemaker 管理的其他资源。这将允许集群检测特定服务的故障,例如负载平衡器或网络服务器软件。不过,在设置之前,我们应该确保基本的故障转移工作正常。
测试高可用性
测试我们的高可用性设置是否有效很重要,所以让我们现在开始吧。
目前,保留 IP 已分配给您的其中一个节点(假设是主节点)。现在通过 IP 地址或指向它的域名访问保留 IP,将只显示主服务器的索引页面。如果您使用示例用户数据脚本,它将如下所示:
Reserved IP is pointing to primary server:Droplet: primary, IP Address: primary_ip_address
这表明保留 IP 实际上已分配给主要 Droplet。
现在,让我们打开一个新的本地终端并使用 curl
在 1 秒循环中访问保留 IP。使用此命令执行此操作,但请务必将 URL 替换为您的域或保留的 IP 地址:
- while true; do curl reserved_IP_address; sleep 1; done
目前,这将输出与主服务器相同的 Droplet 名称和 IP 地址。如果我们通过关闭主服务器电源或将主节点的集群状态更改为 standby
导致主服务器发生故障,我们将查看保留 IP 是否被重新分配给辅助服务器。
现在让我们重新启动主服务器。通过 DigitalOcean 控制面板或在主服务器上运行此命令来执行此操作:
- sudo reboot
片刻之后,主服务器应该变得不可用。注意终端中运行的 curl
循环的输出。您应该注意到如下所示的输出:
curl loop output:Droplet: primary, IP Address: primary_IP_address
...
curl: (7) Failed to connect to reserved_IP_address port 80: Connection refused
Droplet: secondary, IP Address: secondary_IP_address
...
也就是说,应重新分配保留 IP 地址以指向辅助服务器的 IP 地址。这意味着您的 HA 设置正在运行,因为已成功进行自动故障转移。
您可能会看到也可能不会看到 Connection refused
错误,如果您在主服务器故障和保留 IP 重新分配完成之间尝试访问保留 IP,就会发生这种情况。
如果检查 Pacemaker 的状态,您应该会看到 FloatIP
资源已在辅助服务器上启动。此外,主服务器应暂时标记为 OFFLINE
,但会在完成重启并重新加入集群后立即加入 Online
列表。
故障转移故障排除(可选)
如果您的 HA 设置按预期工作,请跳过此部分。如果故障转移没有按预期发生,您应该在继续之前检查您的设置。特别是,请确保对您自己的设置的任何引用,例如节点 IP 地址、您的保留 IP 和您的 API 令牌。
用于故障排除的有用命令
以下是一些可以帮助您对设置进行故障排除的命令。
如前所述,crm_mon
工具对于查看节点和资源的实时状态非常有帮助:
- sudo crm_mon
此外,您可以使用以下命令查看集群配置:
- sudo crm configure show
如果 crm
命令根本不起作用,您应该查看 Corosync 日志以获取线索:
- sudo tail -f /var/log/corosync/corosync.log
杂项 CRM 命令
这些命令在配置集群时很有用。
您可以使用以下命令将节点设置为 standby
模式,该模式可用于模拟节点变得不可用:
- sudo crm node standby NodeName
您可以使用以下命令将节点的状态从 standby
更改为 online
:
- sudo crm node online NodeName
您可以使用以下命令编辑资源,从而允许您重新配置它:
sudo crm configure edit ResourceName
您可以使用以下命令删除必须在删除之前停止的资源:
- sudo crm resource stop ResourceName
- sudo crm configure delete ResourceName
最后,crm
命令可以单独运行以访问交互式 crm
提示:
- crm
我们不会介绍交互式 crm
提示符的用法,但它可用于执行到目前为止我们已完成的所有 crm
配置。
添加 Nginx 资源(可选)
现在您确定您的保留 IP 故障转移有效,让我们看看向您的集群添加新资源。在我们的示例设置中,Nginx 是我们提供高可用性的主要服务,因此让我们将其添加为集群将管理的资源。
Pacemaker自带Nginx资源代理,所以我们可以很方便的将Nginx添加为集群资源。
使用此命令创建一个名为“Nginx”的新原始集群资源:
- sudo crm configure primitive Nginx ocf:heartbeat:nginx \
- params httpd="/usr/sbin/nginx" \
- op start timeout="40s" interval="0" \
- op monitor timeout="30s" interval="10s" on-fail="restart" \
- op stop timeout="60s" interval="0"
指定的资源告诉集群每 10 秒监视一次 Nginx,并在它变得不可用时重新启动它。
使用 sudo crm_mon
或 sudo crm status
检查集群资源的状态:
crm_mon:...
Online: [ primary secondary ]
FloatIP (ocf::digitalocean:floatip): Started primary
Nginx (ocf::heartbeat:nginx): Started secondary
不幸的是,Pacemaker 将决定在单独的节点上启动 Nginx
和 FloatIP
资源,因为我们没有定义任何资源限制。这是一个问题,因为这意味着保留 IP 将指向一个 Droplet,而 Nginx 服务将仅在另一个 Droplet 上运行。访问保留 IP 会将您指向未运行本应具有高可用性的服务的服务器。
为了解决这个问题,我们将创建一个克隆资源,它指定一个现有的原始资源应该在多个节点上启动。
使用以下命令创建名为 \Nginx-clone 的 Nginx
资源的克隆资源:
- sudo crm configure clone Nginx-clone Nginx
集群状态现在应该如下所示:
crm_mon:Online: [ primary secondary ]
FloatIP (ocf::digitalocean:floatip): Started primary
Clone Set: Nginx-clone [Nginx]
Started: [ primary secondary ]
如您所见,克隆资源 Nginx-clone
现在已在我们的两个节点上启动。
最后一步是配置托管限制,以指定 FloatIP
资源应在具有活动 Nginx-clone
资源的节点上运行。要创建名为“FloatIP-Nginx”的托管限制,请使用以下命令:
- sudo crm configure colocation FloatIP-Nginx inf: FloatIP Nginx-clone
您不会在 crm status
输出中看到任何差异,但您可以看到托管资源是使用以下命令创建的:
- sudo crm configure show
现在,您的两台服务器都应该运行 Nginx,而只有其中一台运行 FloatIP
资源。现在是通过停止 Nginx 服务并重新启动或关闭活动服务器来测试 HA 设置的好时机。
结论
恭喜!您现在已经使用 Corosync、Pacemaker 和 DigitalOcean 保留 IP 设置了基本的 HA 服务器设置。
下一步是用反向代理负载平衡器替换示例 Nginx 设置。为此,您可以使用 Nginx 或 HAProxy。请记住,您需要将负载均衡器绑定到锚定 IP 地址,以便您的用户只能通过保留 IP 地址(而不是通过每个服务器的公共 IP 地址)访问您的服务器。如何在 Ubuntu 14.04 上使用 Corosync、Pacemaker 和保留 IP 创建高可用性 HAProxy 设置教程中详细介绍了此过程。