如何创建心跳高可用性设置和浮动IP地址在Ubuntu 14.04

心跳是一个开源项目,提供集群基础设施能力,群集成员和消息传递到客户端的服务器,这是在高可用性(HA)服务器基础架构的关键组成部分。心跳通常用于与集群资源管理(CRM),如Pacemaker结合,实现了完整HA设置。然而,在本教程中,我们将演示如何通过简单的使用心跳和DigitalOcean浮动IP创建一个2节点的HA服务器设置。

介绍

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

如果您正在寻找创建一个更强大的HA设置,考虑使用Corosync和PacemakerKEEPALIVED

目标

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

主动/被动图

注:本教程只涉及在网关级别设置主动/被动高可用性。 也就是说,它包含浮动IP,以及负载均衡服务器-中小学。 此外,为了演示的目的,不是在每个服务器上配置反向代理负载平衡器,我们将简单地配置它们以各自的主机名和公共IP地址进行响应。

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

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

先决条件

为了自动化浮动IP重新分配,我们必须使用DigitalOcean API。 这意味着你需要生成一个个人访问令牌(PAT),这是可以用来验证您DigitalOcean帐户API的道理,与读取和遵循写入权限如何生成个人访问令牌 API的部分教程。 您的PAT将用于将添加到集群中两个服务器的脚本,因此请务必将其保存在安全的位置,因为它允许完全访问您的DigitalOcean帐户,以供参考。

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

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

创建Droplet

第一步是在同一数据中心中创建两个Ubuntu Droplet,它们将充当上述主服务器和辅助服务器。 在我们的示例设置中,我们将它们命名为“primary”和“secondary”以方便参考。 我们将在两个Droplets上安装Nginx,并用其唯一标识它们的信息替换它们的索引页面。 这将允许我们一个简单的方法来演示HA设置是否正常工作。 对于真正的设置,您的服务器应运行您选择的Web服务器或负载均衡器。

创建两个Ubuntu的14.04Droplet, 小学中学 ,与此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地址

无浮动IP

指派浮动IP到您的Droplet,然后单击分配浮动IP按钮。

分配浮动IP后,请通过在Web浏览器中访问它来检查您是否可以访问分配给它的Droplet。

http://your_floating_ip

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

设置DNS(可选)

如果你希望能够通过域名访问你的HA设置,继续创建您的DNS指向您的域名到您的浮动IP地址的A记录 如果您的域名使用DigitalOcean的域名服务器,请按照第三步的如何建立与DigitalOcean教程主机名。 一旦传播,您可以通过域名访问您的活动服务器。

我们将使用的示例域名为example.com 如果您现在没有域名,则应使用浮动IP地址。

安装心跳

下一步是在两个服务器上安装Heartbeat。 安装Heartbeat的最简单的方法是使用apt-get:

sudo apt-get update
sudo apt-get install heartbeat

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

配置心跳

为了得到我们所期望的集群启动和运行,必须建立这些心跳配置文件/etc/ha.d ,相同的两个服务器上:

  1. ha.cf:心跳集群的全局配置,包括其成员节点
  2. authkeys:包含提供了一个安全的关键节点的方式来验证集群
  3. 的haresources:指定由群集,那就是服务的首选所有者的节点管理的服务。 请注意,在使用CRM(如Pacemaker)的设置中不使用此文件

我们还需要提供一个脚本,以便在主Droplet的可用性更改的情况下执行浮动IP重新分配。

收集节点信息

在配置ha.cf ,我们应该查找每个节点的名称。 心跳要求每个节点名称各自匹配uname -n输出。

两台服务器上,运行此命令来查找相应的节点名称:

uname -n

注意命令的输出。 示例节点名称是“primary”和“secondary”,它们匹配我们命名的Droplet。

我们还需要查找每个节点将用于与群集其余部分通信的网络接口和IP地址,以确定哪些节点可用。 您可以使用任何网络接口,只要每个节点都可以到达集群中的其他节点。 我们将使用我们的Droplet的公共接口,这恰好是eth0

两台服务器上,使用此命令来查找IP地址eth0接口(或DigitalOcean控制面板中进行查找):

ip addr show eth0
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地址。 在这个例子中, 初级的IP地址是104.236.6.11次要的IP地址为104.236.6.22

node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22

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

创建authkeys文件

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

