Keepalived通过自定义脚本实现Go微服务健康检查:Go服务需暴露/health端点返回200,脚本用curl检测并返回退出码,Keepalived在vrrp_instance中通过track_script调用该脚本,依据结果调整优先级触发VIP漂移。
Keepalived 本身不直接监控应用层服务(比如 Go 微服务),它依赖外部脚本或健康检查机制来判断后端是否存活。要实现对 Go 微服务的高可用集群,核心思路是:用 Keepalived 管理 VIP 漂移,用自定义健康检查脚本探测 Go 服务的 HTTP/HTTPS 或 TCP 端口状态,并根据结果触发主备切换。
Go 微服务需暴露健康检查接口
你的 Go 服务必须提供一个轻量、稳定、无副作用的健康探针端点,例如
/health
或
/ping
,返回 HTTP 200 即可。推荐使用标准库
实现:
监听固定端口(如
:8080
)
响应 GET 请求,不依赖数据库或下游服务
避免耗时操作,超时控制在 1 秒内
示例响应:
+ 纯文本
编写 Keepalived 健康检查脚本
在每台服务器上创建检测脚本(如
/usr/local/bin/check_go.sh
),用 curl 或 wget 验证 Go 服务是否可访问:
脚本需有执行权限:
检测失败时返回非零退出码(Keepalived 仅认 exit code)
建议加超时和重试,避免瞬时抖动误判
示例内容:
Keepalived 配置中启用 track_script
在
/etc/keepalived/keepalived.conf
的
段中引用该脚本:
定义脚本块:
在实例中绑定:
确保
和
的 priority 设置合理(如 100 和 90)
主备必须一致,
填实际网卡名(如 eth0、ens33)
验证与注意事项
配置完成后需验证关键行为:
手动停掉 Go 服务,观察 keepalived 日志(
)是否触发切换
检查 VIP 是否已漂移到 backup 节点:
确认 backup 节点上的 Go 服务已启动(脚本不负责启停,需自行保障)
避免“脑裂”:确保主备间网络互通,VRRP 组播包(224.0.0.18)不被防火墙拦截
net/httpHTTP/1.1 200 OKokchmod +x /usr/local/bin/check_go.sh#!/bin/bash
curl -f -m 2 http://127.0.0.1:8080/health >/dev/null 2>&1
exit $?vrrp_instancevrrp_script chk_go { script "/usr/local/bin/check_go.sh" interval 2 }track_script { chk_go }state MASTERstate BACKUPvirtual_router_idinterfacejournalctl -u keepalived -fip addr show | grep 172.25.254.88