一个域名如何路由到不断变化的服务器池?

一个域名如何路由到不断变化的服务器池?

我确信这是一个简单的解决方案,只是我不太熟悉 DNS 的工作原理,或者它是否与这个问题有关。

如果我在 amazon ec2 上运行分布在多个实例上的 Web 服务,我该如何实现使用单个域名访问整个服务器池(该服务器池会不时发生变化)?

由于实例可能前一秒还存在,后一秒就消失了(反之亦然),我需要一种方法来随机挑选一个集群中的活跃成员进行路由。更新必须是即时的。这有可能吗,有 DNS 缓存等吗?

答案1

有几种方法可以解决此问题,其中一些是您可以实现的。

对于您的情况,我建议只使用多个 DNS 记录,并设置相对较短的 TTL。这种分布方式并不理想,客户端可能不会选择延迟最低的节点。不过,这非常简单:您需要做的就是能够添加 DNS 记录。这是一种广泛使用和测试过的技术。

如果您需要从池中移除服务器,只需移除其 DNS 记录,大多数客户端将在 TTL 到期后停止使用它。新服务器也是如此:添加它们,在 TTL 到期后,客户端将开始使用它们。

例如,谷歌就将此作为其平衡技术的一部分:

$ dig A google.com

;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             297     IN      A       74.125.77.99
google.com.             297     IN      A       74.125.77.104
google.com.             297     IN      A       74.125.77.147

谷歌对此进行了扩展,一旦您进入他们的网站,就会根据他们猜测您所在的国家/地区,将您重定向到离您较近(并使用您的语言)的版本。但这是您通常不需要的级别。

答案2

更新必须是即时的。使用 DNS 缓存等功能,这可能吗?

不可以,DNS 无法实现这一点。DNS 记录带有生存时间 (TTL),它指定了缓存可以使用记录的时间量没有重新检查权威 DNS 服务器。出于各种原因,DNS TTL 不能少于 10 分钟。DNS 轮询是不是负载平衡的解决方案,至少在您需要服务正常运行时间的情况下不是。请参阅 fx 此Jeff Atwood 的旧问题

使用将 DNS 循环与主动监控相结合的第三方 DNS 服务服务器,并自动从 DNS 中删除死服务器。这不是一个好的解决方案,但对于不太重要的网站来说已经足够了,而且使用 fx DNSMadeEasy 或 EdgeDirector 进行设置很简单。

处理 Web 服务器可用性的行业标准方法是第 4 层或第 7 层负载均衡器在网络服务器前面。

亚马逊 EC2 上的 Web 服务分布在许多实例中,如何才能使用单个域名访问整个服务器池

亚马逊为此提供了即插即用服务,名为亚马逊弹性负载平衡。基本上,它是来自亚马逊的托管服务,它在您的 EC2 Web 服务器前面设置第 7 层(HTTP)或第 4 层(TCP)负载均衡器。

另一个常见选项是使用 L7 负载均衡器(如 nginx、HAProxy、Apsis Pound、Apache 2.2、Zeus Load Balancer 或其他东西)设置 EC2 实例(有几种)。但是,如果您采用这种方式,您将需要自己管理操作系统 + 负载均衡软件,并考虑如何使 EC2 负载均衡器实例本身具有足够的高可用性。

相关内容