如何在 Ubuntu 14.04 上使用 Corosync、Pacemaker 和保留 IP 创建高可用性设置

介绍

本教程将展示如何使用Corosync和Pacemaker与备用IP创建高可用性(HA)服务器基础设施在DigitalOcean。

Corosync 是一个开源程序,为客户端服务器提供群集会员和消息传递功能,通常称为 messaging 层,Pacemaker 是一个开源群集资源管理(CRM),一个系统,协调资源和服务,由群集管理和高度可用。

目标

完成后,HA设置将由两个以活性/被动配置的Ubuntu 14.04服务器组成. 这将通过指向一个保存的 IP( 即您的用户将如何访问您的网络服务) 来完成, 指向主服务器, 除非检测到失败 。 如果Pacemaker检测到主服务器无法使用,二级(被动)服务器将自动运行一个脚本,通过数字Ocean API将保留IP重新分配给自己. 因此,之后的网络流量到Reserved IP将会被引导到您的二级服务器,该服务器将充当活动服务器并处理来袭流量.

此图表展示了所描述的设置的概念:

Active/passive Diagram

<$>[注] 注: 本教程只涵盖在网关级别设置活跃/被动高可用性,也就是说,它包括保留的IP,以及 _load balancer_服务器—Primary和Secondary。

为了实现这一目标,我们将遵循以下步骤:

  • 创建 2 个将接收流量的 Droplets * 创建保留 IP 并分配给其中一个 Droplets * 安装和配置 Corosync * 安装和配置 Pacemaker * 配置保留 IP 重新分配集群资源 * 测试故障 * 配置 Nginx 集群资源

前提条件

