haproxy 坚持后端服务器组

haproxy stick to group of backend servers

所以我正在努力为我的 haproxy 找到正确的配置:

我在 Rails Web 应用程序上有 Ruby,它由两台物理主机提供服务,每台主机有 3 个工作人员。两台主机各有一个数据库,两个数据库实时同步。

我试图让会话保持在同一台主机上,因此请求仍然在每台主机的 3 名工作人员之间进行负载平衡。

objective是为了避免同一客户端的两次连续请求被发送到不同的主机。

我的配置如下所示:

frontend web_front
  bind *:4100
  default_backend web_back


backend web_back
  cookie SERVERID insert indirect nocache
  balance roundrobin

  server host_1_web_1 129.168.0.1:3000 maxconn 1 check cookie SRV_1
  server host_1_web_2 129.168.0.1:3001 maxconn 1 check cookie SRV_1
  server host_1_web_3 129.168.0.1:3002 maxconn 1 check cookie SRV_1

  server host_2_web_1 129.168.0.2:3000 maxconn 1 check cookie SRV_2
  server host_2_web_2 129.168.0.2:3001 maxconn 1 check cookie SRV_2
  server host_2_web_3 129.168.0.2:3002 maxconn 1 check cookie SRV_2

如您所见,我已将每台主机的 cookie 设置为相同的值,希望请求仍能在 worker 之间正确负载平衡,但现在似乎只有每台主机的第一个 worker 收到请求。

有办法解决这个问题吗?也许使用粘性表?

如果我对您的要求理解正确,您需要两个不同级别的负载平衡:
1. 使用会话持久化的服务器负载均衡
2. 没有会话持久性的工作负载平衡。

一个解决方案是在服务器端提供一个服务来侦听 HAProxy 连接并在工作人员之间进行负载平衡。
但是您仍然可以通过使用虚拟后端来使用 HAProxy 执行此操作:

frontend web_front
  bind *:4100
  default_backend web_back

backend web_back
  cookie SERVERID insert indirect nocache
  balance roundrobin
  server server1 127.0.0.1:3001 cookie SRV_1
  server server2 127.0.0.1:3002 cookie SRV_2

listen lt_srv1
  bind 127.0.0.1:3001
  server host_1_web_1 129.168.0.1:3000 check
  server host_1_web_2 129.168.0.1:3001 check
  server host_1_web_3 129.168.0.1:3002 check

listen lt_srv2
  bind 127.0.0.1:3002
  server host_2_web_1 129.168.0.2:3000 check
  server host_2_web_2 129.168.0.2:3001 check
  server host_2_web_3 129.168.0.2:3002 check