节点上,运行以下命令来生成一个环境变量命名一个合适的授权密钥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

它应该像这样(使用不同的授权码):

auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

确保文件只能由root读取:

sudo chmod 600 /etc/ha.d/authkeys

现在复制/etc/ha.d/authkeys从主节点文件到您的辅助节点。 您可以手动做到这一点,或scp

辅助服务器上,一定要设置的权限authkeys文件:

sudo chmod 600 /etc/ha.d/authkeys

两台服务器应具有相同/etc/ha.d/authkeys文件。

创建haresources文件

haresources文件指定与集群管理服务配对首选主机 优选的宿主是应该运行该相关联的服务(多个)如果节点是可用的节点。 如果首选主机不可用,也就是说,它是不被群集,其他节点将接管一个到达。 换句话说,如果主服务器关闭,辅助服务器将接管。

两台服务器上,打开haresources在你喜欢的编辑器文件。 我们将使用vi

sudo vi /etc/ha.d/haresources

现在将此行添加到文件,替换为您的主节点的名称:

/etc/ha.d/haresources
primary floatip

保存并退出。 这将配置服务器作为首选主机floatip服务,这是目前不确定的。 让我们建立了floatip服务下一个。

创建浮动IP重新分配服务

我们的心跳集群配置为保持floatip服务,一个节点可以使用浮动IP分配给自己,但我们仍然需要创建服务。 然而,在我们设置服务本身之前,让我们创建一个脚本,它将通过DigitalOcean API将浮动IP分配给运行它的节点。 然后,我们将创建floatip将运行浮动IP重新分配脚本服务。

创建assign-ip脚本

对于我们的示例,我们将下载一个基本的Python脚本,使用DigitalOcean API为给定的Droplet ID分配浮动IP。

两台服务器上,下载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正被分配
  • DropletID:第二个参数为脚本,Droplet的ID浮动IP应该被分配到
  • DigitalOcean PAT(API令牌):通过在作为环境变量DO_TOKEN ,你的读/写DigitalOcean PAT

在继续之前,请自由地查看脚本的内容。

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

创建floatip服务

要创建floatip服务,所有我们需要做的就是创建一个调用init脚本assign-ip ,我们在前面创建的脚本,并响应startstop子命令。 此初始化脚本将负责通过Droplet元数据服务查找服务器的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脚本,并分配指定的浮动IP到执行该脚本的Droplet。 这是将通过辅助服务器被调用,以重新分配浮动IP本身,如果服务器发生故障的脚本。 同样地,相同的脚本将被服务器使用,以回收浮动IP,一旦它重新加入集群。

启动心跳

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

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

sudo service heartbeat start

你应该看到这样的输出:

Starting High-Availability services: Done.

我们的HA设置现已完成! 在继续之前,让我们测试它的工作原理。

测试高可用性

重要的是要测试高可用性设置是否正常工作,所以让我们现在就做。

目前,该浮动IP分配给节点。 现在访问浮动IP,通过IP地址或由指向它的域名,只会显示服务器的索引页。 如果你使用示例用户数据脚本,它将看起来像这样:

Droplet: primary, IP Address: 104.236.6.11

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

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

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

目前,这将输出主服务器的相同Droplet名称和IP地址。 如果我们使主服务器失败,通过关闭电源或停止Heartbeat服务,我们将看到浮动IP是否重新分配给辅助服务器。

现在,让我们在服务器关机。 通过DigitalOcean控制面板或在主服务器上运行此命令执行此操作:

sudo poweroff

稍后,主服务器应该变得不可用。 要注意的输出curl是在终端运行循环。 您应该注意到这样的输出:

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可能发生。

现在,你可能开机Droplet,经DigitalOcean控制面板。 由于心跳配置与主Droplet作为首选主机运行浮动IP重新分配脚本,浮动IP会自动一旦它再次变得可用点回主服务器。

结论

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

如果您正在寻找创建一个更强大的HA设置,考虑使用Corosync和PacemakerKEEPALIVED

如果要扩展Heartbeat设置,下一步是使用反向代理负载均衡器替换示例Nginx设置。 你可以使用Nginx或HAProxy来达到这个目的。 请记住,你会想你的负载平衡器绑定到锚的IP地址 ,这样用户只能通过浮动IP地址访问您的服务器(而不是通过每个服务器的公网IP地址)。