0

目前我们对四个 Web 服务器使用 DNS 轮询。

我们遇到的问题是:当用户刷新时,他可能会去其他的web服务器。当用户已经登录时,这感觉很糟糕。因为我们使用会话来记住登录状态,但是当刷新到其他 Web 服务器时,会话丢失了。

所以最好的解决方案应该是让用户在刷新时仍然在同一个 Web 服务器上。有出路吗?

4

6 回答 6

2

好的,我相信您的意思是“Round Robin DNS”。好吧,您所描述的是一个非常常见的问题,并且没有“正确”的解决方案,因为可能的答案取决于许多变量:您是要提供自动故障转移还是仅提供负载平衡?您愿意在负载均衡器上花费时间和/或金钱吗?您正在使用哪些技术?Java EE?php?阿帕奇?IIS?

话虽如此,如果您刚刚完成负载平衡并且故障转移不是什么大问题,您可能希望为每个服务器使用不同的名称(www1、www2、www3 等)并从“主”网络重定向到它们首次访问时的服务器 (www)。它很简单(也很简单),但在一些设置中很实用。

于 2009-05-09T23:39:35.677 回答
1

你有很多选择。

  • 你可以将会话存储在一个key:value存储中,fe memcached(我个人最喜欢的)
  • 您可以将会话存储在数据库中
  • 您可以将反向代理负载均衡器(如 DNS)和您的服务器放在后面。然后将其设置为使来自相同 IP 的所有请求都发送到相同的服务器,而不管它们通过哪个负载均衡器。在 HAProxy 中,此选项称为balance source. 注意:如果节点数量发生变化,会话可能会丢失。您可以使用cookieorurl_param功能来避免这种情况。

请参阅HAProxy 文档。值得一读,真的。

于 2009-05-10T00:10:01.513 回答
1

我知道某些基于硬件的负载平衡器会在用户和服务器之间创建“粘性”关系以避免此类问题。

于 2009-05-09T23:11:27.333 回答
1

Web 服务器可以使用通用数据库服务器来存储会话信息吗?

于 2009-05-09T22:40:32.853 回答
0

可以根据客户端位置响应的 DNS 服务器可以解决此问题。带有 geoip 模块或 GeoIPdns 的 PowerDNS 就是一些例子。您需要确保 IP 地址集不重叠,以便客户端始终得到相同的响应。

这本身不会提供任何类型的故障转移。

于 2009-05-10T00:03:22.513 回答
0

四个 Web 服务器是否都在同一个站点和网络上,或者它们是分布式的?

如果是前者,您可以在 HTTP 响应中的某处包含服务器 ID,以便真实服务器前面的反向代理可以识别哪个服务器负责会话。

于 2009-05-09T22:46:36.160 回答