之前就想写一个关于keepalive的,但因为网上的资料很多,想算了。后来自己又操作了一下,觉得还是自己写得用起来方便。
安装:
下载keepalived最新源码包:
https://www.keepalived.org/download.html
安装方法一:
./configure
make
make install
安装方法二:
源码包中自带spec,使用rpmbuild -bb命令,把包编译成rpm然后给服务器安装。
安装命令:
rpm -ivh keepalived-2.1.5-1.el7.x86_64.rpm
安装方法三:
直接用"yum -y install keepalived"安装,但这样安装的包不是最新版本也勉强能用。
配置及启停
配置
! Configuration File for keepalived
vrrp_script check_ngx_alive {
script "/etc/keepalived/check_ngx_alive.sh" # 状态检测脚本
interval 2 # 状态检测时间间隔
weight -10 # 当状态检测脚本返回非0值时当前节点priority在设置值基础上降低多少
}
global_defs {
notification_email {
#acassen@firewall.loc
#failover@firewall.loc
#sysadmin@firewall.loc
}
#notification_email_from Alexandre.Cassen@firewall.loc
#smtp_server 192.168.200.1
#smtp_connect_timeout 30
router_id LVS_DEVEL_112 # 保证名称唯一
script_user root # 指定脚本运行的用户
enable_script_security
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens32 #发vrrp包的接口,可以选择一对专用接口做心跳线
virtual_router_id 51
priority 112 #优先级,keepalived会根据优先级判断是主是从
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 设置VIP
192.168.15.110/24 dev ens32 # 还可以设置得更复杂一点如"192.168.1.33/24 brd 192.168.1.255 dev eno1 label eno1:1",如果不指定王凯,就绑定到interface配置的接口
}
track_script { # 设置检测脚本
check_ngx_alive # vrrp_script上面定义的检测脚本的名称
}
notify_master "/etc/keepalived/arp_update.sh" # 变成主节点后执行的脚本
notify_backup "/etc/keepalived/notify.sh backup" #同理,变成bakup时执行的脚本
notify_fault "/etc/keepalived/notify.sh fault"
preempt_delay 3 # 变成主节点后多长时间抢占VIP,如果不需要切换可直接写nopreempt
}
virtual_server 192.168.15.110 8034 { # LVS的相关配置
delay_loop 6 # 每隔6秒查询realserver状态
lb_algo rr # lvs的调度算法
lb_kind DR # lvs的集群模式
persistence_timeout 50 #指定时间内来自同一Client的请求会被发送到同一个RealServer
protocol TCP
real_server 192.168.15.112 8034 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 1554
}
}
}
启停
systemctl start keepalived #启动
systemctl stop keepalived #停止
systemctl restart keepalived #重启
systemctl status keepalived #查看状态
脚本参考
check_ngx_alive.sh
if [ `ps aux | grep nginx | grep -v grep | wc -l` -eq 0 ];then
exit 1
fi
exit 0
arp_update.sh
#!/bin/bash
VIP=192.168.15.110
GATEWAY=192.168.15.253
/sbin/arping -I ens32 -c 5 -s $VIP $GATEWAY &>/dev/null
keepalive.conf
! Configuration File for keepalived
vrrp_script check_ngx_alive
{
script "/etc/keepalived/check_ngx_alive.sh"
interval 2
weight -30
user root
}
global_defs {
notification_email {
#acassen@firewall.loc
#failover@firewall.loc
#sysadmin@firewall.loc
}
router_id LVS_DEVEL_112
script_user root
enable_script_security
}
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 112
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.15.110/24 dev ens32
}
track_script {
check_ngx_alive
}
notify_master "/etc/keepalived/arp_update.sh"
#nopreempt
preempt_delay 3
}
验证及结果
场景1 双机热备
使用keepalive做主备有两种方法
前提:主priority + 主vrrp_script.weight < 备priority (注:vrrp_script.weight是一个负数)
方法一:
主设置nopreempt,state:MASTER,vrrp_script指定的脚本中,当服务不存在时执行"systemctl stop keepalived"
方法二:
两个节点都设置为"preempt_delay 3,state:BACKUP",vrrp_script指定的脚本中不需要停止keepalive
场景2 冷备
配置方法:
两个节点都设置为"preempt_delay 3,state:BACKUP",vrrp_script指定的脚本中不需要停止keepalive
主priority > 备priority; 主priority + 主vrrp_script.weight < 备priority + 备vrrp_script.weight
备的notify_master脚本中添加启动服务的命令;在备机中,服务最初处于关闭状态.
原理描述:当主上的服务挂掉之后,主priority小于备机的priority,备机变成master,触发备机的notify_master脚本,此时备机上的服务被开启,备机的优先级升高。
遇到的问题和解决方法
1. vrrp_script不执行;
答:(1)先用"tail -f /var/log/message"查看报了什么错。
(2)赋予脚本权限 chmod 755 xxx.sh,记住一定要是755.
(3)手动执行脚本,看脚本是否正常执行;(后来发现,如果用 echo "$(date)" >> xxx.log的方式判断是否执行判断不出来,好像echo已经被屏蔽了一样。但是脚本确实已经执行了,从启停服务上看是正常的.)
(4)脚本的名称问题,比如叫"check_nginx_status.sh"结果脚本里判断条件是"ps -ef | grep nginx | grep -v grep | wc -l
-eq 2",这时候会导致运行脚本的进程会被算到ps的统计里面去,导致脚本执行不准;
(5)看脚本前面是不是加了"#!/bin/bash",否则keepalive不知道用sh还是bash来执行你的脚本
2.notify_master等脚本不执行,配置不生效的问题;
答:首先查看是否打开了SELINUX;
getenforce
如果是,那有几种办法:
(1)关掉SELINUX
setenforce 0 #临时关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #重启后永久生效
(2)赋予脚本安全执行权限;
chcon -t keepalived_unconfined_script_exec_t /etc/keepalived/arp_update.sh
3.如何判断VIP是否漂移?
方法一:在服务器上使用"ip addr"命令,查看VIP在哪台上,就是漂移到哪台上了。
方法二:查看/var/log/message日志
方法三: 在其他终端上ping以下VIP,然后用"arp -a"命令查看vip对应的MAC地址是哪个就是哪个了。
4.VIP漂移很慢的问题;
答:这个也没有什么好办法,可以用下面的脚本试试;就是用arping更新arp信息,写在notify_master脚本中;
VIP=192.168.15.110
GATEWAY=192.168.15.253
/sbin/arping -I ens32 -c 5 -s $VIP $GATEWAY &>/dev/null
不知道在你的环境中是怎样的,我测试的结果是失败的。在同网段不管用不用arping VIP漂移都是实时生效的,但是跨网段很长时间都是连接异常。
网关的arp列表有时候迟迟不刷新,有时候刷新了还是连接不上,折腾了一阵还是没有解决。
难道是需要路由器开启VRRP协议?理论上是不需要的,路由器的VRRP协议是为了备份路由的,好像和KeepAlive没有管理。因为家用路由器没那选项,公司的路由器还没试过。有条件的同学可以尝试一下:
参考地址:https://www.cisco.com/c/en/us/support/docs/security/vpn-3000-series-concentrators/7210-vrrp.html
如果成功了记得回复我一下。