假设某网站 ,如 www.a.com, 上海有服务器一台,给的IP是1.1.1.1 ,北京有一台,给的是2.2.2.2 处于不同IDC,要求实现上海的用户访问在上海的服务器, 而北京的用户访问到北京的服务器.
角色1 Client 上海电信用户5.5.5.10
角色2 Client的DNS服务器 5.5.5.1 根据Client的网络接入的方式不同,DNS服务器的IP地址是
不一样的
角色3 a.com的soa dns,ip 3.3.3.3 由com. 授权,
角色4 www.a.com的2台服务器, 上海的IP1.1.1.1 北京的2.2.2.2
角色5 上海的DNS服务器 1.1.1.10
角色6 北京的DNS服务器 2.2.2.10
在确定好所有的角色后,我们来看看这个工作过程以及解决方案
DNS解析分为递归与跌代.
假定上海电信dns 是递归查询, 通过一个图我们来说明智能解析过程. (请把该图放大再看比较清楚)
因为递归查询,那么情况比较复杂,因为 最终访问到a.com dns 服务器的是上海电信dns服务器, 是Client DNS. 这样只能判定Client DNS比较距离 上海或者北京比较近,而无法断定Client
是距离那里比较近。
不过,由于网络接入的方式不一样,例如 网通的ADSL方式,其IP、DNS地址均由动态获取,这样此时 Client DNS服务器与Client应该是属于相同运营商IP,这样就能够通过判定Client DNS地址来大约断定Client所属运营商所处地区,从而给予Client一个正确的IP地址解析。
但是假如某上海用户手工指定DNS,恰好又指定了一个北京的递归查询DNS服务器,这个时候,就比较麻烦了,因为没有办法得知Client的实际位置。
考虑此时是递归查询,所知Client DNS的IP地址为北京IP,则a.com会解析北京服务器地址给该 Client DNS,那么Client作为上海用户最终得到的IP将是 www.a.com = 2.2.2.2 (该地址为北京地址) ,这样就会导致此用户得到错误的服务器地址。
不过,好运的是,现在的大多数DNS服务器都是迭代查询,因为没有多少DNS服务器可以承受递归的流量,所以对于99%的用户来说,都能得到正确的地址解析,从而正确的访问服务器。
那么迭代查询的情况又会如何呢?则最终向a.com询问谁是 www.a.com的 ,将是Client.
这样,a.com的DNS服务器将得到Client 的IP,再根据Client IP地址距离那里比较近,就可以决定返回 www.a.com 的IP 1.1.1.1 还是 2.2.2.2; 但是这种工作模式的问题是必须选择一个好的算法。为什么呢?
应为需要考虑到中国网络的实际情况,南北电信分拆后,telecom与cnc之间的互相访问非常慢, 例如 某上海网通用户访问位于上海电信的 www.a.com.,其速度可能还不如去访问位于北京网通的 www.a.com.
关于如何解决这个问题,我已经再另外一个精华贴中有所解答,请大家参考在本论坛web子论坛中发表的文章
http://bbs.chinaunix.net/viewthread.php?tid=711346&extra=page%3D2
另外也可以使用静态算法,通过收集Client IP是属于某个地区的(上海还是北京),就可以决定返回某个IP地址,不过需要收集所有IP所处实际地区;目前网上已经有很多查询ip地址是属于某个地区的技术,看来这种方法还是有可能实现的。
目前手工配置DNS服务器来实现以上目的,好象没有什么现成的程序能做到,需要自己开发一些相关工作流程脚本程序,以及收集电信、网通IP地址段,所处地区等,工作内容比较复杂。
好消息是,现在已经有相关的商业产品能够做到这一点。 如果网站的级别已经到达需要做CDN的话,我想boss考虑问题时,钱应该不是首要问题了吧?