目前我们对四个 Web 服务器使用 DNS 轮询。
我们遇到的问题是:当用户刷新时,他可能会去其他的web服务器。当用户已经登录时,这感觉很糟糕。因为我们使用会话来记住登录状态,但是当刷新到其他 Web 服务器时,会话丢失了。
所以最好的解决方案应该是让用户在刷新时仍然在同一个 Web 服务器上。有出路吗?
好的,我相信您的意思是“Round Robin DNS”。好吧,您所描述的是一个非常常见的问题,并且没有“正确”的解决方案,因为可能的答案取决于许多变量:您是要提供自动故障转移还是仅提供负载平衡?您愿意在负载均衡器上花费时间和/或金钱吗?您正在使用哪些技术?Java EE?php?阿帕奇?IIS?
话虽如此,如果您刚刚完成负载平衡并且故障转移不是什么大问题,您可能希望为每个服务器使用不同的名称(www1、www2、www3 等)并从“主”网络重定向到它们首次访问时的服务器 (www)。它很简单(也很简单),但在一些设置中很实用。
你有很多选择。
balance source
. 注意:如果节点数量发生变化,会话可能会丢失。您可以使用cookie
orurl_param
功能来避免这种情况。请参阅HAProxy 文档。值得一读,真的。
我知道某些基于硬件的负载平衡器会在用户和服务器之间创建“粘性”关系以避免此类问题。
Web 服务器可以使用通用数据库服务器来存储会话信息吗?
可以根据客户端位置响应的 DNS 服务器可以解决此问题。带有 geoip 模块或 GeoIPdns 的 PowerDNS 就是一些例子。您需要确保 IP 地址集不重叠,以便客户端始终得到相同的响应。
这本身不会提供任何类型的故障转移。
四个 Web 服务器是否都在同一个站点和网络上,或者它们是分布式的?
如果是前者,您可以在 HTTP 响应中的某处包含服务器 ID,以便真实服务器前面的反向代理可以识别哪个服务器负责会话。