Keepalived通过vrrp_script定义外部脚本并由track_script引用,脚本必须返回严格0(成功)或非0(失败)退出码,配合interval、weight控制检测频率与权重变化,且需使用绝对路径、root可执行权限。

Keepalived怎么调用监控脚本判断服务是否存活
Keepalived本身不直接执行业务健康检查,必须靠vrrp_script定义外部命令,再在vrrp_instance里引用。关键不是“能不能跑脚本”,而是脚本退出码必须严格为0(成功)或非0(失败),Keepalived只认这个。
常见错误是脚本里用了echo、logger或没设set -e,导致即使服务挂了也返回0。建议脚本末尾显式加exit 0或exit 1,别依赖命令链默认退出码。
- 脚本路径必须对
keepalived进程用户(通常是root)可执行,且不含相对路径——用绝对路径,比如/usr/local/bin/check_nginx.sh -
vrrp_script里用script字段写完整命令,支持参数,例如script "/usr/local/bin/check_http.sh -H 127.0.0.1 -p 8080" - 通过
interval控制检测频率,默认2秒;weight决定状态变化时VIP权重增减值,不是“权重越高越优先”——它影响的是当前节点在master选举中的相对分值
监控脚本里该检查什么才真正反映服务可用性
别只看进程是否存在。ps aux | grep nginx这种检查在Nginx配置错误导致worker全崩、但master还活着时会误判。真实可用性得模拟客户端请求。
推荐组合检查:端口连通性 + HTTP状态码 + 关键响应内容。比如Nginx后端是API服务,就用curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8000/health,再判断返回是否等于200。
- 避免用
telnet或nc -z——它们只确认端口开放,不验证应用层逻辑正常 - 超时必须设短:
curl -m 2或timeout 2 curl,否则一次检测卡住会拖慢整个VRRP状态机 - 脚本里不要写
sleep或长耗时操作,Keepalived主线程是单线程调用脚本,阻塞会导致VIP切换延迟甚至脑裂
为什么VIP没切走?常见配置和权限陷阱
最常遇到的是priority没配对、state没按实际角色设,或者SELinux/防火墙拦了VRRP组播包(224.0.0.18)。但更多时候是脚本根本没被触发——因为vrrp_script没被track_script引用。
- 漏掉
track_script { check_backend }这行,脚本定义再全也白搭 -
priority值必须满足:master比backup高,且差值要大于vrrp_script里weight的绝对值,否则权重变化无法触发角色切换 - 检查
ip addr show确认VIP是否已绑到网卡;查journalctl -u keepalived -n 50,搜索check_或script关键字,看脚本执行日志和退出码 - CentOS 7+默认启用SELinux,若脚本调用
curl或openssl,可能被阻止——临时用setenforce 0验证,长期方案是写SELinux策略或改用keepalived的systemd服务类型为unconfined_service_t
多个服务共用一套Keepalived时怎么避免互相干扰
一个Keepalived实例能管理多个vrrp_instance,但每个实例绑定一个VIP、一个虚拟路由器ID(vrid)、一套独立的track_script。不能让两个实例共用同一个vrrp_script名,否则后加载的会覆盖前一个。
典型场景:一台机器既要管Web VIP(192.168.1.100),又要管DB VIP(192.168.1.101),就得定义两个vrrp_instance块,各自配virtual_router_id(如31和32),并分别引用check_web和check_db脚本。
-
virtual_router_id必须是1–255之间的整数,同一局域网内所有Keepalived节点中,相同VIP对应的vrid必须一致,不同VIP必须不同 - 脚本文件名、
vrrp_script名、track_script名三者要一一对应,大小写敏感,拼错一个就不会生效 - 如果两个VIP需要强绑定(比如Web和DB必须在同一台机器上),就别拆成两个
vrrp_instance,改用一个实例里写多个track_script,并在脚本里做复合判断,返回统一结果
脚本退出码、vrid唯一性、track_script引用关系,这三个点出问题时现象高度相似:VIP不动、日志没报错、但就是不切换。排查时先盯死这三项,比反复重载配置更快。