为了实现预留IP调用自动化,我们必须使用"数字海洋"API. 这意味着您需要生成一个个人访问Token(PAT),这是一个API令牌,可以用来认证您的 DigitalOcean 账户,通过遵循API 教程的 [如何生成个人访问Token] (https://andsky.com/tech/tutorials/how-to-use-the-digitalocean-api-v2# how-to-generate-a-personal-access-token) 路段,使用_read_和_write_访问. 您的 PAT 将被使用在一个脚本中, 将添加到您的集群中的两台服务器中, 所以请保证它安全, 因为它允许您完全访问您的数字海洋账户以供参考 .

除了API之外,本教程还使用以下DigitalOcean功能:

请阅读链接的教程,如果你想了解更多关于他们。

创建滴滴

第一步是在同一个数据中心内创建两个Ubuntu Droplets,并启用私人网络,它们将作为上文所述的一级和二级服务器。 在我们的榜样设置中,我们将命名它们为"初级"和"二级",以方便参考. 我们将在两个Droplets上安装Nginx,并用能够独特识别它们的信息来替换它们的索引页. 这将让我们有一个简单的方式来证明医管局的设置正在发挥作用。 对于真正的设置,您的服务器应当运行您选择的网络服务器或加载平衡器,如Nginx或HAProxy.

创建两个Ubuntu 14.04 Droplets, primary 和** secondary** . 如果您想遵循示例设置,请使用此 Bash 脚本作为用户数据:

1[label Example User Data]
2#!/bin/bash
3
4apt-get -y update
5apt-get -y install nginx
6export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
7export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
8echo Droplet: $HOSTNAME, IP Address: $PUBLIC_IPV4 > /usr/share/nginx/html/index.html

这些用户数据将安装 Nginx 并用 droplet 的主机名和 IP 地址替换 index.html 的内容(通过引用 Metadata 服务)。通过其公共 IP 地址访问 either Droplet 将显示一个具有 Droplet 主机名和 IP 地址的基本网页,这将有助于测试 Droplet the Reserved IP 在任何特定时刻指向哪个。

创建一个保留的 IP

DigitalOcean控制面板中,点击网络在顶部菜单中,然后点击保留IP在侧面菜单中。

No Reserved IPs

将保留的 IP 分配到您的 主要 Droplet,然后单击** 指定保留的 IP ** 按钮。

已分配保留 IP 后,请记住其 IP 地址. 检查您可以通过访问 Web 浏览器中的保留 IP 地址来访问其分配的 Droplet。

1http://your_reserved_ip

您应该看到您的主要Droplet的索引页面。

配置 DNS (可选)

如果您想通过域名访问您的 HA 设置,请继续在您的 DNS 中创建一个 A 记录 ,将您的域名指向您的保留 IP 地址。如果您的域名使用 DigitalOcean 的名称服务器,请遵循 步骤三 关于如何使用 DigitalOcean 设置主机名称的教程。一旦传播,您可以通过域名访问您的活跃服务器。

我們將使用的範例網域名稱是「example.com」。 如果您目前沒有使用的網域名稱,您將使用保留的 IP 地址來存取您的設定。

设置时间同步

每当你有多个服务器彼此通信时,尤其是在集群软件中,重要的是确保他们的时钟同步。

两个服务器上 ,使用此命令打开时区选择器:

1sudo dpkg-reconfigure tzdata

例如,我们会选择美国/纽约

接下来,更新 apt-get:

1sudo apt-get update

然后用这个命令安装ntp包;

1sudo apt-get -y install ntp

要了解更多关于 NTP 的信息,请参阅本教程: 配置时区和网络时间协议同步

设置防火墙

Corosync 使用 54045406 端口之间的 UDP 传输. 如果您正在运行防火墙,请确保在这些端口上允许服务器之间的通信。

例如,如果您使用「iptables」,您可以使用以下命令允许这些端口和「eth1」(私人网络接口)上的流量:

1sudo iptables -A INPUT  -i eth1 -p udp -m multiport --dports 5404,5405,5406 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
2sudo 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:

1sudo apt-get install pacemaker

请注意, Corosync 安装为 Pacemaker 包的依赖。

Corosync 和 Pacemaker 现在已安装,但他们需要配置,才能做任何有用的事情。

配置 Corosync

Corosync必须配置,以便我们的服务器可以作为一个集群进行通信。

创建集群授权密钥

为了允许节点加入集群,Corosync 要求每个节点都具有相同的集群授权密钥。

primary 服务器上,安装haveged包:

1sudo apt-get install haveged

这个软件包允许我们轻松地增加我们服务器上的量,这是corosync-keygen脚本所要求的。

primary 服务器上,运行corosync-keygen脚本:

1sudo corosync-keygen

这将生成一个128字节的集群授权密钥,并将其写入/etc/corosync/authkey

现在我们不再需要haveged包,让我们从 primary 服务器中删除它:

1sudo apt-get remove --purge haveged
2sudo apt-get clean

主要 服务器上,将authkey复制到次要服务器:

1sudo scp /etc/corosync/authkey username@secondary_ip:/tmp

二级服务器上,将authkey文件移动到正确的位置,并限制其对根的权限:

1sudo mv /tmp/authkey /etc/corosync
2sudo chown root: /etc/corosync/authkey
3sudo chmod 400 /etc/corosync/authkey

现在,两个服务器都应该在 /etc/corosync/authkey 文件中具有相同的授权密钥。

配置 Corosync 集群

为了获得我们想要的集群并运行,我们必须设置这些

两个服务器 上,打开):

1sudo vi /etc/corosync/corosync.conf

这里有一个 Corosync 配置文件,将允许您的服务器作为一个集群进行通信. 请确保用适当的值来替换突出的部分. bindnetaddr 应该设置为您目前正在工作的服务器的私人 IP 地址. 其他两个突出的项目应该设置为指定的服务器的私人 IP 地址. 除了 bindnetaddr,文件应该在两个服务器上相同。

