如何通过Shell脚本程序化检测HAProxy的流量路由目标服务器
判断活跃后端服务器的几种程序化方法
针对你的主备HAProxy+Keepalived架构,以下几种Shell脚本友好的方法可以判断当前接收流量的活跃后端服务器:
方法1:通过HAProxy统计接口解析
如果HAProxy开启了stats页面,直接用curl请求后过滤状态:
# 替换为你的HAProxy stats地址和后端集群名称 STATS_URL="http://192.168.1.10:1936/stats" BACKEND_GROUP="backend_servers" # 过滤出非备用且状态UP的后端节点 ACTIVE_BACKEND=$(curl -s $STATS_URL | awk -v group="$BACKEND_GROUP" '$1 == group && $8 == "UP" && $17 != "backup" {print $2}') echo "当前活跃后端:$ACTIVE_BACKEND"
stats输出字段说明:$1是后端组名,$8是服务器在线状态,$17标记是否为备用节点,仅非备用且UP的节点会接收流量。
方法2:结合Keepalived主备状态判断
先确认当前HAProxy节点是否为Keepalived主节点(持有VIP),再查询该节点上的活跃后端:
# 替换为你的VIP地址 VIP="192.168.1.20" # 检查当前节点是否持有VIP if ip addr show | grep -q "$VIP"; then # 调用统计接口获取活跃后端 STATS_URL="http://127.0.0.1:1936/stats" BACKEND_GROUP="backend_servers" ACTIVE_BACKEND=$(curl -s $STATS_URL | awk -v group="$BACKEND_GROUP" '$1 == group && $8 == "UP" && $17 != "backup" {print $2}') echo "当前活跃后端:$ACTIVE_BACKEND" else echo "当前为HAProxy备用节点,无需执行同步" fi
只有Keepalived主节点上的HAProxy会处理流量,所以仅在主节点执行后端状态查询即可。
方法3:通过HAProxy Socket获取状态
如果不想暴露HTTP统计接口,可通过HAProxy的本地Socket查询,更安全:
# 替换为你的HAProxy Socket路径和后端集群名称 HAPROXY_SOCKET="/var/run/haproxy.sock" BACKEND_GROUP="backend_servers" # 发送状态查询命令并解析 ACTIVE_BACKEND=$(echo "show stat" | socat $HAPROXY_SOCKET stdio | awk -v group="$BACKEND_GROUP" '$1 == group && $8 == "UP" && $17 != "backup" {print $2}') echo "当前活跃后端:$ACTIVE_BACKEND"
需要确保脚本运行用户对该Socket有读写权限,且已安装socat工具。
注意事项
- 若后端采用主备模式配置(仅一个节点活跃),上述方法均可精准定位到接收流量的节点;
- 可将获取到的
ACTIVE_BACKEND变量直接传入osync脚本,作为同步源或目标节点。
内容的提问来源于stack exchange,提问作者MoonLight
相关产品推荐
相关产品推荐

