1. 编译
编译keepalived比较简单,只要到官网下载源码, configure/make/make install即可。
有时候比较麻烦,比如会提示“Openssl is not properly installed”。这主要是缺少openssl-devel包。可以通过平台的软件管理程序安装即可。例如
# centos
yum install openssl-devel
# suse
zypper install openssl-devel
# ubuntu
apt-get install openssl-devel
``3
如果无法安装,例如suse11,缺少这样的软件包,可以搜索下载libopenssl-devel。安装即可。
wget http://www.convirture.com/repos/deps/SLES/11.x/x86_64/libopenssl-devel-0.9.8h-30.11.x86_64.rpm
## 2. 应用
用flask开发一个简单的web应用, app.py。
``` python
#!/usr/bin/python
from flask import Flask
app = Flask("webapp")
@app.route('/')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run(host='0.0.0.0')
3. 配置
3.1 状态检测
如果不指定vrrp_script,keepalived只检测:
- 目标主机是否能够联通
- 对方keepalived是否运行
如果要检测到目标服务的状态,那就只能通过vrrp_script脚本。例如为了监控app.py进程,可以编写一个failover.sh脚本:
要点是状态正常返回0;状态不正常返回1。
#!/bin/bash
SERVICE='app.py'
STATUS=$(ps aux | grep $SERVICE | grep -v grep)
# 状态正常返回0,不正常就返回1。
if [ "$STATUS"x != ""x ]; then
exit 0
else
exit 1
fi
3.2 主节点配置
NodeA的配置:nodeA.conf
global_defs {
router_id NodeA # 节点标识
}
vrrp_script chk_webapp {
script "/home/ha/conf/failover.sh" # 只要遵从“正常返回0,失败返回1”的规则即可
interval 1 # 检测间隔
weight -20 # 失败时权重降低数
}
vrrp_instance VI_1 {
state MASTER # MASTER 或BACKUP
interface eth5 # 绑定的网络接口。具体主机具体配置
virtual_router_id 51 # 各节点一致
priority 100 # 节点权重
advert_int 1 # 广播间隔
authentication {
auth_type PASS # 节点间验证模式
auth_pass 1234 # 主备口令相同
}
virtual_ipaddress {
182.180.115.216/24 # 可不必给出掩码位数
}
track_script {
chk_webapp # 检查服务状态的vrrp_script
}
}
NodeB配置:nodeB.conf
global_defs {
router_id NodeB # 节点标识
}
vrrp_script chk_webapp {
script "/home/ha/conf/failover.sh" # 只要遵从“正常返回0,失败返回1”的规则即可
interval 1 # 检测间隔
weight -20 # 失败时权重降低数,低于其他节点的权重才会切换。
}
vrrp_instance VI_1 {
state BACKUP # MASTER 或BACKUP
interface eth6 # 绑定的网络接口。具体主机具体配置
virtual_router_id 51 # 各节点一致
priority 100 # 节点权重
advert_int 1 # 广播间隔
authentication {
auth_type PASS # 节点间验证模式
auth_pass 1234 # 主备口令相同
}
virtual_ipaddress { # 绑定的VIP
182.180.115.216/24 # 可不必给出掩码位数
}
track_script {
chk_webapp # 检查服务状态的vrrp_script
}
}
4. 实验
- 在nodeA上启动keepalived
keepalived -D -f /path/to/nodeA.conf
- 在nodeB上启动keepalived
keepalived -D -f /path/to/nodeB.conf
- 观测vip,以及访问服务
分别在两个节点上运行
ip addr show
# or
ip a
curl -XGET http://182.180.169.216:5000
观测对应网络接口。
此时由于nodeA的权重较高,所以vip绑定在nodeA的网卡上。
- 关闭nodeA的服务
killall app.py
观测VIP,已经访问服务:
# 此时vip应当转移到nodeB上。如果vrrp_script中配置的weight不够,
# 即nodeA的priority+weight之后,仍然高于nodeB,则不会发生转移
ip -a
# 访问服务,应当仍然可以获取结果。
curl -XGET http://182.180.169.216:5000