如何在 Ubuntu 16.04 上使用心跳和预留 IP 创建高可用性设置

介绍

Heartbeat 是一个开源程序,为客户端服务器提供集群基础设施功能 - 集群会员资格和消息传递 - 这些功能是高可用性 (HA) 服务器基础设施的关键组成部分. 在本教程中,我们将展示如何通过简单地使用 Heartbeat 和 DigitalOcean Reserved IP创建一个 2 节 HA 服务器设置。

Heartbeat一般与Pacemaker等集群资源管理器(CRM)并用来实现完整的HA设置. 如果您想要创建更坚固的 HA 设置,请考虑使用 [Corosync and Pacemaker] (https://andsky.com/tech/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-and-floating-ips-on-ubuntu-14-04) 或 [保持生命 (https://andsky.com/tech/tutorials/how-to-set-up-highly-available-web-servers-with-keepalived-and-floating-ips-on-ubuntu-14-04) .

目标

完成后,HA设置将由两个以活性/被动配置的Ubuntu 16.04服务器组成. 这将通过指向一个保存的IP来实现,这就是你的用户将如何访问您的服务或网站,指向主服务器——或活动服务器,除非检测出故障. 如果Heartbeat服务发现主服务器无法使用,二级服务器会自动运行一个脚本来通过"数字海洋API"将所保留的IP重新分配给自己. 因此,之后的网络流量到Reserved IP会被引导到您的二级服务器上,在主服务器再次可用之前,该服务器将充当活动服务器(此时,主服务器会将Reserved IP重新分配给自己).

Active/passive Diagram

<$>[注] 注: 本教程旨在用于演示目的,只涵盖设置可靠HA解决方案的一些方面。本文的主要采集内容是如何在网关水平上安装活跃/被动节点,并将它们绑定到保留IP。

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

  • 创建 2 个将接收流量的 Droplets * 创建一个保留的 IP 并将其分配给其中一个 Droplets * 创建一个 DNS 指向保留的 IP 的记录 (可选) * 在 Droplets 上安装 Heartbeat * 配置 Heartbeat 运行保留的 IP 重分配服务 * 创建保留的 IP 重分配服务 * 测试故障

考虑到这一目标,我们可以开始在建立我们的HA设置上工作。

前提条件

为了实现预留IP调用自动化,我们必须使用"数字海洋"API. 这意味着您需要生成个人访问Token( PAT),这是一个API 令牌,可以用来认证您的 DigitalOcean 账户,并有 _read_和 write access. 您可以遵循 API 教程中的 [如何生成个人访问 Token] (https://andsky.com/tech/tutorials/how-to-use-the-digitalocean-api-v2# how-to-generate-a-personal-access-token ) 部分来达到此目的 。 您的 PAT 将被添加到您的集群中的两个服务器的脚本中 。 重要的是,你应该把它保存在安全的地方供参考,因为它可以完全进入你的数字海洋账户.

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

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

创建滴滴

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

创建两个Ubuntu 16.04 Droplets, 主要 和** 次要** ,使用这个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 > /var/www/html/index.html

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

创建一个保留的 IP

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

No Reserved IPs

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

已分配保留 IP 后,请检查您可以通过在 Web 浏览器中访问该 Droplet 来访问该 Droplet。

1http://your_reserved_ip

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

配置 DNS (可选)

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

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

安装 Heartbeat

下一步是將 Heartbeat 安裝到兩個伺服器上,安裝 Heartbeat 的最簡單方法是使用 apt-get:

1sudo apt-get update
2sudo apt-get install heartbeat

Heartbeat 现在已安装,但它需要配置之前它会做任何事情。

配置心跳

为了实现我们想要的集群并运行,我们必须在两个服务器的 `/etc/ha.d 目录中创建和设置这些 Heartbeat 配置文件:

  1. ha.cf — 包括其会员节点在内的Heartbeat群集的全球配置 2.** authkeys** — 包含一个安全密钥,为节点提供身份验证的途径 3.** haresources** — 指定由群集管理的服务和服务的首选所有者节点。

我们还需要提供一个脚本,以便在主 Droplet 的可用性发生变化的情况下执行保留 IP 重新分配。

收集节点信息

在配置ha.cf之前,我们应该查找每个节点的名称. Heartbeat 要求每个节点的名称匹配其相应的uname -n输出。

两台服务器上 ,运行此命令以搜索相应的节点名称:

1uname -n

示例节点名为主要次要,这与我们称之为Dropplets相匹配。

为了确定哪些节点可用,我们还需要查找每个节点将使用的网络接口和IP地址,以与群集的其余部分进行通信. 您可以使用任何网络接口,只要每个节点可以到达群集中的其他节点。

两个服务器上 ,使用此命令搜索):

1ip addr show eth0
1[secondary_label ip addr show eth0 output:]
22: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
3    link/ether 04:01:76:a5:45:01 brd ff:ff:ff:ff:ff:ff
4    inet 198.51.100.5/24 brd 198.51.100.255 scope global eth0
5       valid_lft forever preferred_lft forever
6    inet 10.17.0.28/16 scope global eth0
7       valid_lft forever preferred_lft forever
8    inet6 fe80::601:76ff:fea5:4501/64 scope link
9       valid_lft forever preferred_lft forever

注意网络接口的IP地址(示例中突出)。

创建 ha.cf 文件

两个服务器上 ,打开您最喜欢的编辑器中的 `/etc/ha.d/ha.cf。

1sudo nano /etc/ha.d/ha.cf

该文件应该是新的和空的. 我们需要添加网络接口和每个节点的名称在我们的集群。

将此配置复制并粘贴到文件中,然后将各自的节点名称和 IP 地址替换为我们先前查到的值。

1[label /etc/ha.d/ha.cf]
2node primary
3ucast eth0 198.51.100.5
4node secondary
5ucast eth0 198.51.100.6

保存和退出文件. 接下来,我们将设置集群的授权密钥。

创建 authkeys 文件

授权密钥用于允许群集成员加入群集,我们可以简单地为此目的生成随机密钥。

primary 节点上,运行以下命令,在名为AUTH_KEY的环境变量中生成合适的授权密钥:

1[environment second]
2if [ -z "${AUTH_KEY}" ]; then
3  export AUTH_KEY="$(command dd if='/dev/urandom' bs=512 count=1 2>'/dev/null' \
4      | command openssl sha1 \
5      | command cut --delimiter=' ' --fields=2)"
6fi

然后用这些命令写入 /etc/ha.d/authkeys 文件:

1[environment second]
2sudo bash -c "{
3  echo auth1
4  echo 1 sha1 $AUTH_KEY
5} > /etc/ha.d/authkeys"

检查authkeys文件的内容如下:

1[environment second]
2sudo cat /etc/ha.d/authkeys

它应该看起来像这样的东西(具有不同的授权密钥):

1[label /etc/ha.d/authkeys ]
2[environment second]
3auth1
41 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

确保文件只能被 root 用户读取:

1[environment second]
2sudo chmod 600 /etc/ha.d/authkeys

现在将 /etc/ha.d/authkeys 文件从您的主要节点复制到您的次要节点. 您可以手动或使用 scp 来执行此操作。

二级服务器上,请确保设置authkeys文件的权限:

1[environment third]
2sudo chmod 600 /etc/ha.d/authkeys

在此时,两个服务器都应该具有相同的 /etc/ha.d/authkeys 文件。

创建 Haresources 文件

)的节点。 如果偏好主机不可用 ,即它不能被群集访问,则其他节点之一将接管。

