Keepalived通过vrrp_script调用自定义脚本检测Node.js进程、端口及健康接口三重状态,返回0则正常,非0则触发权重调整与VIP漂移。

Keepalived 本身不直接监控 Node.js 进程,但它可以通过自定义脚本(vrrp_script)定期检测进程状态,并根据结果动态调整自身优先级,从而触发 VIP 漂移。关键在于让 Keepalived “感知” Node.js 是否存活——不是靠端口通断,而是结合进程、端口、健康接口三重校验更可靠。
一、基础环境准备
确保两台服务器(主/备)已安装 Keepalived 和 Node.js,并部署相同版本的 Web 应用(如 Express/Koa)。建议统一使用 systemd 管理 Node.js 服务,便于状态判断:
- 关闭 SELinux 和防火墙(或放行 VRRP 多播地址 224.0.0.18 及虚拟 IP 通信端口)
- 配置时间同步(
chronyd或ntpd),避免因时间差导致脑裂 - 主备节点需能互相 SSH 免密通信(用于后续日志或故障排查)
- 确保网卡名一致(如都为 ens33),避免
interface配置出错
二、编写 Node.js 健康检查脚本
在 /etc/keepalived/check_node.sh 中写入以下内容(主备节点均需部署,权限设为 755):
#!/bin/bash
# 检查 Node.js 进程是否运行且监听指定端口(如 3000)
if pgrep -f "node.*app.js" > /dev/null; then
if ss -tln | grep ":3000" > /dev/null; then
# 可选:进一步调用健康接口(需应用暴露 /health)
if curl -s --connect-timeout 2 http://127.0.0.1:3000/health | grep -q "ok"; then
exit 0
else
exit 1
fi
else
exit 1
fi
else
exit 1
fi
说明:该脚本返回 0 表示健康,非 0 表示异常;Keepalived 会据此决定是否降低本节点优先级。
三、Keepalived 主配置(以主节点为例)
编辑 /etc/keepalived/keepalived.conf,核心段如下:
global_defs {
router_id NODEJS_MASTER
}
vrrp_script chk_nodejs {
script "/etc/keepalived/check_node.sh"
interval 2 # 每 2 秒执行一次
weight -30 # 检测失败时,优先级减 30(确保低于备机初始值)
fall 2 # 连续 2 次失败才触发降权
rise 2 # 连续 2 次成功才恢复权重
}
vrrp_instance VI_NODEJS {
state MASTER
interface ens33
virtual_router_id 88 # 主备必须一致
priority 100 # 主机初始优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 123456 # 主备密码必须相同
}
track_script {
chk_nodejs
}
virtual_ipaddress {
192.168.115.250/24 dev ens33 label ens33:1
}
}
备节点只需修改:state BACKUP、priority 90(比主机低即可),其余保持一致。
四、验证与注意事项
启动服务后,通过以下方式验证效果:
- 主节点执行
ip a | grep 192.168.115.250,应看到 VIP 绑定 - 手动停掉主节点 Node.js 进程(
killall node),约 4–6 秒后 VIP 自动漂移到备节点 - 重启主节点 Node.js 并等待脚本恢复成功,VIP 不会自动切回(默认非抢占式);如需抢占,加
nopreempt到vrrp_instance块外并设preempt_delay 30 - 日志查看:
journalctl -u keepalived -f,关注Transition to MASTER/BACKUP记录
不复杂但容易忽略:Node.js 应用必须监听 0.0.0.0:3000(而非 127.0.0.1),否则本地 curl 检测会失败;同时确保健康接口返回明确 JSON 如 {"status":"ok"},避免正则匹配误判。











