HAProxy是我们选用的世界一流的负载均衡器,每秒可处理250,000个连接及数万个请求。不仅功能强大,而且经事实证明,它仍然非常灵活,有强大的记录及监控系统还有很多其它特点。

但 是,同其它许多负载均衡器相同的是,HAproxy的主要特点也是:粘滞会话。这一功能很有用,甚至对于某些系统来说,是必须的,如某些系统的网络服务器 会话是不可移动的,即不可在网络服务器之间随机移动会话。许多PHP系统不使用此功能,因为它们使用Memcache来存储会话。但是基于Java的系统 通常采用此功能,因为很多数据是存在本地每台应用服务器的内存中。

因为各种需求不同,而很多人认为,粘滞是好的,所以,我们的系统默认设置就是粘滞会话。HAProxy使用cookie来追踪用户或浏览器最后使用的后台服务器,如果有新的需求,将自动转给同样的后台服务器进行处理。

虽然看起来这一系统功能工作简单,但是有时候是会遇到问题的,事实上,最近发生的一系列问题,使我们重新思考是否应该把粘滞会话设置为默认状态,是否对于某些服务,尤其是对于大型的繁忙系统,我们可以关闭这一功能吗?

尽管从理论上来说,一切应该不会出错,但是在系统高负载时的动态行为可能导致系统不稳定。我们见到过这样一个案例,当后台服务器已经超负荷的时候,负载均衡器仍然把需求调度到这一服务器,直至服务器瘫痪,而事实上,负载均衡器应该把用户需求调度到其他服务器上进行处理。

这 是因为cookie要求这样做,所以才发生此操作。尽管HAProxy有负载均衡分配方法即令牌循环分配法,但要弄清楚一点:这种方法只是在没有 cookie的情况下才会进行请求分配。当存在cookie的时候,会分配给同一台后台服务器,直至服务器瘫痪。然后,cookie和负载再转至下一台服 务器,导致下一台服务器超负载。

这会带来很多系统不稳定问题,当超负载时,负载会在系统间不断跳动。结果就是,对于每秒处理上千请求的繁忙系统来说,要想关闭它或排除其故障,真的是很困难的。

因此,关闭cookies或会话后,实际的令牌循环或其它有用的方案如最小连接数才能生效,可以对请求进行均衡处理。我们亲历过关闭这些cookie或会话后,系统稳定性提高了很多。

所以,现在只有当需要用到粘滞会话的时候,我们才用,如Java系统或其它系统。除了这些特殊情况之外,我们会让请求自由分配,以提高系统性能及稳定性。