! Configuration File for keepalived
#global_defs当中配置的是主机名,我的192.168.156.11的主机名是nginx1,因此这里配置的router_id的值是nginx1。
global_defs {
router_id nginx1
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 11
mcast_src_ip 192.168.156.11
priority 100
nopreempt
advert_int 1
#这段配置两个节点要一样,表明它们属于一个组,keepalived会同一组中去做检查并保持高可用。
authentication {
auth_type PASS
auth_pass 1111
}
#这段配置中的"chk_nginx"与我们在上面定义的定时执行脚本配置(vrrp_script chk_nginx)的名称要一样。
track_script {
chk_nginx
}
#对外提供的虚拟IP,这里可以是一个也可以是多个。
virtual_ipaddress {
192.168.156.110
}
}
keepalived2.conf
! Configuration File for keepalived
global_defs {
router_id nginx2
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 11
mcast_src_ip 192.168.156.12
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.156.110
}
}
nginx_check.sh
#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
#看完了配置文件,我们再来看下定时检查nginx的脚本文件nginx_check.sh(需要确保脚本格式是unix格式,方法是vim进入编辑模式,然后输入:set ff并按回车即可看到格式)。
#如下所示(注意:wc -l的"l"是小写的L而不是1)。
#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
#下面这行脚本的意思是,如果查询到的nginx的进程数量是0的话,就执行if条件里的内容。
#下面这行代码的意思是由于检查到当前没有nginx进程,因此尝试去启动nginx。
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
#下面这行脚本的意思是启动nginx之后休眠2秒。
sleep 2
#下面这段脚本的医生说是如果nginx的进程数还是0的话,就认为nginx已经挂掉了,需要杀掉这个节点上所有的keepalived进程。
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi