keepalived使用脚本进行健康检查时的相关配置项。例如keepalived+haproxy实现haproxy的高可用。mysql
keepalived分为vrrp实例的心跳检查和后端服务的健康检查。若是要配置后端服务,则后端服务只能是LVS。但vrrp能独立于lvs存在,例如keepalive结合haproxy、mysql等服务实现它们的高可用。git
如下是从man keepalived
中截取的经过脚本进行心跳检查、健康检查时的相关配置选项。man介绍的比较简单,更详细的配置说明可参考:https://github.com/acassen/keepalived/blob/master/doc/keepalived.conf.SYNOPSISgithub
VRRP script(s)
# 定义一个vrrp脚本,后续vrrp组或vrrp实例要执行某脚本时,须要今后处引用
# 注意,全部vrrp实例都会监控脚本的退出状态码
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> # 要执行的命令或脚本路径
interval <INTEGER> # 脚本调用时间间隔,默认1秒
timeout <INTEGER> # 脚本执行等待超时时长,超过该时长,表示脚本执行失败
weight <INTEGER:-254..254> # 根据该权重值调整vrrp实例优先级值,默认值为0
rise <INTEGER> # 须要成功多少次,vrrp才进行角色状态切换(从fault切换为正常)
fall <INTEGER> # 须要失败多少次,vrrp才进行角色状态切换(从正常切换为fault)
user USERNAME [GROUPNAME] # 脚本执行身份,group默认同username
init_fail # 假定脚本初始化时就处于失败状态
}
VRRP synchronization group(s)
# 分别表示切换为主/备/出错(例如监控的eth0坏了)时所执行的脚本。
# 要为脚本传递参数时,使用引号包围整个脚本和参数
notify_master /path/to_master.sh [username [groupname]]
notify_backup /path/to_backup.sh [username [groupname]]
notify_fault "/path/fault.sh VG_1" [username [groupname]]
# notify表示只要状态切换都会调用的脚本,且该脚本是在以上三个脚本执行以后再调用的,
# keepalived会自动传递四个参数,所以不要手动为脚本传递参数。
# $1 = "GROUP"|"INSTANCE"
# $2 = vrrp组名称或vrrp实例名
# $3 = 切换的目标状态(MASTER/BACKUP/FAULT)
# $4 = 优先级数值(priority value)
notify /path/notify.sh [username [groupname]]
VRRP instance(s)部分
# 监控接口,当某接口down掉时,切换为fault状态
track_interface {
eth0
eth1
eth2 weight <-254..254>
...
}
# 监控脚本,即执行vrrp_script定义的脚本
track_script {
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-254..254>
}
# notify_master/backup/fault/stop分别表示切换为主、备、出错(例如监控的eth0坏了)、vrrp中止时所执行的脚本
# 要为脚本传递参数时,使用引号包围整个脚本和参数
notify_master <STRING>|<QUOTED-STRING> [username [groupname]]
notify_backup <STRING>|<QUOTED-STRING> [username [groupname]]
notify_fault <STRING>|<QUOTED-STRING> [username [groupname]]
notify_stop <STRING>|<QUOTED-STRING> [username [groupname]] # executed when stopping vrrp
# notify表示只要状态切换都会调用的脚本,而且该脚本是在以上三个脚本执行以后再调用的
notify <STRING>|<QUOTED-STRING> [username [groupname]]
Virtual server(s)部分
# 投票被选举成功或失败时执行的脚本
quorum_up <STRING>|<QUOTED-STRING>
quorum_down <STRING>|<QUOTED-STRING>
real_server <IPADDR> <PORT>
{
# 当健康检查的后端rs上线、下线时执行的脚本
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
# MISC健康检查类型,该类型经过自定义脚原本检查后端健康情况
MISC_CHECK
{
# 执行哪一个脚原本判断后端是否健康
misc_path <STRING>|<QUOTED-STRING>
# Script execution timeout
misc_timeout <INT>
# 指定一个随机延迟时间,防止同时检查全部后端,指定为0时表示禁止该功能。
# 默认启动该功能,默认最大间隔为delay_loop的值。
warmup <INT>
# 若是指定该选项,则根据健康检查脚本的退出状态码动态调整权重值
# 退出状态码为:
# 0:表示检查成功,不作任何权重修改
# 1:表示检查失败
# 2-255:表示检查成功,但权重值减2,例如(状态码为255,则设置权重为253)
misc_dynamic
# 指定运行后端健康检查脚本的身份,不指定group时将默认使用username
user USERNAME [GROUPNAME]
}
}
}
例如,在keepalived+haproxy时。sql
vrrp_script check_haproxy {
script"/etc/keepalived/chk_haproxy.sh"
interval 2
weight 2
}
global_defs {
router_id haproxy1
}
vrrp_instanceVI_1 {
state MASTER
interface eth0 virtual_router_id 150 priority 50 advert_int 1 authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress{
192.168.1.201
}
track_script {
check_haproxy
}
}
其中check_haproxy的脚本/etc/keepalived/chk_haproxy.sh内容以下:后端
#!/bin/bash
if ! killall -0 haproxy &>/dev/null;then
serivce haproxy restart
sleep 1
if ! killall -0 haproxy &>/dev/null;then
service keepalived stop
fi
fi
另一种方式,直接在vrrp_script处定义要执行的命令,而不是使用一个额外的脚原本监控对象。例如:bash
vrrp_script check_haproxy { script "killall -0 haproxy" # 此行改变 interval 2 weight 2 } global_defs { router_id haproxy1 } vrrp_instanceVI_1 { state MASTER interface eth0 virtual_router_id 150 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress{ 192.168.1.201 } track_script { check_haproxy } }
上面的vrrp_script配置中,每两秒检查一次haproxy进程是否存在,连续检查fall <int>
次数后都不存在就进入fault状态,因为没有指定fall <int>
,因此一次检查失败就进入fault。oop
其实经过脚本控制比较复杂,由于要考虑脚本的返回值(不是退出状态码)。固然,若是直接像前面示例同样在脚本中直接进行restart、stop等操做也是能够的。spa