怎样利用Heartbeat与Floating IP在Ubuntu 14.04上创建高可用性设置

提供 ZStack社区

内容简单介绍

Heartbeat是一款开源程序,负责将集群基础设施容量——包括集群成员与消息收发——交付至客户server。

Hearbeat在高可用性server基础设施其中扮演着关键性角色。

我们通常须要将Heartbeat与Pacemaker等集群资源管理器(简称CRM)相结合。从而实现完整的高可用性设置。

只是在今天的教程中。我们将演示怎样利用Heartbeat与DigitalOcean Floating IP轻松创建一套双节点高可用性server设置。

假设大家希望进一步提升可用性水平,最好还是尝试Corosync与Pacemaker这一组合或者Keepalived

目标设定

在完毕之后。这套高可用性设置将由两台Ubuntu 14.04server建立的主动/被动配置构成。

要实现这项目标。我们须要借助Floating IP——负责指定用户訪问服务或者站点的实际方式——以指向主server或者说活动server,除非其检測到该server存在故障。

一旦Hearbeat服务发现主server不可用。第二台server将自己主动执行一套脚本以将Floating IP通过DigitalOcean API又一次分配给自己。

如此一来,指向Floating IP的兴许网络流量将会被定向至我们的辅助server,并在主server恢复正常之前由其担任活动server的角色(在主server恢复正常后。其相同会将Floating IP分配给自己以实现切换)。

Active/passive Diagram

备注:今天的教程仅仅涉及在网关层级设置主动/被动高可用性体系,其中包括Floating IP以及负载均衡server——主server与副server。此外,出于演示的目的,我们不会为每台server配置反向代理负载均衡器。而是通过简单配置使其分别响应相应的主机名与公共IP地址。

为实现这一目标。我们将採取下面步骤:

  • 创建2个Droplet用于接收流量
  • 创建Floating IP并将其分别给其中1个Droplet
  • 创建DNS A记录并指向Floating IP(可选)
  • 在2个Droplet上安装Heartbeat
  • 配置Heartbeat以执行Floating IP又一次分配服务
  • 创建Floating IP又一次分配服务
  • 測试故障转移效果

先决条件

为了实现Floating IP的自己主动又一次分配。我们必须使用DigitalOcean API。

这意味着大家须要生成一条个人訪问令牌(简称PAT),该API令牌能够用于认证我们的DigitalOcean账户,并依据API指南部分《怎样生成个人訪问令牌》章节的指导实现读取与写入訪问。大家的PAT将通过脚本进行使用。而该脚本则被加入至集群中的两台server内,从而确保其安全訪问DIgitalOcean账户以供引用。

除了该API。这分教程还将採用下面DigitalOcean元素:

大家能够点击相应链接了解很多其他与之相关的细节信息。

创建Droplet

第一步是在同一数据中心之内创建2个Ubuntu Droplet,二者将分别作为之前所提到的主、副server。在我们的演示样例设置其中,二者将分别被命名为“primary”与“secondary”以便于引用。我们将在2个Droplet上分别安装Nginx并利用其惟一标识信息替换掉其索引页。通过这样的方式,我们能够轻松证明这套高可用性设置是否实际起效。

在真实设置其中,大家的server应当依据实际需求执行Webserver或者负载均衡器。

创建2个Ubuntu 14.04 Droplet,分别为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 > /usr/share/nginx/html/index.html

此脚本将安装Nginx并利用该Droplet的主机名称与IP地址(通过引用Metadata服务)替换index.html的内容。在通过公共IP地址进行訪问时。相应Droplet将显示一套包括该Droplet主机名称与IP地址的基本页面,帮助用户測试随意时段内该Floating IP指向哪个Droplet。

创建Floating IP

在DigitalOcean控制面板中,点击顶部菜单中的“Networking”,接下来在兴许菜单中选定“Floating IPs”。

No Floating IPs

为我们的primary Droplet分配一个Floating IP,而后点击“Assign Floating IP”button。

在Floating IP分配完毕后。通过网络浏览器对该IP进行訪问,以确认其被正确分配至既定Droplet。

http://your_floating_ip

这时大家应该能够看到自己的primary Droplet索引页。

配置DNS(可选)

假设大家希望通过域名訪问自己的主可用性设置。则可在DNS其中创建一条A记录,其负责将域名指向相应的Floating IP地址。

假设大家的域名使用DigitalOcean的域名server,则可遵循《怎样利用DigitalOcean设置一项主机名称》教程中的第三步指引

设置完毕后。大家就可以通过该域名訪问自己的活动server。

