当后端发生故障时,Haproxy 粘性会话不会重定向到不同的服务器

当后端发生故障时,Haproxy 粘性会话不会重定向到不同的服务器

我的 haproxy LB 配置如下:

global
    daemon
    maxconn 2048

    # SSL
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private
    ssl-default-bind-ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;

defaults
    log global
    mode    http
    option forwardfor

# handle incoming requests to port 80 (http)
frontend www-http
    bind 1.2.3.4:80
    reqadd X-Forwarded-Proto:\ http
    default_backend www-backend

# handle incoming requests to port 443 (https)
frontend www-https
    bind 1.2.3.4:443 ssl crt /etc/ssl/private/example.com.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend www-backend

backend www-backend
   # always use https
   redirect scheme https if !{ ssl_fc }

   # RR algorithm for load balancing
   balance roundrobin
   option httpclose

   # tracke which backend served specific user
   cookie _rails_srv insert

   # sticky sessions
   appsession _rails_session len 64 timeout 24h
   server s1 4.5.6.7:80 check cookie s1
   server s2 7.8.9.0:80 check cookie s2

它与后端的 2 个 Rails 应用程序服务器绑定,并且我使用 Rails 提供的会话 cookie ( _rails_session) 来实现会话粘性。

它运行良好,直到其中一台服务器出现故障,然后与故障服务器保持现有会话并尝试访问该服务器的客户端会收到 500 服务器错误响应,而不是被重定向到另一个正常运行的后端。

我认为 Haproxy 在检测到故障时会自动将流量重定向到另一台服务器。我的配置是否出了问题?谢谢。

答案1

redispatch显然,您缺少该选项。

来自文档

option redispatch / no option redispatch:在连接失败的情况下启用或禁用会话重新分配

在 HTTP 模式下,如果 cookie 指定的服务器宕机了,客户端肯定会坚持使用该服务器,因为它们无法刷新 cookie,所以它们将无法再访问该服务。

指定“选项重新分派”将允许代理打破其持久性并将其重新分配到工作服务器。

相关内容