haproxy:如何准备服务器维护而不踢应用程序会话?

问题

我正在使用haproxy来负载均衡Web服务器。 我使用会话持久性与其他cookie作为一些应用程序使用会话文件,这些服务器之间不同步。

我想要禁用服务器进行维护,但不会中断会话。 所以我想让现有的客户端继续他们的应用程序会话,但不接受新的客户端。

haproxy的行为

  • 我将服务器设置为“正在维护”
  • 如果客户端设置了cookie,即使标记为“正在维护”
  • 如果一个新的客户端(没有cookie)来,它被引导到另一个服务器
  • 毕竟所有的客户端都结束了他们的应用程序会话,没有更多的客户端将cookie设置到这个特定的服务器上,我会很好地closures它,而不会中断用户。

你认为这是可以实现一些haproxyconfiguration? 还是有一个聪明的方法来做到这一点?

其他方法

非穷举的其他方法来实现这一需求:

  • 在服务器之间同步会话文件(需要一种在多个服务器之间同步文件的方法,或者一个普通的单个安装点)
  • 使用数据库来存储会话信息(需要改变应用程序行为)

更多细节

我使用这种configuration:

frontend https-in bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl reqadd X-Forwarded-Proto:\ https acl APP1 hdr(host) -i APP1.atac.local use_backend APP1 if APP1 default_backend _default backend APP1 redirect scheme https if !{ ssl_fc } mode http balance roundrobin cookie HAPROXY_SESSION insert indirect option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy server SRV1 SRV1_IP:PORT cookie SRV1 check server SRV2 SRV2_IP:PORT cookie SRV2 check 

如果我只是禁用SRV1(使用haproxy cli命令),我认为所有在SRV1上打开的应用程序会话将在当前HTTP“会话”结束后中断。 是对的吗?

使用Webpipe理界面将服务器置于耗尽模式。 这提供了你正在寻找的确切function。

如果您使用socat与haproxyconfiguration进行通信,则可以将服务器置于以下方式的耗尽状态:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

更多命令在这里 ! 为Ubuntu安装socat去这个答案

我用haproxy 1.6.3版本testing:)

其他方法

在服务器之间同步会话文件(需要一种在多个服务器之间同步文件的方法,或者一个普通的单个安装点)

如果您的后端服务器使用PHP作为应用程序,您可以使用Memcache来同步它们之间的会话。

此外, Couchbase-Server可以开箱即用地执行memcache复制。
当然这是一个矫枉过正的使用couchbase服务器仅用于会话复制:)