循环DNS实现负载平衡

循环DNS(Round-robin DNS)技术是负载平衡最常用的方法之一。最早的负载均衡技术是通过DNS服务中的随机名字解析来实现的。在DNS服务器中,可以为多个不同的地址配置同一个名字,这个数据被发送给其他名字服务器,而最终查询这个名字的客户机将在解析这个名字时随机使用其中一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址,因此不同的客户访问的也就是不同地址的Web服务器,从而达到负载均衡的目的。

  例如,如果希望使用三个Web服务器来回应对www.cqcc.com的HTTP请求,设它们的IP地址分别是:202.192.99.1,202.192.99.2,202.192.99.3。安装一个循环复用DNS软件,配置这个软件使得每次要求解析www.cqcc.com时返回所有三个IP地址。第一次解析结果中返回地址的次序与前面列出的相同,下一次请求则得到稍微不同的答案:202.192.99.2,202.192.99.3,202.192.99.1。再下一次则得到第三个答案:202.192.99.3,202.192.99.1,202.192.99.2。第一个客户将同202.192.99.1建立连接,因为202.192.99.1是它所看到的第一个IP地址。第二个客户看到的第一个IP地址是202.192.99.2,因此它将访问202.192.99.2。同样,第三个客户将访问202.192.99.3……

  针对上面例子,可以设置该域的DNS服务器中关于该域的数据至少包括与下面例子类似的结果:

  www1 IN A 202.192.99.1

  www2 IN A 202.192.99.2

  www3 IN A 202.192.99.3

  www IN CNAME www1

  www IN CNAME www2

  www IN CNAME www3

  这里先为每个计算机定义一个真实名字(www1、www2、www3),然后再为它们定义同一个别名。可以直接针对不同地址设置同一个真实名字(A记录),只是使用别名的方法易于管理一些。

  由于此时反向解析只能针对一台计算机,那么每个Web服务器都需要使用ServerName重新定义同一个

名字,或者设置名字解析的顺序为hosts文件优先,并在hosts文件中定义本身为www,以保证每个服务器的名字设置保持一致。

  循环DNS具有对客户机和服务器透明的优点。在事务处理开始时,它也只执行一次。但是,循环DNS常常不能成功,因为中间名服务器和客户机软件(包括应用很广的浏览器)常常将DNS返回的IP地址存储起来,或忽略存在时间(TTL)值。TTL是一位IP数据比特位,用来指示IP数据报在被丢弃前可以转发到其它路由器的时间长度。

  由于IP地址存储的原因,DNS服务器提供的负载平衡功能被绕过去了,客户机继续使用被存储起来的IP地址,而不去进行重新连接。这就产生了一个“热点”,在这个“热点”上,过度使用的服务器继续接收额外的接入。

  DNS负载均衡的另一个问题是一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用,而DNS服务器并不知道这一点,因此客户请求将被延迟,或返回一个“无法访问服务器”消息给用户,在此期间保存了故障服务器地址的客户计算机将不能正常访问服务器。

  由于DNS数据是具备一个刷新时间的标志的,一旦超过这个时间限制过期,其他DNS服务器就需要和这个服务器交谈以重新获得地址数据。如果刷新时间较短,不同地方的DNS服务器能更新对应的地址,使出现故障的服务器地址可以及时删除,用户仍旧可以被引导到正常的服务器上,但如果用户缓冲了故障服务器的IP地址,这种方法也不能解决问题。同时将过期时间设置的过低将使DNS流量大增,而造成额外的网络问题。

  由于循环DNS没有区分端口的能力,不能意识到服务器的可用性并且不能考虑服务器上的现有负载,无法对服务器负载进行动态地分析从而使得下一个请求总是由负载最小的服务器处理,因此循环复用DNS还有太多的限制,只能算是一种勉强可接受的负载平衡方案。

  尽管存在多种问题,然而它还是一种非常有效的做法,当前使用在包括Yahoo在内的很多Web站点上。

没有更多推荐了,返回首页