参考案例二:双主模式
主备模式的缺点就是始终只有一台机器位于工作状态,另外一台机器永远是备用状态,存在资源浪费之问题。
双主模式允许两台机器均处于工作状态并互相作为备份。
搭建keepalived双方模式的要素:
1. 必须有两个虚拟IP, 分别绑定至两个节点上
2. 每个节点作为某个虚拟IP的主节点,并同时作为另外一个虚拟IP的备用节点。
3. 当某个节点产生故障时,两个虚拟IP自动绑定至正常节点上
参阅相关文章,这就相当于使用两台物理路由器(普通主机视为路由器即可),构造出两个虚拟VRRP路由器。

也就是说,两个节点的配置应该是交叉的,对同个虚拟IP,交叉互为主备。
节点A的关键配置:
vrrp_instance vip1 {
state MASTER
interface eth0
virtual_router_id 51 #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
priority 99 #对应备用节点值应该比此值小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.1 /24
}
}
vrrp_instance vip2 {
state BACKUP
interface eth0
virtual_router_id 52 #本机两个vrrp_instance组的此值不能相同,但对应主节点的此值必须相同
priority 90 #主节点的值应该比此值大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.2 /24
}
}
复制节点A的配置至B节点,并将MASTER修改为BACKUP, 同时将BACKUP修改为MASTER。优先级和虚拟路由器组id(virtual_route_id)要特别注意其它配置必须保持相同。
B节点的配置:
vrrp_instance vip1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.1 /24
}
}
vrrp_instance vip2 {
state MASTER
interface eth0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.2 /24
}
}
另外,为了保证服务可靠性,我们应该在每个节点运行shell脚本检测本机的服务是否正常,一旦检测到服务异常时,停止掉本机的
keepalived,
如此虚拟IP自动转移到备用机器之上,如每隔3秒检测一次本机服务状态,如果连接3次检测失败,则停止掉keepalived实例。同时如果本机服务是正
常的,但是keepalived没有启动(故障恢复之后),则启动keepalived,以达到故障恢复之目的。
check_service.sh文件的内容
#!/bin/bash
pidfile=/var/lock/subsys/`basename $0`.pid
if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then
exit 1
fi
trap "rm -fr $pidfile ; exit 0" 1 2 3 15
echo $$ > $pidfile
maxfails=3
fails=0
success=0
while [ 1 ]
do
/usr/bin/wget --timeout=3 --tries=1 http://127.0.0.1/ -q -O /dev/null
if [ $? -ne 0 ] ; then
let fails=$[$fails+1]
success=0
else
fails=0
let success=$[$success+1]
fi
if [ $fails -ge $maxfails ] ; then
fails=0
success=0
#check keepalived is running ? try to stop it
service keepalived status | grep running
if [ $? -eq 0 ] ; then
logger -is "local service fails $maxfails times ... try to stop keepalived."
service keepalived stop 2>&1 | logger
fi
fi
if [ $success -gt $maxfails ] ; then
#check keepalived is stopped ? try to start it
service keepalived status | grep stopped
if [ $? -eq 0 ] ; then
logger -is "service changes normal, try to start keepalived ."
service keepalived start
fi
success=0
fi
sleep 3
done
两个节点上均应运行此脚本,请将此脚本加入到cron任务中(此程序已经作了单实例运行机制,加入计划任务的作用就是防止脚本意外中断后检测功能失效),可实现的功能:
如果本地服务连续三次检测失败,就尝试停止keepalived服务(如果keepalived处于运行状态)
如果本地服务连接三次检测成功,但keepalived没有启动,则启动之
关键的执行点,均已经记录到系统日志中(/var/log/messages)
执行crontab -e , 加入以下内容:
*/1 * * * * /root/check_service.sh
此脚本的原始文件
下载在Linux公社的1号FTP服务器里,下载地址:
FTP地址:ftp://www.
用户名:www.
密码:www.muu.cc
在 2012年LinuxIDC.com\8月\Keepalived配置及典型应用案例
下载方法见 http://www./thread-1187-1-1.html
停止掉本机的keepalived, 稍过一会,就会keepalived服务被自动启动了(这是因为本地服务检测正常)
停止掉本机的nginx, 稍过一会,就会发现keepalived服务也被停止掉了
再启动nginx, 稍过一会,发现keepalived也被正常启动,并绑定了正确的虚拟IP
我们可根据具体环境,将服务的检测功能强化(如检测到网关的连接性),以达到较好的故障转移效果。