用此配置取代「corosync.conf」的内容,并对您的环境做出具体的更改:

 1[label /etc/corosync/corosync.conf]
 2totem {
 3  version: 2
 4  cluster_name: lbcluster
 5  transport: udpu
 6  interface {
 7    ringnumber: 0
 8    bindnetaddr: server_private_IP_address
 9    broadcast: yes
10    mcastport: 5405
11  }
12}
13
14quorum {
15  provider: corosync_votequorum
16  two_node: 1
17}
18
19nodelist {
20  node {
21    ring0_addr: primary_private_IP_address
22    name: primary
23    nodeid: 1
24  }
25  node {
26    ring0_addr: secondary_private_IP_address
27    name: secondary
28    nodeid: 2
29  }
30}
31
32logging {
33  to_logfile: yes
34  logfile: /var/log/corosync/corosync.log
35  to_syslog: yes
36  timestamp: on
37}

totem 部分(第 1 至 11 行)中,它指的是 Corosync 用于群集成员的 Totem 协议,它规定了群集成员应该如何彼此通信。

quorum 部分(13至16条)规定,这是一个两个节点的集群,所以只需要一个节点(two_node: 1)的集群。 这是一个解决方案,即要在集群中至少需要3个节点才能达到定数。

节点列表( 18 至 29 行)说明集群中的每个节点,以及如何访问每个节点. 在这里,我们配置我们的主要节点和次要节点,并说明它们可以通过各自的私人 IP 地址访问。

logging 部分( 31-36 行)规定 Corosync 日志应写为 `/var/log/corosync/corosync.log。

保存和退出。

接下来,我们需要配置 Corosync 以允许 Pacemaker 服务。

两个服务器 上,使用编辑器在Corosync服务目录中创建pcmk文件,我们将使用vi:

1sudo vi /etc/corosync/service.d/pcmk

然后添加 Pacemaker 服务:

1service {
2  name: pacemaker
3  ver: 1
4}

这将包含在 Corosync 配置中,并允许 Pacemaker 使用 Corosync 与我们的服务器进行通信。

默认情况下, Corosync 服务被禁用. 在 两个服务器 上,通过编辑 /etc/default/corosync 来更改:

1sudo vi /etc/default/corosync

开始值更改为:

1[label /etc/default/corosync]
2START=yes

保存和退出.现在我们可以启动 Corosync 服务。

两台 服务器上,使用此命令启动 Corosync:

1sudo service corosync start

一旦 Corosync 在两台服务器上运行,它们就应该聚合在一起,我们可以通过运行以下命令来验证这一点:

1sudo corosync-cmapctl | grep members

输出应该看起来像这样,这表明主要(节点1)和次要(节点2)已加入集群:

1[secondary_label corosync-cmapctl output:]
2runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
3runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(primary_private_IP_address)
4runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1
5runtime.totem.pg.mrp.srp.members.1.status (str) = joined
6runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0
7runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(secondary_private_IP_address)
8runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
9runtime.totem.pg.mrp.srp.members.2.status (str) = joined

现在你已经正确设置了Corosync,让我们继续配置Pacemaker。

启动和配置 Pacemaker

Pacemaker,这取决于Corosync的消息传递能力,现在已经准备好启动并配置其基本属性。

启用和启动 Pacemaker

Pacemaker 服务需要 Corosync 运行,因此默认情况下被禁用。

两台服务器上 ,允许 Pacemaker 使用此命令启动系统启动:

1sudo update-rc.d pacemaker defaults 20 01

使用预先命令,我们将Pacemaker的开始优先级设置为),以便Pacemaker在Corosync之后启动。

现在,让我们开始Pacemaker:

1sudo service pacemaker start

为了与 Pacemaker 进行交互,我们将使用crm实用程序。

点击crm来检查 Pacemaker:

1sudo crm status

这应该输出这样的东西(如果没有,等待30秒,然后再次运行命令):

 1[secondary_label crm status:]
 2Last updated: Fri Oct 16 14:38:36 2015
 3Last change: Fri Oct 16 14:36:01 2015 via crmd on primary
 4Stack: corosync
 5Current DC: primary (1) - partition with quorum
 6Version: 1.1.10-42f2063
 72 Nodes configured
 80 Resources configured
 9
10Online: [ primary secondary ]

首先, 当前 DC (指定协调员)应设置为)`。第二,应该有** 2 节点配置** 和** 0 资源配置** 。

