介绍
高可用性是系统设计的功能,允许应用程序在发生故障时自动重新启动或重新路由工作到另一个有能力的系统。 在服务器方面,有一些不同的技术需要设置高可用性系统。 必须有一个可以重定向工作的组件,并且必须有一个机制来监视故障并在检测到中断时转换系统。
所述keepalived
守护程序可以被用于监控服务或系统,以及如果出现问题,自动故障转移到待机状态。 在本指南中,我们将演示如何使用keepalived
建立一个高度可用的Web服务。 我们将配置一个浮动IP地址可以在两个能web服务器之间移动。 如果主服务器关闭,则浮动IP将自动移动到第二个服务器,从而允许恢复服务。
先决条件
为了完成本指南,您需要在您的DigitalOcean帐户上创建两个Ubuntu 14.04服务器。 两个服务器必须位于相同的数据中心内,并且应启用专用网络。
在每台服务器,则需要使用配置的非root用户sudo
访问。 您可以按照我们的Ubuntu 14.04的初始服务器设置指南 ,了解如何设置这些用户。
当您准备好开始时,使用非root用户登录两个服务器。
安装和配置Nginx
虽然keepalived
经常被用来监视和故障切换负载均衡,以减少我们的运营复杂性,我们将使用Nginx的本指南中的简单Web服务器。
首先更新每个服务器上的本地软件包索引。 我们可以安装Nginx:
sudo apt-get update
sudo apt-get install nginx
在大多数情况下,对于高可用性设置,您希望两台服务器提供完全相同的内容。 但是,为了清楚起见,在本指南中,我们将使用Nginx来指示两个服务器中的哪一个在任何给定时间为我们的请求提供服务。 要做到这一点,我们将改变默认index.html
上我们每个主机的页面。 现在打开文件:
sudo nano /usr/share/nginx/html/index.html
在第一个服务器上,将文件的内容替换为:
<h1>Primary</h1>
在第二台服务器上,将文件的内容替换为:
<h1>Secondary</h1>
完成后保存并关闭文件。
构建并安装Keepalived
接下来,我们将安装keepalived
我们的服务器上守护进程。 有一个版本keepalived
在Ubuntu的默认存储库,但它已经过时,从防止工作我们配置一些错误受到影响。 相反,我们将安装最新版本的keepalived
从源头。
在我们开始之前,我们应该抓住我们构建软件所需的依赖。 在build-essential
元包将提供我们所需要的编译工具,而libssl-dev
包中包含SSL库keepalived
需求进行建设:
sudo apt-get install build-essential libssl-dev
一旦依赖到位,我们可以下载的压缩包的keepalived
。 访问此页查找最新版本的软件。 右键单击最新版本并复制链接地址。 回到你的服务器上,移动到你的主目录,并使用wget
抢复制的链接:
cd ~
wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
使用tar
命令展开存档,然后进入生成的目录:
tar xzvf keepalived*
cd keepalived*
键入以下命令来构建并安装守护程序:
./configure
make
sudo make install
守护程序现在应该安装在系统上。
创建Keepalived Upstart脚本
该keepalived
安装感动了所有的二进制文件和支持文件的到位在我们的系统。 但是,没有包括的一块是我们的Ubuntu 14.04系统的Upstart脚本。
我们可以创建一个非常简单的Upstart脚本,可以处理我们keepalived
服务。 打开一个名为keepalived.conf
的范围内/etc/init
目录开始:
sudo nano /etc/init/keepalived.conf
在内部,我们可以用的功能,简单的描述开始keepalived
提供。 我们会从随附的使用说明man
页。 接下来,我们将指定应该启动和停止服务的运行级别。 我们希望此服务在所有正常情况(运行级别2-5)中处于活动状态,并对所有其他运行级别停止(例如,在启动重新引导,关机或单用户模式时):
description "load-balancing and high-availability service"
start on runlevel [2345]
stop on runlevel [!2345]
由于此服务是确保我们的Web服务保持可用的一部分,因此我们希望在发生故障时重新启动此服务。 然后,我们可以指定实际exec
线,将启动该服务。 我们需要添加--dont-fork
选项,以便Upstart可以跟踪pid
正确:
description "load-balancing and high-availability service"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /usr/local/sbin/keepalived --dont-fork
完成后保存并关闭文件。
创建Keepalived配置文件
凭借我们在地方Upstart文件,我们现在就可以着手配置keepalived
。
该服务会在它的配置文件/etc/keepalived
目录。 现在在两个服务器上创建该目录:
sudo mkdir -p /etc/keepalived
收集服务器的专用IP地址
在我们创建配置文件之前,我们需要找到两个服务器的私有IP地址。 在DigitalOcean服务器上,您可以通过键入以下内容通过元数据服务获取我们的私有IP地址:
curl http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address && echo
Output10.132.7.107
这也可以与发现iproute2
通过输入工具:
ip -4 addr show dev eth1
您要查找的值将在此处找到:
Output3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.132.7.107/16 brd 10.132.255.255 scope global eth1
valid_lft forever preferred_lft forever
从两个系统复制此值。 我们将需要在下面的配置文件中引用这些地址。
创建主服务器的配置
接下来,你的主服务器上,创建主keepalived
配置文件。 守护程序查找一个名为keepalived.conf
在里面/etc/keepalived
目录:
sudo nano /etc/keepalived/keepalived.conf
在内部,我们将通过打开一个定义我们的服务Nginx的健康检查开始vrrp_script
块。 这将允许keepalived
监督我们对失败的Web服务器,以便它可以表明这个过程下来,开始恢复措施。
我们的检查会很简单。 每两秒钟,我们将检查这个过程被称为nginx
仍然是声称一个pid
:
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
}
接下来,我们将打开一个名为块vrrp_instance
。 这是主要的配置部分,定义的方式keepalived
将实现高可用性。
我们将告诉开始keepalived
与同行在沟通eth1
,我们的专用接口。 由于我们配置了主服务器,我们将设定state
配置为“大师”。 这是初始值keepalived
将使用直到守护进程可以联系其同行,并举行大选。
在选举中, priority
选项用来决定哪些成员选举产生。 该决定仅仅基于哪个服务器具有此设置的最大数字。 我们将使用“200”作为主服务器:
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
interface eth1
state MASTER
priority 200
}
接下来,我们将为将由两个节点共享的此群集组分配一个ID。 在这个例子中我们将使用“33”。 我们需要设置unicast_src_ip
我们前面检索我们的主服务器的私有IP地址。 我们将设置unicast_peer
我们的辅助服务器的私有IP地址:
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
interface eth1
state MASTER
priority 200
virtual_router_id 33
unicast_src_ip primary_private_IP
unicast_peer {
secondary_private_IP
}
}
接下来,我们可以设置一些简单的验证我们的keepalived
守护程序相互通信。 这只是确保所讨论的服务器是合法的一个基本措施。 创建authentication
子块。 内饰方面,通过设置指定密码认证auth_type
。 为auth_pass
参数,设置一个共享秘密将由两个节点使用。 不幸的是,只有前八个字符有意义:
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
interface eth1
state MASTER
priority 200
virtual_router_id 33
unicast_src_ip primary_private_IP
unicast_peer {
secondary_private_IP
}
authentication {
auth_type PASS
auth_pass password
}
}
下一步,我们将告诉keepalived
使用我们创建例程在该文件的顶部,标记chk_nginx
,以确定本地系统的运行状况。 最后,我们将设置一个notify_master
脚本,每当这个节点将成为一对“大师”,这是执行。 此脚本将负责触发浮动IP地址重新分配。 我们将暂时创建此脚本:
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
interface eth1
state MASTER
priority 200
virtual_router_id 33
unicast_src_ip primary_private_IP
unicast_peer {
secondary_private_IP
}
authentication {
auth_type PASS
auth_pass password
}
track_script {
chk_nginx
}
notify_master /etc/keepalived/master.sh
}
设置完上面的信息后,请保存并关闭该文件。
创建辅助服务器的配置
接下来,我们将在辅助服务器上创建随播脚本。 在打开一个文件/etc/keepalived/keepalived.conf
辅助服务器上:
sudo nano /etc/keepalived/keepalived.conf
在内部,我们将使用的脚本将大体上等同于主服务器的脚本。 我们需要更改的项目是:
-
state
:这应该更改为辅助服务器的“备份”,以便发生选举之前的节点初始化到备份时的状态。 -
priority
:本应设定为比主服务器较低的值。 我们将在本指南中使用值“100”。 -
unicast_src_ip
:这应该是辅助服务器的私有IP地址。 -
unicast_peer
:这应该包含主服务器的私有IP地址。
更改这些值时,辅助服务器的脚本应如下所示:
vrrp_script chk_nginx {
script "pidof nginx"
interval 2
}
vrrp_instance VI_1 {
interface eth1
state BACKUP
priority 100
virtual_router_id 33
unicast_src_ip secondary_private_IP
unicast_peer {
primary_private_IP
}
authentication {
auth_type PASS
auth_pass password
}
track_script {
chk_nginx
}
notify_master /etc/keepalived/master.sh
}
输入脚本并更改相应的值后,保存并关闭文件。
创建浮动IP转换脚本
接下来,我们需要创建一对,我们可以使用浮动IP地址重新分配给当本地当前Droplet脚本keepalived
实例成为主服务器。
下载浮动IP分配脚本
首先,我们将下载一个通用的Python脚本(通过书面DigitalOcean社区经理 ,可以用来重新分配使用DigitalOcean API浮动IP地址到Droplet)。 我们应该下载此文件到/usr/local/bin
目录:
cd /usr/local/bin
sudo curl -LO http://do.co/assign-ip
此脚本允许您通过运行以下命令重新分配现有的浮动IP:
python /usr/local/bin/assign-ip floating_ip droplet_ID
这个,如果你有一个叫做环境变量只会工作DO_TOKEN
设置为您的帐户的有效DigitalOcean API令牌。
创建一个DigitalOcean API令牌
为了使用上述脚本,我们需要在我们的帐户中创建一个DigitalOcean API令牌。
在控制台中,点击顶部的“API”链接。 在API页面的右侧,点击“生成新令牌”:
在下一页上,选择您的令牌的名称,然后点击“生成令牌”按钮:
在API页面上,将显示新令牌:
现在复制令牌。 出于安全目的,以后没有办法再次显示此令牌。 如果你失去这个令牌,你必须销毁它并创建另一个。
为您的基础架构配置浮动IP
接下来,我们将创建和分配一个浮动IP地址以用于我们的服务器。
在DigitalOcean控制面板中,单击“网络”选项卡,然后选择“浮动IP”导航项。 从您指定为“主要”服务器的列表中选择Droplet:
将在您的帐户中创建一个新的浮动IP地址,并分配给指定的Droplet:
如果您在Web浏览器访问浮动IP,你应该看到“主”服务器index.html
页:
复制浮动IP地址。 您将需要在下面的脚本中的这个值。
创建包装脚本
现在,我们有我们需要创建一个包装脚本,将调用我们的项目/usr/local/bin/assign-ip
脚本使用正确的凭据。
现在打字两台服务器上创建文件:
sudo nano /etc/keepalived/master.sh
在内部,通过分配和出口被称为变量开始DO_TOKEN
保存您刚才创建的API令牌。 下面,我们可以分配一个变量,名为IP
保存您的浮动IP地址:
export DO_TOKEN='digitalocean_api_token'
IP='floating_ip_addr'
接下来,我们将使用curl
问元数据的服务,为我们目前在服务器上的DropletID。 这将被分配到一个称为变量ID
。 我们还将询问此Droplet当前是否具有分配给它的浮动IP地址。 我们将存储在一个变量调用的请求的结果HAS_FLOATING_IP
:
export DO_TOKEN='digitalocean_api_token'
IP='floating_ip_addr'
ID=$(curl -s http://169.254.169.254/metadata/v1/id)
HAS_FLOATING_IP=$(curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active)
现在,我们可以使用上面的变量调用assign-ip
脚本。 如果浮动IP尚未与我们的Droplet相关联,我们将仅调用脚本。 这将有助于最大限度地减少API调用,并有助于防止在主服务器状态在服务器之间快速切换的情况下对API的冲突请求。
为了处理其中浮动IP已经在进行中的事件的情况下,我们将重试assign-ip
脚本几次。 下面,我们尝试运行脚本10次,每次调用间隔3秒。 如果浮动IP移动成功,循环将立即结束:
export DO_TOKEN='digitalocean_api_token'
IP='floating_ip_addr'
ID=$(curl -s http://169.254.169.254/metadata/v1/id)
HAS_FLOATING_IP=$(curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active)
if [ $HAS_FLOATING_IP = "false" ]; then
n=0
while [ $n -lt 10 ]
do
python /usr/local/bin/assign-ip $IP $ID && break
n=$((n+1))
sleep 3
done
fi
保存并在完成后关闭文件。
现在,我们只需要使脚本可执行使keepalived
可以调用它:
sudo chmod +x /etc/keepalived/master.sh
启动Keepalived服务并测试故障转移
该keepalived
守护进程和所有它的同伴脚本现在应该完全配置。 我们可以通过键入以下内容在我们的两台机器上启动服务:
sudo start keepalived
该服务应在每个服务器上启动,并与其对等体联系,使用我们配置的共享密钥进行身份验证。 每个守护进程将监视本地Nginx的过程,会听信号从远程keepalived
进程。
当两个服务器都是健康的,如果你在你的浏览器中访问你的浮动IP,你应该被带到主服务器的Nginx页面:
现在,我们准备测试我们的配置的故障转移功能。
当发生以下任一情况时,应发生故障转移:
- 当主服务器上的Nginx的健康检查表明,Nginx的不再运行。在这种情况下,主服务器
keepalived
守护进程将进入“故障”状态。 它将通知辅助服务器它应该转换到主状态并声明浮动IP。 - 当辅助服务器失去了
keepalived
到主服务器连接 。 如果辅助服务器由于任何原因无法到达主服务器,则它将转换到“主”状态并尝试声明浮动IP。
如果主服务器以后恢复,它将转换回主状态并回收浮动IP,因为它将启动新的选举(它仍将具有最高优先级编号)。
测试Nginx失败
我们可以通过停止主服务器上的Nginx服务来测试第一个条件:
sudo service nginx stop
如果您刷新网络浏览器,最初可能会收到一条响应,指示该网页不可用:
但是,在几秒钟后,如果您刷新页面几次,您将看到辅助服务器已声明浮动IP地址:
我们可以通过在主服务器上重新启动Nginx守护进程来从故障中恢复:
sudo service nginx start
几秒钟后,如果您刷新页面,您会发现主服务器已再次收回浮动IP的所有权:
测试服务器故障
我们应该测试的另一种情况是,如果辅助服务器不能连接到主服务器,它是否正确转换到主控状态。 我们可以重新启动主服务器来测试这个:
sudo reboot
再次,我们应该首先看到在浮动IP地址的服务中断:
几秒钟后,辅助服务器将接收请求:
稍后,当主服务器完成重新引导时,它将回收IP地址:
这验证了我们的第二个故障情况。
结论
在本指南中,我们配置使用高度可用的Web服务器环境keepalived
的DigitalOcean API和一个浮动IP地址。 实际的基础设施相当简单,但这些概念可以应用于任何类型的基础设施,其中服务可用性和正常运行时间很重要。