在这里我们使用的演示样例域名为example.com

假设大家临时没有域名可用。则应使用Floating IP地址。

安装Heartbeat

下一步是在两台server上安装Heartbeat。最简单的Heartbeat安装方式自然是使用apt-get:

sudo apt-get update
sudo apt-get install heartbeat

Heartbeat如今已经安装完毕,只是我们须要对其进行配置才干让它正常发挥作用。

配置Heartbeat

为了保证集群正常启动与执行,我们必须在/etc/ha.d文件夹下的文件里进行Heartbeat配置——两台server均採用相同的配置方式:

  1. ha.cf: Heartbeat集群的全局配置,包括其各成员节点。

  2. authkeys: 加入一个安全密钥以保证集群对节点进行验证。
  3. haresources: 指定由集群管理的服务以及作为该服务持有者的相应节点。

    须要注意。我们在通过Pacemaker等CRM方案进行设置时无需使用此文件。

我们还须要提供一套脚本,负责在primary Droplet的可用性发生变更时执行Floating IP又一次分配。

收集节点信息

在对ha.cf进行配置之前,我们应当首先查看各节点名称。Heartbeat要求每一个节点的名称与其相应的uname -n输出结果相匹配。

在两台server上执行下面命令。旨在查找相应的节点名称:

* uname -n

请注意该命令的输出结果。演示样例中的节点名称为“primary”与“secondary”。与我们的Droplet命名全然匹配。

我们还须要查看各个节点用于同集群内其他节点进行通信的网络接口与IP地址,从而了解当前哪些节点处于可用状态。

大家能够使用随意网络接口,仅仅要确保集群内各节点的相互通信能力就可以。在这里我们使用Droplet的公共接口,恰好为eth0。

在两台server上,使用下面命令以查找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地址(在本演示样例中以高亮显示)。

确保获取两台server的相应IP地址。

创建ha.cf文件

在两台server上利用大家熟悉的编辑器打开/etc/ha.d/ha.cf文件。我们在这里使用vi:

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

该文件的内容此次应当为空。我们须要向其中加入集群内各节点的网络接口与名称。

将该配置复制并粘贴到此文件其中,而后利用前面查找到的相应主机名称与IP地址替换其中的详细值。在本次演示样例中。primary的IP地址为104.236.6.11。而secondary的IP地址为104.236.6.22:

node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22

保存并退出。

接下来,我们将设置这套集群的验证密钥。

创建authkeys文件

验证密钥的作用是同意各集群成员加入集群。出于这一目的,我们能够轻松创建一条随机密钥。

在primary节点其中执行下面命令。从而在名为AUTHKEY的环境变量其中生成一条合适的验证密钥:

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 文件从primary节点拷贝到我们的secondary节点其中。大家能够通过手动方式或者利用scp实现。

在secondaryserver上,确保对该authkeys文件的权限进行设置:

sudo chmod 600 /etc/ha.d/authkeys

如今两台server应该已经拥有相同的/etc/ha.d/authkeys 文件了。

创建haresources文件

这里的haresources文件负责指定与集群所管理的各项服务相应的preferred host。所谓preferred host即首选主机,指服务在相应节点处于可用状态时应优先选择的执行选项。假设首选主机不可用,即无法由集群接入,则还有一节点则将接掌其职责。

换言之,secondaryserver将在primaryserver发生问题时顶替其角色。

在两台server上通过大家熟悉的编辑器打开该haresources文件。在这里我们使用vi:

sudo vi /etc/ha.d/haresources

如今将下面一行加入至该文件里,并将我们自己的primary节点名称替换进去:

/etc/ha.d/haresources

primary floatip

保存并退出。

如今该primaryserver已经被配置为floatip服务的首选主机。只是floatip服务本身尚未进行定义。因此下一步任务就是设置floatip服务。

创建Floating IP又一次分配服务

我们的Heartbeat集群的配置目标在于保证floatip服务能够始终正常执行,其中一个节点用于将Floating IP分配给自身。只是这项服务本身也须要单独创建。在设置服务本体之前,我们首先创建一套脚本,用于通过DigitalOcean API将该Floating IP分配至其执行所在的节点。

接下来。我们将创建负责执行该Floating IP又一次分配脚本的floatip服务。

创建assign-ip脚本

在演示样例中,我们将下载一套基础Python脚本以利用DigitalOcean API向给定Droplet ID分配一个Floating IP。

在两台server上下载该assign-ip Python脚本:

sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip

在两台server上为其提供执行权限:

sudo chmod +x /usr/local/bin/assign-ip

使用assign-ip脚本还须要注意下面细节:

  • Floating IP: 该脚本中的第一项參数。指定须要分配的Floating IP。
  • Droplet ID: 该脚本中的第二项參数,指定该Floating IP被分配到的Droplet ID。
  • DigitalOcean PAT (API令牌): 作为环境变量DOTOKEN进行传递,即我们的读取/写入DigitalOcean PAT。

在进行下一步之前,请大家认真审查这部分脚本内容。

如今我们已经做好了创建floatip服务的一切准备。

创建floatip服务

要创建floatip服务,我们须要首先创建一个init脚本以调用此前编写完毕的assign-ip脚本,同一时候响应start与stop子命令。

该init脚本将负责通过Droplet Metadata服务查找server的Droplet ID。另外,该脚本还须要获取被分配Floating IP以及DigitalOcean API令牌(即我们在先决条件部分中提到过的个人訪问令牌)。

在两台server上,利用编辑器打开/etc/init.d/floatip :

sudo vi /etc/init.d/floatip

而后将下面内容复制并粘贴到init脚本其中。同一时候利用大家自己的DigitalOcean API密钥与须要分配的Floating 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。在正常执行情况下,该脚本供secondaryserver使用以将Floating IP分配给自身,从而实现primaryserver的故障转移能力。相同的,该脚本亦可在primary又一次加入集群后被其用于将Floating IP又一次分配给自身。

启动Heartbeat

如今Heartbeat已经配置完毕,而其执行所须要的所有脚本亦已准备就绪——我们能够立即启动这套Heartbeat集群了。

在两台server上执行下面命令以启动Heartbeat:

sudo service heartbeat start

大家应该看到下面输出结果:

Heartbeat output:
Starting High-Availability services: Done.

我们的高可用性设置已经完毕!接下来是对其工作状态进行測试。

測试高可用性

对高可用性设置的工作状态进行測试很重要。因此我们这就着手開始。

眼下。该Floating IP被分配至primary节点。我们能够通过IP地址或者指向它的域名对Floating IP加以訪问,并由此查看primaryserver的索引页面。假设大家使用演示样例提供的用户数据脚本。则显示结果应例如以下所看到的:
Floating IP is pointing to primary server
Droplet: primary, IP Address: 104.236.6.11

这意味着该Floating IP实际上被分配至primary Droplet处。
如今让我们打开终端。并使用curl以1秒循环訪问该Floating IP。大家可使用下面命令实现这一目标,只是请注意将URL部分替换成各位的实际域名或者Floating IP地址:

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

眼下其会输出相同的Droplet名称与primaryserverIP地址。

假设我们让primaryserver处于不可用状态——比如将其关闭或者停止Heartbeat服务,则会看到Floating IP被又一次分配至secondaryserver。

如今让我们关闭primaryserver。大家能够通过DigitalOcean控制面板或者在primaryserver上执行下面命令将其关闭:

sudo poweroff

片刻之后,该primaryserver将不再可用。须要注意执行在终端内的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
...

这时Floating IP地址应该被又一次分配至secondaryserver的IP地址,也就是说我们的高可用性设置已经正常起效。即成功实现了自己主动化故障转移功能。

大家可能会发现一项Connection refused错误——当然也可能不会,原因在于大家的Floating IP訪问尝试发生在primaryserver故障与该Floating IP又一次分配完毕这两个事件之间。

如今大家能够通过DigitalOcean控制面板又一次启动自己的primary Droplet。因为Heartbeat在配置其中将primary Droplet作为preferred host以执行Floating IP又一次分配脚本,因此该Floating IP会在可用性恢复后自己主动又一次指向primaryserver。

总结

恭喜大家!如今我们已经拥有了一套利用Heartbeat与DigitalOcean Floating IP实现的基础高可用性server设置。

假设大家希望进一步提高可用性水平,亦可考虑使用Corosync与Pacemaker组合或者Keepalived

假设大家希望扩展自己的Heartbeat设置,那么下一步工作就是利用反向代理负载均衡器替代演示样例中的Nginx设置。大家也能够使用Nginx或者HAProxy实现相同的效果。

须要注意的是,大家须要将该负载均衡器绑定至还有一个IP地址,从而确保用户仅仅能够通过Floating IP地址訪问server(而非通过各server的公共IP地址)。

本文源自DigitalOcean Community

英文原文:How To Create a High Availability Setup with Heartbeat and Floating IPs on Ubuntu 14.04 by Mitchell Anicas

翻译:diradw

原文地址:https://www.cnblogs.com/lxjshuju/p/7397335.html