我目前使用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加权循环的方法是:
Server A的stream量为1/3,而Server B的stream量为2/3,则对DNS代理的权威DNS响应的1/3将仅包含A的IP,并且只有2/3的响应只有B '啜。 (如果两个或更多的服务器共享相同的“权重”,那么他们可以被捆绑成一个响应。) 亚马逊的Route 53 DNS服务使用这种方法 。
带宽(不是请求)的数量超过了以太网可以处理的单个服务器的数量。 所以我需要一个平衡解决scheme,将带宽分配给多个服务器。
对。 所以,据我了解,你有某种'便宜的'下载/video分配/大文件下载服务,总服务比特率超过1 GBit。
不知道服务和服务器布局的确切细节,很难做到准确。 但是在这种情况下一个常见的解决scheme是
这种设置可以使用开源软件或许多供应商的专用设备构build。 这里的负载平衡标签是一个很好的起点,或者你可以聘请以前做过这个的系统pipe理员来为你咨询…
我现在的问题是…是否有任何最好的预测/方法/经验法则来使用DNSlogging的TTL属性加权循环分配?
是的,最好的做法是不要这样做 !
请在我之后重复
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 。 如果服务器出现故障并且更容易理解,则可以从服务器中自动删除服务器的额外好处。 加权只是一个需要调整的设置。