介绍
Heartbeat是一个开源程序,提供集群基础架构功能 - 集群成员资格和消息传递到客户端服务器,这是高可用性(HA)服务器基础架构中的关键组件。 心跳通常与诸如Pacemaker之类的集群资源管理器(CRM)结合使用,以实现完整的HA设置。 但是,在本教程中,我们将演示如何通过简单地使用Heartbeat和DigitalOcean浮动IP创建双节点HA服务器设置。
如果您正在寻找创建一个更强大的HA设置,考虑使用Corosync和Pacemaker或KEEPALIVED 。
目标
完成后,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到您的主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
,相同的两个服务器上:
- ha.cf:心跳集群的全局配置,包括其成员节点
- authkeys:包含提供了一个安全的关键节点的方式来验证集群
- 的haresources:指定由群集,那就是服务的首选所有者的节点管理的服务。 请注意,在使用CRM(如Pacemaker)的设置中不使用此文件
我们还需要提供一个脚本,以便在主Droplet的可用性更改的情况下执行浮动IP重新分配。
收集节点信息
在配置ha.cf
,我们应该查找每个节点的名称。 心跳要求每个节点名称各自匹配uname -n
输出。
在两台服务器上,运行此命令来查找相应的节点名称:
uname -n
注意命令的输出。 示例节点名称是“primary”和“secondary”,它们匹配我们命名的Droplet。
我们还需要查找每个节点将用于与群集其余部分通信的网络接口和IP地址,以确定哪些节点可用。 您可以使用任何网络接口,只要每个节点都可以到达集群中的其他节点。 我们将使用我们的Droplet的公共接口,这恰好是eth0
。
在两台服务器上,使用此命令来查找IP地址eth0
接口(或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地址。 在这个例子中, 初级的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
它应该像这样(使用不同的授权码):
/etc/ha.d/authkeys example: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
现在将此行添加到文件,替换为您的主节点的名称:
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
,我们在前面创建的脚本,并响应start
和stop
子命令。 此初始化脚本将负责通过Droplet元数据服务查找服务器的Droplet ID。 此外,它将要求重新分配的浮动IP和DigitalOcean API令牌(先决条件部分中提及的个人访问令牌)。
在两台服务器上,加开/etc/init.d/floatip
在编辑器中:
sudo vi /etc/init.d/floatip
然后在此初始化脚本中复制并粘贴,用您的DigitalOcean API密钥和应重新分配的浮动IP替换突出显示的部分:
#!/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
你应该看到这样的输出:
Heartbeat output:Starting High-Availability services: Done.
我们的HA设置现已完成! 在继续之前,让我们测试它的工作原理。
测试高可用性
重要的是要测试高可用性设置是否正常工作,所以让我们现在就做。
目前,该浮动IP分配给主节点。 现在访问浮动IP,通过IP地址或由指向它的域名,只会显示主服务器的索引页。 如果你使用示例用户数据脚本,它将看起来像这样:
Floating IP is pointing to primary serverDroplet: 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
是在终端运行循环。 您应该注意到这样的输出:
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可能发生。
现在,你可能开机主Droplet,经DigitalOcean控制面板。 由于心跳配置与主Droplet作为首选主机运行浮动IP重新分配脚本,浮动IP会自动一旦它再次变得可用点回主服务器。
结论
恭喜! 您现在有一个基本的HA服务器设置使用Heartbeat和一个DigitalOcean浮动IP。
如果您正在寻找创建一个更强大的HA设置,考虑使用Corosync和Pacemaker或KEEPALIVED 。
如果要扩展Heartbeat设置,下一步是使用反向代理负载均衡器替换示例Nginx设置。 你可以使用Nginx或HAProxy来达到这个目的。 请记住,你会想你的负载平衡器绑定到锚的IP地址 ,这样用户只能通过浮动IP地址访问您的服务器(而不是通过每个服务器的公网IP地址)。