如何在Ubuntu16.04上使用心跳和浮动IP创建高可用性设置
介绍
Heartbeat 是一个开源程序,它向客户端服务器提供集群基础设施功能——集群成员和消息传递。 这些功能是高可用性 (HA) 服务器基础架构中的关键组件。 在本教程中,我们将演示如何通过简单地使用 Heartbeat 和 DigitalOcean 浮动 IP 创建 2 节点 HA 服务器设置。
Heartbeat 通常与集群资源管理器 (CRM) 结合使用,例如 Pacemaker,以实现完整的 HA 设置。 如果您希望创建更强大的 HA 设置,请考虑使用 Corosync 和 Pacemaker 或 Keepalived。
目标
完成后,HA 设置将由两台 Ubuntu 16.04 服务器组成,采用主动/被动配置。 这将通过指向一个浮动 IP(您的用户将如何访问您的服务或网站)指向主要(或活动)服务器来完成,除非检测到故障。 如果 Heartbeat 服务检测到主服务器不可用,辅助服务器将自动运行脚本,通过 DigitalOcean API 将浮动 IP 重新分配给自己。 因此,后续到浮动 IP 的网络流量将被定向到您的辅助服务器,该服务器将充当活动服务器,直到主服务器再次可用(此时,主服务器将重新分配浮动 IP 给自己)。
注意: 本教程仅用于演示目的,仅涵盖设置可靠 HA 解决方案的一些方面。 本文档的主要内容是有关如何在网关级别安装主动/被动节点并将它们绑定到浮动 IP 的详细信息。 为了使教程更简单,我们不会在每台服务器上配置反向代理负载均衡器,而是将它们配置为使用各自的主机名和公共 IP 地址进行响应。
为了实现这一目标,我们将遵循以下步骤:
- 创建 2 个将接收流量的 Droplet
- 创建一个浮动 IP 并将其分配给其中一个 Droplet
- 创建指向浮动 IP 的 DNS A 记录(可选)
- 在 Droplet 上安装 Heartbeat
- 配置 Heartbeat 以运行浮动 IP 重新分配服务
- 创建浮动 IP 重新分配服务
- 测试故障转移
考虑到这个目标,我们可以开始着手设置我们的 HA 设置。
先决条件
为了自动化浮动 IP 重新分配,我们必须使用 DigitalOcean API。 这意味着您需要生成一个个人访问令牌 (PAT),这是一个 API 令牌,可用于对您的 DigitalOcean 帐户进行身份验证,具有 read 和 write 访问权限。 您可以按照 API 教程的 如何生成个人访问令牌 部分来实现此目的。 您的 PAT 将在将添加到集群中的两台服务器的脚本中使用。 将其保存在安全的地方以供参考很重要,因为它允许完全访问您的 DigitalOcean 帐户。
除了 API,本教程还利用了以下 DigitalOcean 功能:
如果您想了解更多关于它们的信息,请阅读链接的教程。
创建液滴
第一步是在同一个数据中心创建两个 Ubuntu Droplet,它们将充当上述的主服务器和辅助服务器。 在我们的示例设置中,我们将它们命名为“主要”和“次要”以方便参考。 我们将在两个 Droplet 上安装 Nginx,并用唯一标识它们的信息替换它们的索引页面。 这将使我们能够以一种简单的方式来证明 HA 设置正在运行。 对于生产设置,您的服务器应运行您选择的 Web 服务器或负载平衡器。
创建两个 Ubuntu 16.04 Droplets,primary 和 secondary,使用这个 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 > /var/www/html/index.html
这将安装 Nginx 并将 index.html
的内容替换为 Droplet 的主机名和 IP 地址(通过引用元数据服务)。 通过其公共 IP 地址访问任一 Droplet 将显示一个带有 Droplet 主机名和 IP 地址的基本网页,这对于在任何给定时刻测试浮动 IP 指向哪个 Droplet 很有用。
创建浮动 IP
在 DigitalOcean 控制面板中,单击顶部菜单中的 Networking,然后单击子菜单中的 Floating IPs。
为您的 primary Droplet 分配一个浮动 IP,然后单击 分配浮动 IP 按钮。
分配浮动 IP 后,检查您是否可以通过在 Web 浏览器中访问它来访问分配给它的 Droplet。
http://your_floating_ip
你应该看到你的主要 Droplet 的索引页。
配置 DNS(可选)
如果您希望能够通过域名访问您的 HA 设置,请继续在您的 DNS 中创建一个 A 记录,将您的域指向您的浮动 IP 地址。 如果您的域使用 DigitalOcean 的名称服务器,请按照如何使用 DigitalOcean 设置主机名教程的 步骤三 。 一旦传播,您就可以通过域名访问您的活动服务器。
我们将使用的示例域名是 example.com
。 如果您现在没有域名,则应使用浮动 IP 地址。
安装心跳
下一步是在两台服务器上安装 Heartbeat。 安装 Heartbeat 最简单的方法是使用 apt-get:
sudo apt-get update sudo apt-get install heartbeat
Heartbeat 现在已安装,但需要对其进行配置才能执行任何操作。
配置心跳
为了让我们想要的集群启动并运行,我们必须在两台服务器的 /etc/ha.d
目录中创建和设置相同的心跳配置文件:
- ha.cf — Heartbeat 集群的全局配置,包括其成员节点
- authkeys — 包含一个安全密钥,为节点提供一种向集群进行身份验证的方法
- haresources — 指定由集群管理的服务以及作为服务首选所有者的节点。 请注意,此文件不用于使用 Pacemaker 等 CRM 的设置
我们还需要提供一个脚本,以便在主 Droplet 的可用性发生变化时执行浮动 IP 重新分配。
收集节点信息
在配置 ha.cf
之前,我们应该查找每个节点的名称。 Heartbeat 要求每个节点名称与它们各自的 uname -n
输出相匹配。
在 两台服务器 上,运行以下命令以查找适当的节点名称:
uname -n
注意命令的输出。 示例节点名称是“primary”和“secondary”,这与我们命名的 Droplets 相匹配。
为了确定哪些节点可用,我们还需要查找每个节点用于与集群其余部分通信的网络接口和 IP 地址。 您可以使用任何网络接口,只要每个节点都可以访问集群中的其他节点。 我们将使用我们的 Droplets 的公共接口,它恰好是 eth0
。
在 两台服务器 上,使用此命令查找 eth0
接口的 IP 地址(或在 DigitalOcean 控制面板中查找):
ip addr show eth0
ip addr show eth0 output:2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 04:01:76:a5:45:01 brd ff:ff:ff:ff:ff:ff inet 198.51.100.5/24 brd 198.51.100.255 scope global eth0 valid_lft forever preferred_lft forever inet 10.17.0.28/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::601:76ff:fea5:4501/64 scope link valid_lft forever preferred_lft forever
记下网络接口的 IP 地址(在示例中突出显示)。 请务必获取两台服务器的 IP 地址。
创建 ha.cf 文件
在 两台服务器 上,在您喜欢的编辑器中打开 /etc/ha.d/ha.cf
。 我们将使用纳米:
sudo nano /etc/ha.d/ha.cf
该文件应该是新的并且是空的。 我们需要添加集群中每个节点的网络接口和名称。
将此配置复制并粘贴到文件中,然后将相应的节点名称和 IP 地址替换为我们之前查找的值。 在此示例中,primary 的 IP 地址为 198.51.100.5
,secondary 的 IP 地址为 198.51.100.6
:
/etc/ha.d/ha.cf
node primary ucast eth0 198.51.100.5 node secondary ucast eth0 198.51.100.6
保存并退出文件。 接下来,我们将设置集群的授权密钥。
创建 authkeys 文件
授权密钥用于允许集群成员加入集群。 为此,我们可以简单地生成一个随机密钥。
在 primary 节点上,运行以下命令以在名为 AUTH_KEY
的环境变量中生成合适的授权密钥:
if [ -z "${AUTH_KEY}" ]; then export AUTH_KEY="$(command dd if='/dev/urandom' bs=512 count=1 2>'/dev/null' \ | command openssl sha1 \ | command cut --delimiter=' ' --fields=2)" fi
然后使用以下命令编写 /etc/ha.d/authkeys
文件:
sudo bash -c "{ echo auth1 echo 1 sha1 $AUTH_KEY } > /etc/ha.d/authkeys"
检查 authkeys
文件的内容,如下所示:
sudo cat /etc/ha.d/authkeys
它应该看起来像这样(使用不同的授权密钥):
/etc/ha.d/authkeys
auth1 1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa
确保该文件只能由 root 用户读取:
sudo chmod 600 /etc/ha.d/authkeys
现在将 /etc/ha.d/authkeys
文件从主节点复制到辅助节点。 您可以手动执行此操作,也可以使用 scp
。
在secondary服务器上,一定要设置authkeys
文件的权限:
sudo chmod 600 /etc/ha.d/authkeys
此时,两台服务器应该有一个相同的 /etc/ha.d/authkeys
文件。
创建资源文件
haresources
文件指定 首选主机 与集群管理的服务配对。 如果节点可用,首选主机是 应该 运行相关服务的节点。 如果首选主机 不可用 ,即 集群无法访问它,其他节点之一将接管。 换句话说,如果主服务器出现故障,辅助服务器将接管。
在 两台服务器 上,在您喜欢的编辑器中打开 haresources
文件。 我们将使用纳米:
sudo nano /etc/ha.d/haresources
现在将此行添加到文件中,如果主节点名称不同,则替换为:
/etc/ha.d/haresources
primary floatip
保存并退出文件。 这会将 primary 服务器配置为当前未定义的 floatip
服务的首选主机。 接下来让我们设置floatip
服务。
创建浮动 IP 重新分配服务
我们的 Heartbeat 集群配置为维护 floatip
服务,节点可以使用该服务为自己分配浮动 IP,但我们仍然需要创建服务。 然而,在我们设置服务本身之前,让我们创建一个脚本,该脚本将通过 DigitalOcean API 将浮动 IP 分配给运行它的节点。 然后我们将创建运行浮动 IP 重新分配脚本的 floatip
服务。
创建分配 IP 脚本
对于我们的示例,我们将下载一个基本的 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
由于我们的脚本正在向 API 发出请求,因此我们需要安装 Python Requests 库:
sudo apt-get install python-requests
使用 assign-ip
脚本需要以下详细信息:
- 浮动IP:脚本的第一个参数,正在分配的浮动IP
- Droplet ID: 脚本的第二个参数,浮动 IP 应该分配给的 Droplet ID
- DigitalOcean PAT (API token): 作为环境变量传入
DO_TOKEN
,你的读/写 DigitalOcean PAT
在继续之前,请随意查看脚本的内容。
现在我们准备创建 floatip
服务。
创建 floatip
服务
要创建 floatip
服务,我们需要做的就是创建一个初始化脚本,该脚本调用我们之前创建的 assign-ip
脚本,并响应 start
和 [ X169X] 子命令。 这个初始化脚本将负责通过 Droplet Metadata 服务查找服务器的 Droplet ID。 此外,它还需要重新分配的浮动 IP 和 DigitalOcean API 令牌(先决条件部分中提到的个人访问令牌)。
在 两台服务器 上,在编辑器中添加打开的 /etc/init.d/floatip
:
sudo nano /etc/init.d/floatip
然后复制并粘贴到这个初始化脚本中,用您的 DigitalOcean API 密钥和应该重新分配的浮动 IP 替换突出显示的部分:
/etc/init.d/floatip
#!/bin/bash param=$1 export DO_TOKEN='your_DO_API_token' IP='your_floating_IP_address' ID=$(curl -s http://169.254.169.254/metadata/v1/id) if [ "start" == "$param" ] ; then python /usr/local/bin/assign-ip $IP $ID exit 0 elif [ "stop" == "$param" ] ; then exit 0; elif [ "status" == "$param" ] ; then exit 0; else echo "no such command $param" exit 1; fi
保存并退出文件。
使脚本可执行:
sudo chmod u+x /etc/init.d/floatip
当这个 floatip
服务启动时,它会简单地调用 assign-ip
Python 脚本并将指定的 Floating IP 分配给执行该脚本的 Droplet。 这是 secondary 服务器将调用的脚本,如果 primary 服务器发生故障,将浮动 IP 重新分配给它自己,. 同样,一旦重新加入集群,primary 服务器将使用相同的脚本来回收浮动 IP。
启动心跳
现在已经配置了 Heartbeat 并且它所依赖的所有脚本都设置好了,我们准备好启动 Heartbeat 集群了!
在 两台服务器 上,运行以下命令启动 Heartbeat:
sudo systemctl start heartbeat
我们的 HA 设置现已完成! 在继续之前,让我们测试它是否按预期工作。
测试高可用性
测试高可用性设置是否有效非常重要,所以现在就开始吧。
目前,浮动 IP 分配给 primary 节点。 现在通过 IP 地址或指向它的域名访问浮动 IP,将简单地显示 主 服务器的索引页面。 如果您使用示例用户数据脚本,它将如下所示:
Floating IP is pointing to primary serverDroplet: primary, IP Address: 198.51.100.5
这表明浮动 IP 实际上已分配给主 Droplet。
现在,让我们打开一个本地终端并使用 curl
在 1 秒循环中访问浮动 IP。 使用此命令执行此操作,但请务必将 URL 替换为您的域或浮动 IP 地址:
while true; do curl http://example.com; sleep 1; done
目前,这将输出与主服务器相同的 Droplet 名称和 IP 地址。 如果我们通过关闭主服务器或停止 Heartbeat 服务导致主服务器出现故障,我们将查看浮动 IP 是否被重新分配给辅助服务器。
现在让我们重新启动 主 服务器。 通过 DigitalOcean 控制面板或在主服务器上运行以下命令来执行此操作:
sudo reboot
片刻之后,主服务器应该变得不可用。 注意终端中运行的 curl
循环的输出。 您应该注意到如下所示的输出:
curl loop output:Droplet: primary, IP Address: 198.51.100.5 ... curl: (7) Failed to connect to example.com port 80: Connection refused Droplet: secondary, IP Address: 198.51.100.6 Droplet: secondary, IP Address: 198.51.100.6 ...
也就是说,应该重新分配浮动 IP 地址以指向 辅助 服务器的 IP 地址。 这意味着您的 HA 设置正在运行,因为已经发生了成功的自动故障转移。
您可能会看到也可能不会看到 Connection refused
错误,如果您尝试在主服务器故障和浮动 IP 重新分配完成之间访问浮动 IP,则可能会发生这种错误。
现在,您可以通过 DigitalOcean 控制面板启动 primary Droplet。 由于 Heartbeat 已将主 Droplet 配置为 首选主机 以运行浮动 IP 重新分配脚本,因此浮动 IP 将在它再次可用时自动指向主服务器。
结论
恭喜! 您现在使用 Heartbeat 和 DigitalOcean 浮动 IP 设置了基本的 HA 服务器。
如果您希望创建更强大的 HA 设置,请考虑使用 Corosync 和 Pacemaker 或 Keepalived。
在此示例中,我们安装了 Nginx 作为基本负载均衡器,但如果您想使用反向代理负载均衡器改进 Heartbeat 设置,您可以通过将 Nginx 配置为一个,或使用HAProxy。
请记住,无论您选择使用哪种替代方案,您都需要将负载均衡器/反向代理绑定到 锚 IP 地址 ,以便您的用户只能通过浮动 IP 地址访问您的服务器(而不是通过每个服务器的公共 IP 地址)。