通过 TTL 加权循环 - 可能吗?

The*_*can 11 networking domain-name-system load-balancing ttl round-robin

我目前使用 DNS 循环进行负载平衡,效果很好。记录看起来像这样(我的 TTL 为 120 秒)

;; ANSWER SECTION:
orion.2x.to.        116 IN  A   80.237.201.41
orion.2x.to.        116 IN  A   87.230.54.12
orion.2x.to.        116 IN  A   87.230.100.10
orion.2x.to.        116 IN  A   87.230.51.65
Run Code Online (Sandbox Code Playgroud)

我了解到并非每个 ISP/设备都以相同的方式处理此类响应。例如,一些 DNS 服务器随机地轮换地址或总是循环它们。一些只是传播第一个条目,其他人尝试通过查看 IP 地址来确定哪个是最好的(区域附近)。

但是,如果用户群足够大(分布在多个 ISP 上,等等),它的平衡就会很好。从最高负载到最低负载的服务器的差异几乎都超过 15%。

但是,现在我遇到的问题是,我正在向系统中引入更多服务器,而且并非所有服务器都具有相同的容量。

我目前只有 1 Gbps 服务器,但我也想使用 100 Mbps 和 10 Gbps 服务器。

所以我想要的是我想引入一个权重为100的10 Gbps服务器,一个权重为10的1 Gbps服务器和一个权重为1的100 Mbps服务器。

我之前添加了两次服务器来为它们带来更多流量(效果很好——带宽几乎翻了一番)。但是向 DNS 添加 100 次 10 Gbps 服务器有点荒谬。

所以我考虑使用TTL。

如果我给服务器 A 240 秒的 TTL 和服务器 B 仅 120 秒(这大约是循环使用的最小值,因为如果指定了较低的 TTL,许多 DNS 服务器设置为 120(所以我听说过))。我认为在理想情况下应该会发生这样的事情:

First 120 seconds
50% of requests get server A -> keep it for 240 seconds.
50% of requests get server B -> keep it for 120 seconds

Second 120 seconds
50% of requests still  have server A cached -> keep it for another 120 seconds.
25% of requests get server A -> keep it for 240 seconds
25% of requests get server B -> keep it for 120 seconds

Third 120 seconds
25% will get server A (from the 50% of Server A that now expired) -> cache 240 sec
25% will get server B  (from the 50% of Server A  that now expired) -> cache 120 sec
25% will have server A cached for another 120 seconds
12.5% will get server B (from the 25% of server B that now expired) -> cache 120sec
12.5% will get server A (from the 25% of server B that now expired) -> cache 240 sec

Fourth 120 seconds
25% will have server A cached -> cache for another 120 secs
12.5% will get server A (from the 25% of b that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of b that now expired) -> cache 120 secs
12.5% will get server A (from the 25% of a that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of a that now expired) -> cache 120 secs
6.25% will get server A (from the 12.5% of b that now expired) -> cache 240 secs
6.25% will get server B (from the 12.5% of b that now expired) -> cache 120 secs
12.5% will have server A cached -> cache another 120 secs
... I think I lost something at this point, but I think you get the idea...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,预测变得非常复杂,并且在实践中肯定不会像这样。但它肯定会对分布产生影响!

我知道存在加权循环,并且仅由根服务器控制。它只是在响应时循环浏览 DNS 记录,并以与权重相对应的设定概率返回 DNS 记录。我的 DNS 服务器不支持这个,我的要求也不是那么精确。如果它的重量不完美,那没关系,但它应该朝着正确的方向发展。

我认为使用 TTL 字段可能是一个更优雅、更简单的解决方案——它不需要一个动态控制它的 DNS 服务器,从而节省资源——在我看来,这是 DNS 负载平衡与硬件负载平衡器的重点。

我现在的问题是:是否有任何最佳实践/方法/经验法则可以使用 DNS 记录的 TTL 属性来加权循环分配?

编辑:

该系统为正向代理服务器系统。带宽(不是请求)的数量超过了一台带有以太网的服务器可以处理的数量。所以我需要一个平衡解决方案,将带宽分配给多台服务器。除了使用 DNS 之外,还有其他方法吗?当然,我可以使用带有光纤通道等的负载均衡器,但成本高得离谱,而且它也只会增加瓶颈的宽度并没有消除它。我唯一能想到的是任播(是任播还是多播?)IP 地址,但我没有办法设置这样的系统。

小智 5

首先,我完全同意@Alnitak 的观点,即 DNS 不是为此类事情而设计的,最佳实践是不要(滥用)使用 DNS 作为穷人的负载平衡器。

我现在的问题是...是否有任何最佳实践/方法/经验法则来使用 DNS 记录的 TTL 属性来加权循环分配?

在回答问题的前提下,使用 DNS 执行 basix 加权循环的方法是:

  • 调整权威 DNS 响应中记录的相对出现次数。即,如果Server A要拥有 1/3 的流量并且Server B要拥有 2/3,则对 DNS 代理的权威 DNS 响应的 1/3 将 A包含的 IP,而响应的 2/3 将仅包含B的 IP。(如果 2 个或更多服务器共享相同的“权重”,那么它们可以捆绑到一个响应中。)
  • 保持较低的 DNS TTL,以便相对较快地平衡不平衡负载。由于下游 DNS 代理背后的客户端数量非常不均匀,因此您需要经常重新洗牌记录。

亚马逊的Route 53 DNS服务就使用这种方法

带宽量(不是请求)超过了一台具有以太网的服务器可以处理的量。因此,我需要一个平衡解决方案,将带宽分配给多台服务器。

正确的。据我了解,您拥有某种“廉价”下载/视频分发/大文件下载服务,其中总服务比特率超过 1 GBit。

如果不知道您的服务和服务器布局的具体细节,就很难做到精确。但这种情况下的常见解决方案是:

  • DNS 循环到两个或多个 TCP/IP 或 HTTP 级别负载均衡器实例。
  • 每个负载均衡器实例都具有高可用性(2 个相同的负载均衡器协作保持一个 IP 地址始终开启)。
  • 每个负载均衡器实例使用加权循环或加权随机连接处理到后端服务器。

这种设置可以使用开源软件或许多供应商的专用设备来构建。这里的负载平衡标签是一个很好的起点,或者您可以聘请以前做过此操作的系统管理员来为您提供咨询...