0
点赞
收藏
分享

微信扫一扫

五月学习之keepalived 状态监测

1、场景需求

根据我们对keepalived的了解,我们知道它基于VRRP协议不但实现了高可用性的功能,而且还实现了基于脚本文件实现了状态监测的功能,而这个功能使用的场景非常多。

拓展开来,只要我们掌握这个状态监测的方法,我们就可以对keepalived管理的所有内容统统进行状态监测,而且还可以基于本身的邮件通知功能实现更为精细化的服务管理。

我们的需求就是:keepalived采用脚本的方式动态方式来检查keepalived服务的状态,然后通过手工操作模拟keepalived故障,检查keepalived的服务检查状态。

2、需求分析

为了满足上面的场景需求,我们需要通过以下几个步骤来完成整个动作
1 编写检查脚本文件
2 keepalived配置文件使用脚本
3 效果检查

3、关键点分析

1 编写检查脚本文件
  1.1 编写检测服务脚本
2 keepalived配置文件使用脚本
	2.1 配置检测脚本
3 效果检查

4、配置详解

为了更高效的使用keepalived的脚本检测功能,我们先来学习一下,如何配置脚本的检查流程。

配置流程
如果要实现状态监测效果,我们需要按照以下步骤来做:
1 配置 VRRP script(s) 的状态检查命令
2 在VRRP实例中使用指定的检查命令
VRRP script配置
根据 man keepalived.conf 方式来查看VRRP script的配置信息显示:vrrp_script配置是专门用于设定监控VRRP实例用的配置,格式效果如下:
vrrp_script <SCRIPT_NAME> {
   script <STRING>|<QUOTED-STRING> 	# 设定执行脚本的路径,也可以是命令行的检测命令
   interval <INTEGER>  				# 设定脚本执行的间隔时间,默认1s
   timeout <INTEGER>   				# 设定脚本失败的超时时间
   weight <INTEGER:-254..254>  		# 设定脚本的权重,默认是0
   rise <INTEGER>              		# 执行多少次,表示成功OK
   fall <INTEGER>              		# 执行多少次,表示失败KO
   user USERNAME [GROUPNAME]  		#设定脚本的用户/组属性信息
   init_fail                   		# 假设脚本最初处于失败状态
}
注意:
		我们一般使用里面的两条红色字体的属性
		检测命令的<SCRIPT_NAME>是VRRP专用的,一定要保证在VRRP场景下是唯一的
		script 属性要求尽量使用脚本格式,不包含特殊字符和表达式的简单命令也可以,如果命令里包含特殊字符	就不能执行,比如"[[ ]]"符号,报错效果如下
Mar 27 23:09:51 [localhost] Keepalived_vrrp[1422]: Unable to access script `[[`


配置示例:
vrrp_script chk_keepalived {
   script "/bin/bash /path/to/script.file"
   interval 1
   weight -10
}
注意:
此处的weight很重要,它与vrrp_instance的priority属性共同决定了集群中MASTER和BACKUP角色切换动作,这个值一般有正数和负数之分,最终功能都是一样的,我们一般用负数。
weight为负(-n):
脚本执行失败,主节点的"priority-weight值",若差值小于BACKUP节点的priority,则切换备为主,否	则不切换角色状态

使用检测命令
我们可以在vrrp_instance配置段中,基于track_script属性来执行已设定好的vrrp_script。
track_script {
    <SCRIPT_NAME>
    <SCRIPT_NAME> weight <-254..254>
}
注意:
		我们一般使用第一条配置样式即可。
		必须保证<SCRIPT_NAME>在上面的vrrp_script中定义好了。

配置示例
track_script {  
    chk_keepalived
}

5、操作实践

1 编写检查脚本文件
1.1 编写检测服务脚本
创建专用脚本目录
mkdir /data/scripts/ -p
创建脚本
]# vim /data/scripts/keepalived_check.sh
#!/bin/bash
if [ -f /tmp/keepalived.fail ];then
  weight -2
fi
注意:
脚本中的 "weight -2" 表示,当我们存在keepalived的fail文件的时候,表明该软件已经故障,需要降低本主机的优先级,便于BACKUP主机提升为主角色
-2 的值,需要根据MASTER和BACKUP的优先级进行规划,保证 "MASTER优先级-2 < BACKUP优先级"

2 keepalived配置文件使用脚本
2.1 配置检测脚本
修改后的keepalived配置文件内容如下
global_defs {
   router_id kpmaster
}
vrrp_script chk_keepalived {
   script "/bin/bash /data/scripts/keepalived_check.sh"
   interval 1
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        192.168.8.100
    }
    track_script {
        chk_keepalived
    }
}
注意:
track_script 中使用的名称,一定要在vrrp_script中定义
vrrp_script中script属性的脚本使用,应该使用标准的"/bin/bash /path/to/file"避免因为权限问   题导致脚本无法执行,从而影响keepalived的正常使用
两台keepalived主机必须做同样的配置修改

3 效果检查
启动服务
systemctl start keepalived
注意:
两台主机都执行服务启动的命令

kpmaster查看日志效果
Mar 27 23:43:44 [localhost] Keepalived_vrrp[5069]: VRRP_Script(chk_keepalived) succeeded
Mar 27 23:43:44 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 27 23:43:46 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 27 23:43:46 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 27 23:43:46 [localhost] Keepalived_vrrp[5069]: Sending gratuitous ARP on eth0 for 192.168.8.100
检查ip地址
[root@kpmaster ~]# ip addr
...
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:9f:ea:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.14/24 brd 192.168.8.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.8.100/32 scope global eth0
结果显示:
	主从两个节点状态都正常

模拟故障测试
kpmaster主机创建fail文件
touch /tmp/keepalived.fail
kpmaster主机查看日志
Mar 27 23:50:49 [localhost] Keepalived_vrrp[5069]: /bin/bash /data/scripts/keepalived_check.sh exited with status 127
Mar 27 23:50:49 [localhost] Keepalived_vrrp[5069]: VRRP_Script(chk_keepalived) failed
Mar 27 23:50:50 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) Entering FAULT STATE
Mar 27 23:50:50 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) removing protocol VIPs.
Mar 27 23:50:50 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) Now in FAULT state
Mar 27 23:50:50 [localhost] Keepalived_vrrp[5069]: /bin/bash /data/scripts/keepalived_check.sh exited with status 127
...
kpslave主机查看日志
Mar 27 23:50:51 [localhost] Keepalived_vrrp[1756]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 27 23:50:52 [localhost] Keepalived_vrrp[1756]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 27 23:50:52 [localhost] Keepalived_vrrp[1756]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 27 23:50:52 [localhost] Keepalived_vrrp[1756]: Sending gratuitous ARP on eth0 for 192.168.8.100
kpmaster主机检查ip
[root@kpmaster ~]# ip addr
...
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:9f:ea:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.8.14/24 brd 192.168.8.255 scope global eth0
valid_lft forever preferred_lft forever
kpslave主机检查ip
[root@kpslave ~]# ip addr
...
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:b0:56:23 brd ff:ff:ff:ff:ff:ff
inet 192.168.8.15/16 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.8.100/32scope global eth0
模拟故障修复
kpmaster主机移除fail文件
rm -f /tmp/keepalived.fail
kpmaster主机查看日志
Mar 27 23:52:23 [localhost] Keepalived_vrrp[5069]: VRRP_Script(chk_keepalived) succeeded
Mar 27 23:52:24 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) Entering BACKUP STATE
Mar 27 23:52:25 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) forcing a new MASTER election
Mar 27 23:52:26 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 27 23:52:27 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 27 23:52:27 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 27 23:52:27 [localhost] Keepalived_vrrp[5069]: Sending gratuitous ARP on eth0 for 192.168.8.100
Mar 27 23:52:27 [localhost] Keepalived_vrrp[5069]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.8.100
kpslave主机查看日志
Mar 27 23:52:25 [localhost] Keepalived_vrrp[1756]: VRRP_Instance(VI_1) Received advert with higher priority 100, ours 99
Mar 27 23:52:25 [localhost] Keepalived_vrrp[1756]: VRRP_Instance(VI_1) Entering BACKUP STATE
Mar 27 23:52:25 [localhost] Keepalived_vrrp[1756]: VRRP_Instance(VI_1) removing protocol VIPs.
kpmaster主机检查ip
[root@kpmaster ~]# ip addr
...
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:9f:ea:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.8.14/24 brd 192.168.8.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.8.100/32scope global eth0
kpslave主机检查ip
[root@kpslave ~]# ip addr
...
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:b0:56:23 brd ff:ff:ff:ff:ff:ff
inet 192.168.8.15/16 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever
结果显示:
		keepalived可以结合内置的vrrp_script和track_script两个属性来实现自动服务检测的作用。


6、实践小结

对于任何场景下的服务检测功能,我们可以结合keepalived的内置属性来完成,完成步骤如下:
1 规划服务的检测内容
2 定制服务检测脚本
3 keepalived使用脚本检测配置
4 效果测试

注意:
keepalived在使用脚本检测配置的时候,一定要注意:
track_script 中使用的名称,一定要在vrrp_script中定义
vrrp_script中script属性的尽量脚本方式,而且使用标准的"/bin/bash /path/to/file"格式

举报

相关推荐

0 条评论