VRRP script
- VRRP的检测脚本
1)在keepalived学习总结中已经说过,keepalived只是提供一个VIP,但高可用的是服务,因此keepalived一般会与lvs、nginx、haproxy、mysql…等服务器联合使用,以实现服务的高可用,但是若keepalived与之联合使用的服务异常时,此处keepalived提供的VIP也就没有任何意义了,因此此时的VIP我们希望它可以自动检测与keepalived连用的服务是否正常,若服务不正常,VIP实现自动飘移至backup节点,此时可以使用VRRP scripts实现。
2)keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整。
3)vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值进行下一步操作,脚本可被多个实例调用。track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script。
4)VRRP scripts的实现:分两步:
- (1) 先定义一个脚本
vrrp_script script_name
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> #script后面可以直接接shell命令或一个可执行脚本
OPTIONS #对于上面script的执行状态结果:(0:成功|true 非0:失败|false)
}
- (2) 调用此脚本
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
定义脚本
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置
script <STRING>|<QUOTED-STRING> # shell命令或脚本路径
interval <INTEGER> # 间隔时间,单位为秒,默认1秒
timeout <INTEGER> # 超时时间
weight <INTEGER:-254..254> # 权重,当脚本成功或失败对当前节点的优先级是增加还是减少,这个值会与定义的优先级做加法例:-80时则为priority+(-80)
fall <INTEGER> #脚本几次失败转换为失败
rise <INTEGER> # 脚本连续监测成果后,把服务器从失败标记为成功的次数
user USERNAME [GROUPNAME] # 执行监测的用户或组
init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}
#基于第三方仲裁设备实现VRRP script
-
基于第三方仲裁设备主要用于检测lvs服务(lvs服务特点:无端口、无进程)
-
因此对于lvs进程,端口和进程就没有办法判断lvs的异常还是正常。
-
使用方法:
①仲裁设备检测keepalived的master节点是否正常,然后故障时做出什么样的操作。比如:仲裁设备某目录创建一个文件?
②master节点或者backup节点去检测仲裁设备文件是否存在然后对应做出什么样的操作。比如:若文件存在则VIP迁移。
注:主要看你使用的什么样的逻辑咯。
【实验规划:】
- keepalived+lvs
VIP:192.168.38.88
master:192.168.38.17
backup:192.168.38.27
仲裁设备和web server:192.168.38.37
【实验现象:】
- 当仲裁设备检测web 首页是否能够访问,web首页能访问,master正常;反之,VIP需要飘移至backup。(当然这里的前提是web server好的哈 <控制变量>)。
- 仲裁设备检测web 不存在时,将在/etc/keepalived/check/目录创建down文件。
- 仲裁设备/etc/keepalived/check/目录将共享给master 和 backup节点。
【实验过程:】
- ①将keepalived+lvs和web server实现
- ②仲裁设备搭建nfs服务,将/etc/keepalived/check/共享
- ③修改keepalived配置文件添加VRRP script部分内容,检测/etc/keepalived/check/down文件是否存在
①keepalived+lvs和web server实现
[root@centos7-17 keepalived]# cat /etc/keepalived/conf/lvs-web.conf
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 77
priority 100
advert_int 1
unicast_src_ip 192.168.38.17
unicast_peer {
192.168.38.27
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.38.88 dev eth0 label eth0:0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 192.168.38.88 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.38.47 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.38.37 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
web server端:绑定VIP
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore;echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce;echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# ip a a 192.168.38.88/24 dev eth0
测试:
[root@centos7-77 ~]# curl 192.168.38.88
web1 37
②仲裁设备搭建nfs服务,将/etc/keepalived/check/共享
此处实现,当然我是收到往共享目录中创建down文件,并未实现什么检测,然后在自动生成down文件!
NFS共享/etc/keepalived/check/目录和挂载过程 略~~
- 实现逻辑:/etc/keepalived/check/down文件存在表示master服务器故障、使用backup节点去检测/etc/keepalived/check/down文件时是否存在,backup节点检测到文件存在,需要提升自己的优先级。
backup配置文件:
[root@centos7-27 conf]# cat lvs-web.conf
################################# vrrp_script setting ##########################################
vrrp_script chk_down {
script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 7 || exit 0"
interval 1
weight +80
fall 3
rise 5
timeout 2
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 77
priority 80
advert_int 1
unicast_src_ip 192.168.38.27
unicast_peer {
192.168.38.17
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.38.88 dev eth0 label eth0:0
}
################################# 调用VRRP_scripts ##########################################
track_script {
chk_down
}
}
virtual_server 192.168.38.88 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.38.47 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.38.37 80 {
weight 1
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
【测试现象:】
- 手动在仲裁设备创建/etc/keepalived/check/down文件
- backup节点:
提升优先级 --> 提升为master节点 --> 设置VIP
高可用HAProxy
-
keepalived与HAProxy联用时,可直接检测HAProxy进程是否存在。
-
检测haproxy进程:
ps aux | grep haproxy | grep -v grep
/usr/bin/killall -0 haproxy -
0) 发送0信号 对进程做错误检查
################################# vrrp_script setting ##########################################
vrrp_script chk_haproxy {
script " /usr/bin/killall -0 haproxy"
interval 1
weight +80
fall 3
rise 5
timeout 2
}
vrrp_instance VI_2 {
################################# 调用VRRP_scripts ##########################################
track_script {
chk_down
}
}
- 也可以使用脚本方式实现
vrrp_script chk_nginx {
script "/etc/keepalived/chk_nginx.sh"
interval 1
weight -80
fall 3
rise 5
timeout 2
}
track_script {
chk_haproxy
}
# yum install psmisc -y
# cat /etc/keepalived/chk_nginx.sh
#!/bin/bash
/usr/bin/killall -0 nginx
# chmod a+x /etc/keepalived/chk_nginx.sh