如何在Ubuntu14.04上使用心跳和浮动IP创建高可用性设置

来自菜鸟教程
跳转至:导航、​搜索

介绍

Heartbeat 是一个开源程序,它向客户端服务器提供集群基础架构功能(集群成员资格和消息传递),这是高可用性 (HA) 服务器基础架构中的关键组件。 Heartbeat 通常与集群资源管理器 (CRM) 结合使用,例如 Pacemaker,以实现完整的 HA 设置。 但是,在本教程中,我们将演示如何通过简单地使用 Heartbeat 和 DigitalOcean 浮动 IP 创建 2 节点 HA 服务器设置。

如果您希望创建更强大的 HA 设置,请考虑使用 Corosync 和 PacemakerKeepalived

目标

完成后,HA 设置将由两台 Ubuntu 14.04 服务器组成,采用主动/被动配置。 这将通过指向一个浮动 IP 来完成,这是您的用户访问您的服务或网站的方式,指向主服务器或活动服务器,除非检测到故障。 如果 Heartbeat 服务检测到主服务器不可用,辅助服务器将自动运行脚本,通过 DigitalOcean API 将浮动 IP 重新分配给自己。 因此,后续到浮动 IP 的网络流量将被定向到您的辅助服务器,该服务器将充当活动服务器,直到主服务器再次可用(此时,主服务器将重新分配浮动 IP 给自己)。

注意: 本教程仅介绍在网关级别设置主动/被动高可用性。 也就是说,它包括浮动 IP 和 负载平衡器 服务器 - 主要和次要。 此外,出于演示目的,我们不会在每台服务器上配置反向代理负载均衡器,而是将它们简单地配置为使用各自的主机名和公共 IP 地址进行响应。


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

  • 创建 2 个将接收流量的 Droplet
  • 创建浮动 IP 并将其分配给其中一个液滴
  • 创建指向浮动 IP 的 DNS A 记录(可选)
  • 在 Droplet 上安装 Heartbeat
  • 配置 Heartbeat 以运行浮动 IP 重新分配服务
  • 创建浮动 IP 重新分配服务
  • 测试故障转移

先决条件

为了自动化浮动 IP 重新分配,我们必须使用 DigitalOcean API。 这意味着您需要生成一个个人访问令牌 (PAT),这是一个 API 令牌,可用于对您的 DigitalOcean 帐户进行身份验证,具有 readwrite 访问权限,如下所示API 教程的 如何生成个人访问令牌 部分。 您的 PAT 将在脚本中使用,该脚本将添加到集群中的两台服务器,因此请务必将其保存在安全的地方——因为它允许完全访问您的 DigitalOcean 帐户——以供参考。

除了 API,本教程还利用了以下 DigitalOcean 功能:

如果您想了解更多关于它们的信息,请阅读链接的教程。

创建液滴

第一步是在同一个数据中心创建两个 Ubuntu Droplet,它们将充当上述的主服务器和辅助服务器。 在我们的示例设置中,我们将它们命名为“主要”和“次要”以方便参考。 我们将在两个 Droplet 上安装 Nginx,并用唯一标识它们的信息替换它们的索引页面。 这将使我们能够以一种简单的方式来证明 HA 设置正在运行。 对于真正的设置,您的服务器应该运行您选择的 Web 服务器或负载平衡器。

创建两个 Ubuntu 14.04 Droplets,primarysecondary,使用这个 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 控制面板中,单击顶部菜单中的 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 中设置这些 Heartbeat 配置文件,在两台服务器上完全相同:

  1. ha.cf: Heartbeat集群的全局配置,包括其成员节点
  2. authkeys: 包含一个安全密钥,为节点提供一种向集群进行身份验证的方法
  3. 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 104.236.6.11/18 brd 104.236.63.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。 我们将使用 vi

sudo vi /etc/ha.d/ha.cf

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

将此配置复制并粘贴到文件中,然后将相应的节点名称和 IP 地址替换为我们之前查找的值。 在此示例中,primary 的 IP 地址为 104.236.6.11secondary 的 IP 地址为 104.236.6.22

node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22

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

创建 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 example: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 文件。 我们将使用 vi

sudo vi /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

使用 assign-ip 脚本需要以下详细信息:

  • 浮动IP:脚本的第一个参数,正在分配的浮动IP
  • Droplet ID: 脚本的第二个参数,浮动 IP 应该分配给的 Droplet ID
  • DigitalOcean PAT (API token): 作为环境变量传入 DO_TOKEN,你的读/写 DigitalOcean PAT

在继续之前,请随意查看脚本的内容。

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

创建浮动服务

要创建 floatip 服务,我们需要做的就是创建一个初始化脚本,该脚本调用我们之前创建的 assign-ip 脚本,并响应 start 和 [ X169X] 子命令。 这个初始化脚本将负责通过 Droplet Metadata 服务查找服务器的 Droplet ID。 此外,它还需要重新分配的浮动 IP 和 DigitalOcean API 令牌(先决条件部分中提到的个人访问令牌)。

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

sudo vi /etc/init.d/floatip

然后复制并粘贴到这个初始化脚本中,用您的 DigitalOcean API 密钥和应该重新分配的浮动 IP 替换突出显示的部分:

/etc/init.d/floatip

#!/bin/bash

param=$1

export DO_TOKEN='b7d03a6947b217efb6f3ec3bd3504582'
IP='45.55.96.8'
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 service heartbeat start

你应该看到这样的输出:

Heartbeat output:Starting High-Availability services: Done.

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

测试高可用性

测试高可用性设置是否有效非常重要,所以现在就开始吧。

目前,浮动 IP 分配给 primary 节点。 现在通过 IP 地址或指向它的域名访问浮动 IP,将简单地显示 服务器的索引页面。 如果您使用示例用户数据脚本,它将如下所示:

Floating IP is pointing to primary serverDroplet: primary, IP Address: 104.236.6.11

这表明浮动 IP 实际上已分配给主 Droplet。

现在,让我们打开一个终端并使用 curl 在 1 秒循环中访问浮动 IP。 使用此命令执行此操作,但请务必将 URL 替换为您的域或浮动 IP 地址:

while true; do curl http://example.com; sleep 1; done

目前,这将输出与主服务器相同的 Droplet 名称和 IP 地址。 如果我们通过关闭主服务器或停止 Heartbeat 服务导致主服务器出现故障,我们将查看浮动 IP 是否被重新分配给辅助服务器。

现在让我们关闭 服务器的电源。 通过 DigitalOcean 控制面板或在主服务器上运行以下命令来执行此操作:

sudo poweroff

片刻之后,主服务器应该变得不可用。 注意终端中运行的 curl 循环的输出。 您应该注意到如下所示的输出:

curl loop output:Droplet: primary, IP Address: 104.236.6.11
...
curl: (7) Failed to connect to example.com port 80: Connection refused
Droplet: secondary, IP Address: 104.236.6.22
Droplet: secondary, IP Address: 104.236.6.22
...

也就是说,应该重新分配浮动 IP 地址以指向 辅助 服务器的 IP 地址。 这意味着您的 HA 设置正在运行,因为已经发生了成功的自动故障转移。

您可能会看到也可能不会看到 Connection refused 错误,如果您尝试在主服务器故障和浮动 IP 重新分配完成之间访问浮动 IP,则可能会发生这种错误。

现在,您可以通过 DigitalOcean 控制面板启动 primary Droplet。 由于 Heartbeat 已将主 Droplet 配置为 首选主机 以运行浮动 IP 重新分配脚本,因此浮动 IP 将在它再次可用时自动指向主服务器。

结论

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

如果您希望创建更强大的 HA 设置,请考虑使用 Corosync 和 PacemakerKeepalived

如果要扩展 Heartbeat 设置,下一步是将示例 Nginx 设置替换为反向代理负载均衡器。 为此,您可以使用 Nginx 或 HAProxy。 请记住,您需要将负载均衡器绑定到 锚 IP 地址 ,以便您的用户只能通过浮动 IP 地址访问您的服务器(而不是通过每个服务器的公共 IP 地址) .