【问题标题】:HAProxy stick-table store a custom valueHAProxy 棒表存储自定义值
【发布时间】:2023-08-14 09:05:01
【问题描述】:

我想在 Stick-table 中存储一个自定义“值”,并在另一个 ACL 中使用它来选择服务器。

我有这个配置,它创建了带有标头值“x-external-id”作为键和 server-id 作为其值的stick-table。

frontend frontend
   bind 125.213.51.144:8080
   default_backend  backend

backend  backend
   balance roundrobin
   stick store-request req.hdr(x-external-id)
   stick-table type string len 50 size 200k nopurge
   server gw1 125.213.51.100:8080 check id 1
   server gw2 125.213.51.101:8080 check id 2

这个配置产生了这个棒表:

# table: backend, type: string, size:204800, used:3
0x558955d52ac4: key=00000000000 use=0 exp=0 server_id=1
0x558955d53114: key=11111111111 use=0 exp=0 server_id=2
0x558955d87a34: key=22222222222 use=0 exp=0 server_id=2

值 (server-id) 由 HaProxy 根据处理请求的服务器设置。但我想在这里保存一个自定义值。有可能吗?

【问题讨论】:

    标签: load-balancing haproxy internal-load-balancer sticky-session


    【解决方案1】:

    显然 HAPRoxy 不允许存储自定义值。只有 server_id 和跟踪计数器可以存储在 stuick 表中。

    所以我定义了两个后端,每个后端都有一个sticktable。每个客户端都访问自己的后端并填充棒表。

    从另一个 HAProxy 部分,我可以使用 table_server_id 在sticktables中查找并路由到拥有该条目的sticktable的后端。

    ############## Frontend ################
    frontend my-frontend
       bind 125.213.51.100:38989
    
       acl is_service1 req.hdr(x-external-id),table_server_id(stick-table-1) -m int gt 0 
       use_backend my-backend    if is_service1
    
       acl is_service2 req.hdr(x-external-id),table_server_id(stick-table-2) -m int gt 0  
       use_backend my-backend-2  if is_service2
    
       default_backend my-backend-default
    
    ############## Backend 1 ################
    backend my-backend
       balance roundrobin
       server service1 125.213.51.100:18989 check id 1 inter 10s fall 1 rise 1
       server service2 125.213.51.200:18989 check id 2 backup
    
    ############## Backend 2 ################
    backend my-backend-2
       balance roundrobin
       server service2 125.213.51.100:18989 check id 2 inter 10s fall 1 rise 1
       server service1 125.213.51.200:18989 check id 1 backup
    
    ############## Backend Default  ################
    backend my-backend-default
       balance roundrobin
       server service1 125.213.51.100:18989 check id 1
       server service2 125.213.51.200:28989 check id 2
    

    【讨论】: