我一直在快速扩展一项服务,但发现平衡负载的方式存在问题。我的服务器不需要完全均匀分布,因此我只是使用循环 DNS 设置将客户端引导至服务器。
然而,客户端不能在服务器之间弹跳,这一点非常重要,我发现许多在 Ubuntu 上运行其软件的客户端不会缓存他们收到的 DNS 结果,因此他们不断改变与之通信的服务器。
有没有办法强制 DNS 记录坚持下去,还是我必须开始考虑软件或硬件负载平衡器?我担心的是负载平衡器的延迟。如果 LB 在美国,而客户端被定向到英国,我的理解是客户端在重定向到英国之前必须始终连接到美国负载平衡器。
答案1
不幸的是,没有办法强制 DNS 记录与特定用户绑定。负载平衡器可以跟踪用户的会话并始终将其发送到同一台服务器。但是,您似乎遇到了地理上分离的应用程序实例的问题。
在这种情况下,最好的选择是进行以下设置:
- 为您想要表示的每个地理区域设置一个子域,其中包含该区域服务器的 IP。us.yourdomain.com和uk.你的域名.com
- 有一个 Web 服务器处理www.您的域名.com记录,或用户通常输入的任何内容,使用地理查找系统(例如地理IP)将用户重定向到适当的子域。
使用这种架构,美国用户的初始 HTTP 请求将如下所示:
- 用户请求www.您的域名.com。
- 服务器处理www.您的域名.com查找用户的地理区域。
- 服务器确定用户位于美国。
- 服务器将用户重定向至us.yourdomain.com。
- 用户的浏览器接受重定向,所有后续请求都会转到us.yourdomain.com。
此设置总共需要至少 3 台服务器。一台处理美国请求,一台处理英国请求,一台负责将用户重定向到美国/英国网站。
答案2
粘性会话糟透了!
虽然将用户发送到不同的机器可能会很不方便,但使用 RRDns 的主要原因之一是可用性。如果您需要让用户使用同一台服务器,那么您将失去这些好处。
当然,优先将用户推送到附近的服务器可以带来良好的性能优势 - 大多数大型 DNS 提供商现在都提供地理感知 DNS 查找(无需花费完整的内容交付网络)。如果您有勇气自己做名称服务,那么您可以配置 bind 来为您做这件事。请注意,使用普通 RRDNS,主机由名称服务器以随机顺序提供 - 完全可以有一个故障转移配置,其中“本地”服务器始终以相同的顺序呈现给相同的客户端,并且故障转移列表始终出现在最后。
很多情况下,什么是合适的取决于您工作的规模。如果您确信每个数据中心都具有良好的可用性,那么在每个数据中心使用本地负载平衡器可能是最佳选择(查看 HA-Proxy 和 Varnish)。