通过TTL加权圆知更鸟 – 可能吗?

我目前使用DNS循环进行负载平衡,这很好。 logging看起来像这样(我有一个120秒的TTL)

;; 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 

我了解到,并不是每个ISP /设备都以同样的方式处理这样的响应。 例如,一些DNS服务器随机轮换地址,或者始终循环地址。 有些只是传播第一个条目,另一些则通过查看IP地址来确定哪个是最好的(区域性的)。

但是,如果用户群足够大(分布在多个ISP等),则平衡得相当好。 从最高到最低的服务器差异几乎没有超过15%。

但是现在我遇到了一个问题,即我正在向系统中引入更多的服务器,并不是所有的服务器都具有相同的function。

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

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

我之前添加了两次服务器,为他们带来了更多的stream量(这很好,带宽几乎翻了一番)。 但是,向DNS添加一个10Gbps的服务器100次是有点荒谬的。

所以我想到了使用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... 

正如你所看到的,这个预测很复杂,在实践中肯定不会这样。 但是,它肯定会对分配产生影响!

我知道加权循环存在,只是由根服务器控制。 它只是在响应时循环DNSlogging,并以对应于权重的设定概率返回DNSlogging。 我的DNS服务器不支持这个,我的要求不是那么精确。 如果它的重量不是很好,但它应该进入正确的方向。

我认为使用TTL字段可能是一个更优雅和更简单的解决scheme – 它不需要一个dynamic控制它的DNS服务器,这节省了资源 – 这在我看来是DNS负载平衡与硬件负载平衡器的关键。

我现在的问题是:是否有任何最佳做法/方法/经验法则来使用DNSlogging的TTL属性加权循环分配?

编辑:

该系统是一个转发代理服务器系统。 带宽量(不是请求)超过了以太网单个服务器可以处理的数量。 所以我需要一个平衡解决scheme,将带宽分配给多个服务器。 有没有其他的方法比使用DNS? 当然,我可以使用光纤通道等负载均衡器,但成本是可笑的,它也只增加了瓶颈的宽度,并没有消除。 我能想到的唯一的东西是任播(是任播还是多播?)IP地址,但是我没有办法build立这样一个系统。

首先,我完全同意@Alnitak说DNS不是为这种事情devise的,最好的做法是不要使用DNS作为穷人的负载均衡器。

我现在的问题是…是否有任何最好的预测/方法/经验法则来使用DNSlogging的TTL属性加权循环分配?

为了回答这个问题的前提,使用DNS进行basix加权循环的方法是:

  • 调整权威DNS响应中logging的相对出现次数 。 也就是说,如果Server A的stream量为1/3,而Server B的stream量为2/3,则对DNS代理的权威DNS响应的1/3将包含A的IP,并且只有2/3的响应只有B '啜。 (如果两个或更多的服务器共享相同的“权重”,那么他们可以被捆绑成一个响应。)
  • 保持较低的DNS TTL,使不平衡负载相对较快平衡。 由于下游DNS代理的客户端数量非常不均衡,因此您需要经常重新刷洗logging。

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

带宽(不是请求)的数量超过了以太网可以处理的单个服务器的数量。 所以我需要一个平衡解决scheme,将带宽分配给多个服务器。

对。 所以,据我了解,你有某种'便宜的'下载/video分配/大文件下载服务,总服务比特率超过1 GBit。

不知道服务和服务器布局的确切细节,很难做到准确。 但是在这种情况下一个常见的解决scheme是

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

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

我现在的问题是…是否有任何最好的预测/方法/经验法则来使用DNSlogging的TTL属性加权循环分配?

是的,最好的做法是不要这样做

请在我之后重复

  • DNS不用于负载平衡
  • DNS不提供弹性
  • DNS不提供故障转移function

DNS用于将名称映射到一个或多个IP地址 。 任何后续的平衡是通过运气,而不是devise。

看看PowerDNS 。 它允许你创build一个自定义的pipe道后端。 我修改了一个用Perl编写的负载平衡器DNS后端来使用Algorithm :: ConsistentHash :: Ketama模块。 这使我可以设置任意的权重,如下所示:

 my $ketamahe = Algorithm::ConsistentHash::Ketama->new(); # Configure servers and weights $ketamahe->add_bucket("192.168.1.2", 50); $ketamahe->add_bucket("192.168.1.25", 50); 

还有一个:

 # multi-colo hash my $ketamamc = Algorithm::ConsistentHash::Ketama->new(); # Configure servers and weights $ketamamc->add_bucket("192.168.1.2", 33); $ketamamc->add_bucket("192.168.1.25", 33); $ketamamc->add_bucket("192.168.2.2", 17); $ketamamc->add_bucket("192.168.2.2", 17); 

我从我所需的顶级域名添加了一个cname到一个我称之为gslb或全局服务器负载平衡的subdoman。 从那里,我调用这个自定义的DNS服务器,并根据我想要的权重发出Alogging。

像冠军一样工作。 当您添加服务器或调整权重时,ketama散列具有对现有configuration的干扰最小的好处。

我build议阅读Jan-Piet Mens的备用DNS服务器。 那里有很多好主意,还有示例代码。

我也build议放弃TTL调制。 你已经到了非常遥远的地步了,在上面添加另一个kludge会使故障排除和文档变得非常困难。

您可以使用PowerDNS进行加权循环,尽pipe以非均衡方式(100:1?)分配负载可能会变得非常有趣,至less使用我的解决scheme中使用的algorithm,其中每个RR条目具有与其相关的权重在1-100之间,随机值用于包含或排除logging。

以下是我在PowerDNS中使用MySQL后端进行加权RR DNS的一篇文章: http : //www.mccartney.ie/wordpress/2008/08/wrr-dns-with-powerdns/

RIPienaar还有一些基于Ruby的示例(使用PowerDNSpipe道后端): http : //code.google.com/p/ruby-pdns/wiki/RecipeWeightedRoundRobin

要处理这种设置,您需要查看一个真正的负载平衡解决scheme。 阅读Linux虚拟服务器和HAProxy 。 如果服务器出现故障并且更容易理解,则可以从服务器中自动删除服务器的额外好处。 加权只是一个需要调整的设置。