haproxy:如何在不启动应用程序会话的情况下准备服务器维护?


13

问题

我正在使用haproxy来平衡Web服务器的负载。我将会话持久性与其他cookie一起使用,因为某些应用程序使用会话文件,并且这些文件在服务器之间不同步。

我想禁用服务器进行维护,但不要中断会话。因此,我想允许现有客户端继续其应用程序会话,但不接受新客户端。

代理行为

  • 我将服务器设置为“要维护”
  • 如果客户端设置了cookie,则即使标记为“进入维护”也要使用服务器
  • 如果有新客户端(没有cookie),则将其定向到另一台服务器
  • 在所有客户端结束他们的应用程序会话后,不再有客户端将cookie设置到该特定服务器上了,我最好在不中断用户的情况下将其关闭。

您是否认为通过某些haproxy配置可以实现?还是有一个聪明的方法吗?

其他方法

实现此需求的其他方法的非详尽清单:

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

更多细节

我使用这种配置:

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命令),则我认为在当前HTTP“会话”结束后,在SRV1上打开的所有应用程序会话都会中断。那正确吗?


您的服务器运行在HTTP模式还是TCP模式?
奥斯丁2015年

1
@奥斯汀; 可能是http模式,就像他在谈论基于cookie的平衡和持久性一样(TCP模式不提供此类功能)。
GregL

@Christophe,您是否实际尝试过“异常行为”部分中描述的配置,因为它可以工作。
GregL

@GregL,对,那也是我的想法。如果他使用的是HTTP模式,并且只是将服务器设置为维护模式,则它将停止接受新会话,但将有效会话保持活动状态,直到它们到期为止。您仍然可以在TCP模式下使用cookie等,但这对HAProxy毫无意义。
奥斯丁2015年

@Christophe,您是要使用“更聪明的方法”来缩短维护时间,还是只是在等待维护时寻找一种使会话正常结束的方法?
奥斯丁2015年

Answers:


6

使用Web管理界面将服务器置于耗尽模式。这提供了您正在寻找的确切功能。


3
如果你把它设置为MAINT,它会停止发送任何流量到它,概述这里。相反,他想将其置于Drain模式,并使用stick-table带有到期的a来提供持久性。
GregL 2015年

@GregL,哎呀,现在解决
奥斯丁2015年

感谢您的回答,奥斯丁和@GredL。我会尝试的。我认为最困难的部分将是在桌子上。我将必须找到一种方法,将设置了cookie的每个客户端存储到此粘滞表中的排出模式服务器。
Christophe Drevet-Droguet 2015年

好吧,在我的情况下,消耗模式似乎足够了,已经设置了cookie的会话仍然使用消耗的服务器,而新的会话将定向到其他服务器。
Christophe Drevet-Droguet 2015年

1
您如何在Web界面中更改模式?它看起来只是提供信息。
kagronick

9

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

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

更多命令在这里!要在Ubuntu中安装socat,请转到此答案

我使用haproxy 1.6.3版本进行测试:)


1

其他方法

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

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

另外,Couchbase-Server可以开箱即用地进行Memcache复制。
当然,仅将长沙发服务器用于会话复制是一种矫:过正的方法:)


我认为,虽然这将是一种更好的方法,但需要更改代码。因此,对于我们当前不同步会话的应用程序,我将使用austinian和GregL回答。
Christophe Drevet-Droguet

如果您的代码未设置自定义会话处理程序,则无需为PHP更改任何代码即可将memcache用于会话。所有这些都在php.ini中配置,而不是在代码中配置。
Cha0s

好吧,Cha0s,我来看一下。
Christophe Drevet-Droguet,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.