我有一个将在多台服务器上运行的 Web 应用。我想确保使用相同会话(HTTP cookie 标头值为 JSESSIONID=x)的请求始终与同一台服务器通信。也就是说,直到会话在某些情况下“移动”到另一台服务器(不仅是当服务器发生故障时,还由于某些服务器端缓存和性能策略)。
我的 Web 应用程序可以很好地处理这种情况,但什么样的负载均衡器我应该使用什么?显然,我可以在应用程序级别进行负载平衡,但我正在寻找更高效的方法。也许是专用硬件(也许不是)?我不能花很多钱……
更新
感谢您迄今为止的回答:我现在发现,磅和HAProxy可以配置为查找某些 cookie。我目前还无法确定它们是否还允许动态更新映射(当会话“移动”到不同的应用服务器时)?
有没有(廉价的)硬件解决方案也可以做到这一点?(这比额外的负载平衡服务器成本更低吗?)
答案1
使用 ”粘性(持久)会话“通常不建议这样做。如果这样做,您将失去负载平衡的很多好处。负载将不平衡,您将失去高可用性,因为某些客户端在发生故障时将无法访问您的应用程序。
您希望会话是动态的。使用 Java,它通常存储在内存中并通过多播群集到所有服务器。更常见的是,会话将存储在数据库中。
如果您的 Web 应用程序需要粘性会话,则您的架构可能需要改进。
至于负载均衡器解决方案,市面上有很多,这里已经详细介绍了这个主题。我喜欢低压开关柜. 其他类似nginx。 Foundry Networks被 Brocade 收购的该公司生产了一些可靠的商业产品。它们是硬件负载平衡器的主要商业解决方案。 梭鱼还有基于Linux/OSS的“设备”,可用于负载平衡。
答案2
那么,为您提供几个解决方案。
编写一个使用数据库存储会话信息的会话存储方法,如果在多台服务器上,则可以集群数据库。这实际上取决于您决定如何组织事物,另一种想法是在 Web 服务器后面使用带有 memcache 的服务器并将会话存储在其中。
这样,您就可以在一个地方进行会话,客户端被定向到哪个 Web 服务器不再重要。
答案3
答案4
POUND - 反向代理和负载均衡器
Pound 程序是 Web 服务器的反向代理、负载平衡器和 HTTPS 前端。Pound 的开发目的是能够在多个 Web 服务器之间分配负载,并为那些本身不提供 SSL 包装器的 Web 服务器提供方便的 SSL 包装器。Pound 是在 GPL 下分发的 - 没有任何保证,可以免费使用、复制和赠送。
这可能是你正在寻找的