从此开始,您可能希望在另一个 SSH 窗口中运行交互式 CRM 监视器(连接到两个集群节点)。

1sudo crm_mon

此命令的输出看起来与crm status的输出相同,除非它连续运行。

配置群集属性

现在我们已经准备好配置 Pacemaker 的基本属性了,请注意,所有 Pacemaker (‘crm’) 命令都可以从任何一个节点服务器运行,因为它会自动在所有成员节点上同步所有集群相关的更改。

对于我们想要的设置,我们想要禁用 STONITH – 这是许多集群用来删除错误节点的模式 – 因为我们正在设置一个两个节点集群。

1sudo crm configure property stonith-enabled=false

我们还希望在日志中禁用与定数相关的消息:

1sudo crm configure property no-quorum-policy=ignore

再次,此设置仅适用于 2 节点集群。

如果您想验证您的 Pacemaker 配置,请运行此命令:

1sudo crm configure show

这将显示您的所有活跃的 Pacemaker 设置. 目前,这只包括两个节点,以及您刚刚设置的 STONITH 和 quorum 属性。

创建备用 IP 重新分配资源代理

现在 Pacemaker 正在运行和配置,我们需要为其添加资源来管理它。正如介绍中提到的,资源是群集负责使其高度可用性的服务。在 Pacemaker 中,添加资源需要使用 资源代理 ,它作为将被管理的服务的接口。

在我们的设置中,我们希望确保我们的网络服务器主要 和** 次要** 所提供的服务在一个主动/被动的设置中是高度可用的,这意味着我们需要一种方法来确保我们的备用IP总是指向一个可用的服务器. 要做到这一点,我们需要建立一个** 资源代理** ,每个节点可以运行以确定它是否拥有所保留的IP,必要时运行一个脚本来指向所保留的IP. 所保留的IP有时被称作"浮动IP". 在以下例子中,我们将资源代理称为"FloatIP OCF",保留IP调用脚本称为"Assign-ip". 一旦安装了FloatIPOCF资源代理,我们就可以定义资源本身,我们将称之为"FloatIP".

下载 assign-ip 脚本

正如我们刚才提到的,我们需要一个脚本,可以重新分配我们的保留IP Droplet指向,如果‘FloatIP’资源需要移动到另一个节点. 为此,我们将下载一个基本的Python脚本,将保留IP分配给给定的Droplet ID,使用DigitalOcean API。

两个服务器上 下载assign-ip Python 脚本:

1sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip

两个服务器上 ,使其可执行:

1sudo chmod +x /usr/local/bin/assign-ip

使用assign-ip脚本需要以下细节:

保留IP: 该脚本的第一个参数,被分配的保留IP* Droplet ID:* 该脚本的第二个参数,该保留IP应该分配给** 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 资源代理。

下载 FloatIP OCF 资源代理

Pacemaker 允许通过将它们放入特定目录来添加 OCF 资源代理。

两个服务器上 ,使用此命令创建digitalocean资源代理提供商目录:

1sudo mkdir /usr/lib/ocf/resource.d/digitalocean

在两个服务器上,下载 FloatIP OCF 资源代理:

1sudo curl -o /usr/lib/ocf/resource.d/digitalocean/floatip https://gist.githubusercontent.com/thisismitch/b4c91438e56bfe6b7bfb/raw/2dffe2ae52ba2df575baae46338c155adbaef678/floatip-ocf

两个服务器上 ,使其可执行:

1sudo chmod +x /usr/lib/ocf/resource.d/digitalocean/floatip

这是一个bash脚本,如果用),并将保留IP分配给Droplet ID。

它需要以下OCF参数:

do_token: :用于保留IP重新分配的DigitalOcean API代币,即您的DigitalOcean个人访问代币* reserved_ip:* :您的保留IP(地址),如果需要重新分配

现在我们可以使用FloatIP OCF资源代理来定义我们的FloatIP资源。

添加 FloatIP 资源

有了我们的FloatIP OCF资源代理安装,我们现在可以配置我们的FloatIP资源。

在任何一个服务器上,使用这个命令创建):

1sudo crm configure primitive FloatIP ocf:digitalocean:floatip \
2  params do_token=your_digitalocean_personal_access_token \
3  reserved_ip=your_reserved_ip

这会创建一个原始的资源,这是一种通用类型的集群资源,称为)。请注意,它需要将do_tokenreserved_ip作为参数传递。

如果您检查群集的状态(‘sudo crm status’ 或 ‘sudo crm_mon’),您应该看到‘FloatIP’资源定义并在您的一个节点上启动:

1[secondary_label crm_mon:]
2...
32 Nodes configured
41 Resource configured
5
6Online: [ primary secondary ]
7
8 FloatIP	(ocf::digitalocean:floatip):	Started primary

假设一切正常,你现在应该有一个积极/被动的HA设置! 目前,如果启动 " FloatIP " 的节点离线或进入 " 备用 " 模式,保留IP将重新分配给在线服务器。 现在,如果在我们的示例产出中,活动节点无法使用,集群将指示 二级** 节点启动`FloatIP ' 资源,并为自己要求保留IP地址。 一旦重新分配,保留IP将引导用户到新活跃的** second** 服务器.

目前,故障转移(保留IP重新分配)仅在活跃的主机离线或无法与群集进行通信时才会触发。 这种设置的更好的版本会指定由Pacemaker管理的额外资源。 这将允许群集检测特定服务的故障,例如负载平衡器或Web服务器软件。

测试高可用性

测试我们的高可用性设置是否有效很重要,所以让我们现在这样做。

目前,保留 IP 被分配给您的一个节点(假设是 primary )。 现在通过 IP 地址或指向其域名访问保留 IP,只会显示** primary** 服务器的索引页面。

1[secondary_label Reserved IP is pointing to primary server:]
2Droplet: primary, IP Address: primary_ip_address

这表明,保留的IP实际上被分配给了主要的Droplet。

现在,让我们打开一个新的本地终端,并使用弯曲在1秒钟内访问保留IP。

1while true; do curl reserved_IP_address; sleep 1; done

目前,这将输出主服务器的相同 Droplet 名称和 IP 地址. 如果我们导致主服务器失败,通过关闭它或改变主节点的集群状态为待机,我们将看到保留的 IP 是否被重新分配到次要服务器。

现在让我们重新启动 primary 服务器,通过 DigitalOcean 控制面板或在主要服务器上运行此命令:

1sudo reboot

几秒钟后,主服务器应该变得不可用。 注意在终端运行的弯曲循环的输出。

1[secondary_label curl loop output:]
2Droplet: primary, IP Address: primary_IP_address
3...
4curl: (7) Failed to connect to reserved_IP_address port 80: Connection refused
5Droplet: secondary, IP Address: secondary_IP_address
6...

也就是说,应重新分配保留的IP地址,以指向二级服务器的IP地址,这意味着您的HA设置正在工作,因为成功的自动故障发生了。

您可能会看到连接被拒绝错误,如果您尝试访问主服务器故障和完成保留 IP 重新分配之间保留 IP。

如果你检查 Pacemaker 的状态,你应该看到FloatIP资源在 二级 服务器上启动,同时,** 主要** 服务器应该暂时标记为OFFLINE,但一旦重新启动并重新加入集群,它就会加入在线列表。

故障排除故障(可选)

如果您的 HA 设置按预期运行,请跳过本节,如果故障发生不如预期,您应在继续之前审查您的设置,特别是请确保对您自己的设置有任何参考,例如节点 IP 地址、保留 IP 和 API 代码。

有用的命令来解决问题

这里有一些命令可以帮助您解决您的设置问题。

如前所述,crm_mon 工具可帮助您查看节点和资源的实时状态:

1sudo crm_mon

此外,您可以使用此命令查看您的集群配置:

1sudo crm configure show

如果crm命令根本不起作用,您应该查看Corosync日志以获取线索:

1sudo tail -f /var/log/corosync/corosync.log

错误的 CRM 命令

这些命令在配置集群时可能有用。

您可以将节点设置为待机模式,可以用这个命令模拟一个节点变得不可用:

1sudo crm node standby NodeName

您可以使用此命令将节点的状态从待机更改为在线:

1sudo crm node online NodeName

您可以使用此命令编辑资源,允许您重新配置它:

1sudo crm configure edit ResourceName

您可以使用以下命令删除必须在删除之前停止的资源:

1sudo crm resource stop ResourceName
2sudo crm configure delete ResourceName

最后,crm命令可以自行运行,以访问一个交互式的crm提示:

1crm

我们不会涵盖交互式crm提示的使用,但它可以用来完成我们迄今为止所做的所有crm配置。

添加 Nginx 资源(可选)

现在你已经确定你的保留 IP 故障转移工作了,让我们来看看添加一个新的资源到你的集群. 在我们的示例设置中, Nginx 是我们正在提供的主要服务,所以让我们把它作为一个资源添加到我们的集群将管理。

Pacemaker 配备了 Nginx 资源代理,因此我们可以轻松地将 Nginx 添加为群集资源。

使用此命令创建一个名为Nginx的新原始集群资源:

1sudo crm configure primitive Nginx ocf:heartbeat:nginx \
2  params httpd="/usr/sbin/nginx" \
3  op start timeout="40s" interval="0" \
4  op monitor timeout="30s" interval="10s" on-fail="restart" \
5  op stop timeout="60s" interval="0"

指定的资源告诉群集每10秒监控 Nginx,并在不可用时重新启动。

通过使用sudo crm_monsudo crm status来检查群集资源的状态:

1[secondary_label crm_mon:]
2...
3Online: [ primary secondary ]
4
5 FloatIP	(ocf::digitalocean:floatip):	Started primary
6 Nginx	(ocf::heartbeat:nginx):	Started secondary

不幸的是,Pacemaker将决定在单独的节点上启动NginxFloatIP资源,因为我们没有定义任何资源限制,这是一个问题,因为这意味着保留的IP将指向一个Dropplet,而Nginx服务只会在另一个Dropplet上运行。

要解决此问题,我们将创建一个 clone 资源,该资源将指定一个现有原始资源应该在多个节点上启动。

使用此命令创建一个名为Nginx-cloneNginx资源的克隆资源:

1sudo crm configure clone Nginx-clone Nginx

集群状态现在应该看起来像这样:

1[secondary_label crm_mon:]
2Online: [ primary secondary ]
3
4FloatIP (ocf::digitalocean:floatip):    Started primary
5 Clone Set: Nginx-clone [Nginx]
6     Started: [ primary secondary ]

正如你所看到的,克隆资源Nginx克隆现在已经在我们的两个节点上启动了。

最后一个步骤是配置一个 colocation 限制,以指定FloatIP资源应在具有活跃的Nginx-clone资源的节点上运行。

1sudo crm configure colocation FloatIP-Nginx inf: FloatIP Nginx-clone

您不会看到crm 状态输出的任何差异,但您可以看到使用此命令创建了对话资源:

1sudo crm configure show

现在,你的两个服务器都应该有 Nginx 运行,而只有其中一个有FloatIP资源运行,现在是测试你的 HA 设置的好时机,停止你的 Nginx 服务并重新启动或关闭你的 活跃 服务器。

结论

恭喜您!您现在有使用 Corosync、Pacemaker 和 DigitalOcean Reserved IP 的基本 HA 服务器设置。

下一步是用倒置负载平衡器取代Nginx设置的例子. 可以为此使用Nginx或HAProxy. 记住,您会想将您的负载平衡器绑定在anchor IP地址 上,以便您的用户只能通过保留IP地址访问您的服务器(而不是通过每个服务器的公开IP地址). 在Ubuntu 14.04上的如何与Corosync、Pacemaker和保留IP一起创建高可用HAProxy设置教程中详细介绍了这一过程.

Published At
Categories with 技术
comments powered by Disqus