You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:55:19