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

如何基于URL中的ID实现HAProxy负载均衡的会话粘性?

基于URL路径ID实现HAProxy会话粘性及故障节点自动清理方案

问题背景

我最初研究了HAProxy基于URL参数实现会话粘性的可能性,之后进一步思考:像/objects/:objectId这种包含路径ID的URL,能不能利用:objectId来实现会话粘性?

初步实现与问题

我先完成了基础的基于URL路径的会话粘性配置,能实现负载均衡,但遇到了服务器宕机时stick-table不会自动更新的问题——宕机节点对应的粘性条目依然存在,导致部分请求仍被路由到不可用服务器:

global
    daemon
    maxconn 256
defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
frontend http-in
    bind *:80
    default_backend servers
backend servers
    balance roundrobin
    stick-table type string size 200k expire 30m
    stick on path
    server server1 127.0.0.1:8000
    server server2 127.0.0.1:8001
listen stats
    bind 127.0.0.1:9000
    mode http
    log global
    maxconn 10
    stats enable
    stats hide-version
    stats refresh 5s
    stats show-node
    stats auth admin:password
    stats uri /haproxy?stats

解决后的完整配置

后来通过添加健康检查相关配置,解决了这个问题。现在的配置既能精准基于/objects/:objectId的路径ID实现会话粘性,还能自动检测服务器状态,当服务器不可达时自动清理stick-table中对应条目:

global
    daemon
    maxconn 256
defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
frontend http-in
    bind *:80
    default_backend servers
backend servers
    balance roundrobin
    stick-table type string size 200k expire 30m
    # 配置HTTP健康检查:每250ms发送GET请求到/health,预期返回200状态码
    option httpchk GET /health
    http-check expect status 200
    # 仅对/objects/开头的URL生效,提取第2个斜杠后的内容(即objectId)作为粘性标识
    stick on path,word(2,/) if { path_beg /objects/ }
    server server1 127.0.0.1:8000 check inter 250
    server server2 127.0.0.1:8001 check inter 250
listen stats
    bind 127.0.0.1:9000
    mode http
    log global
    maxconn 10
    stats enable
    stats hide-version
    stats refresh 5s
    stats show-node
    stats auth admin:password
    stats uri /haproxy?stats

关键配置说明

  • 精准路径粘性:stick on path,word(2,/) if { path_beg /objects/ } 会过滤出/objects/开头的URL,提取第2个斜杠后的objectId作为粘性依据,确保相同objectId的请求始终路由到同一台可用服务器。
  • 自动故障清理:check inter 250配合HTTP健康检查规则,让HAProxy每250ms检测一次服务器状态。当服务器无法返回200状态码时,HAProxy会将其标记为不可用,并自动删除stick-table中指向该服务器的条目,后续请求会自动路由到健康节点。

内容的提问来源于stack exchange,提问作者Felipe Taiarol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:07:50