我正在使用haproxy来负载均衡Web服务器。 我使用会话持久性与其他cookie作为一些应用程序使用会话文件,这些服务器之间不同步。
我想要禁用服务器进行维护,但不会中断会话。 所以我想让现有的客户端继续他们的应用程序会话,但不接受新的客户端。
你认为这是可以实现一些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服务器仅用于会话复制:)