两个服务器 上,打开您最喜欢的编辑器中的haresources文件。

1sudo nano /etc/ha.d/haresources

现在将此行添加到文件中,如果不同,则更换您的主要节点名称:

1[label /etc/ha.d/haresources]
2primary floatip

保存和退出文件 这将配置 primary 服务器作为当前未定义的floatip服务的首选主机。

创建保留IP重新分配服务

我们的Heartbeat集群被配置为维持floatip服务,一个节点可以用来分配保留IP给自己,但我们仍然需要创建该服务。

创建 assign-ip 脚本

对于我们的例子,我们将下载一个基本的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

由于我们的脚本正在向 API 提出请求,我们需要安装 Python Requests 库:

1sudo apt-get install python-requests

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

保留IP: 该脚本的第一个参数,被分配的保留IP* Droplet ID:* 该脚本的第二个参数,该保留IP应该分配给** DigitalOcean PAT(API代码):* 作为环境变量DO_TOKEN传入,您的读/写DigitalOcean PAT

请在继续之前自由审查脚本的内容。

现在我们已经准备好创建floatip服务。

创建floatip服务

要创建floatip服务,我们只需要创建一个 init 脚本,该脚本呼吁我们之前创建的assign-ip脚本,并响应startstop子命令。这个 init 脚本将负责通过 Droplet Metadata 服务搜索服务器的 Droplet ID。

两个服务器 上,在编辑器中添加开放的 /etc/init.d/floatip:

1sudo nano /etc/init.d/floatip

然后在这个 init 脚本中复制和粘贴,用您的 DigitalOcean API 密钥和应重新分配的保留 IP 来替换突出部分:

 1[label /etc/init.d/floatip]
 2#!/bin/bash
 3
 4param=$1
 5
 6export DO_TOKEN='your_DO_API_token'
 7IP='your_reserved_IP_address'
 8ID=$(curl -s http://169.254.169.254/metadata/v1/id)
 9
10if [ "start" == "$param" ] ; then
11  python /usr/local/bin/assign-ip $IP $ID
12  exit 0
13elif [ "stop" == "$param" ] ; then
14  exit 0;
15elif [ "status" == "$param" ] ; then
16  exit 0;
17else
18  echo "no such command $param"
19  exit 1;
20fi

保存和退出文件。

使脚本可执行:

1sudo chmod u+x /etc/init.d/floatip

当这个floatip服务启动时,它会简单地调用assign-ip Python 脚本并将指定的保留 IP 分配给执行脚本的 Droplet. 这是将由 二级 服务器调用的脚本,如果** 主要** 服务器失败,将保留 IP 重新分配给自己。

开始心跳

现在,Heartbeat已配置,并设置了它所依赖的所有脚本,我们已经准备好启动Heartbeat集群了!

两台服务器上 ,运行此命令来启动 Heartbeat:

1sudo systemctl start heartbeat

我们的 HA 设置已经完成了!在继续前,让我们测试它是否按预期运作。

测试高可用性

测试高可用性设置是否有效很重要,所以现在就来做吧。

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

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

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

现在,让我们打开一个本地终端,并使用弯曲访问保留IP在1秒循环。 使用此命令来做到这一点,但一定要用您的域名或保留IP地址替换URL:

1[environment fourth]
2while true; do curl http://example.com; sleep 1; done

目前,这将输出主服务器的相同 Droplet 名称和 IP 地址. 如果我们导致主服务器失败,通过关闭或停止 Heartbeat 服务,我们将看到保留的 IP 是否被重新分配到次要服务器。

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

1sudo reboot

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

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

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

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

现在,您可以通过 DigitalOcean 控制面板启动您的 primary Droplet. 由于 Heartbeat 已配置为** 偏好主机** ,以运行保留 IP 重新分配脚本,因此保留 IP 会自动指向主服务器,一旦再次可用。

结论

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

如果您正在寻找创建一个更强大的HA设置,请查看使用 Corosync 和 PacemakerKeepalived.

在本示例中,我们已经安装了 Nginx 作为一个基本的负载平衡器,但如果您希望通过使用反向代理负载平衡器来改进您的 Heartbeat 设置,您可以通过配置 Nginx作为一个,或者使用 HAProxy。

请记住,您选择使用的任何一种替代方案都需要将负载平衡器/反向代理链接到 IP 地址,以便您的用户只能通过保留 IP 地址访问您的服务器(而不是通过每个服务器的公共 IP 地址)。

Published At
Categories with 技术
comments powered by Disqus