为什么在地址栏输入域名可以直接访问到对应的服务器?什么是全局负载均衡和内部负载均衡?这些都与DNS解析息息相关,让我们一起解密DNS解析。其实说到DNS解析,大家应该都知道,它很像一个通讯录。就像我们去一家新开的沃尔玛超市,通过通讯录找到沃尔玛在哪条路和号码,然后去寻找。在网络世界中,同样如此。我们可以记住网站的名称,但是很难记住网站的IP地址,所以我们需要一本“通讯录”来帮助我们将网站名称转换成IP。这个“地址簿”就是DNS服务器。DNS服务器???????????????????????????????????????????????或者说世界上每个人在上网时都需要访问的DNS服务器。据最新统计,全球互联网用户数量已达40亿,人人上网。可想而知DNS服务器访问流量压力会很大(高并发)。而且,很重要的一点,一旦出现问题,整个互联网就会瘫痪(高可用)。此外,上网的人分布在世界各地。如果每个人都去同一个地方的某个服务器,延迟会很(分布式)。所以DNS服务器必须具备高可用、高并发、分布式的特点。基于此,将DNS服务器设计成树状的层次结构。如下图所示:根DNS服务器:返回顶级域DNS服务器的IP地址;顶级域DNS服务器:返回权威DNS服务器的IP地址;权威DNS服务器:返回对应主机的IP地址。DNS解析过程上文提到,DNS服务器承受着大流量访问的压力。因此,为了提高DNS解析性能,很多网站都会就近部署DNS缓存服务器。因此,我们常见的DNS解析过程就变成了:客户端向本地域名服务器发送DNS请求。当我们访问博客园时,客户端会询问本地域名服务器,www.cnblogs.com的IP是多少?(本地域名服务器,如果网络是通过DHCP配置的,本地DNS是你的网络服务商自动分配的,比如中国电信,中国联通等,一般在网络服务商的机房);本地DNS收到客户端请求,查找“通讯录”,返回IP或请求根域名服务器。我们可以理解为服务器缓存了一张域名和IP对应的大表。如果能找到www.cnblogs.com,则直接返回对应的IP地址。如果没有找到,本地DNS会询问其根域名服务器;根DNS收到本地DNS的请求,返回.com对应的顶级域名服务器地址。根域名服务器是最高级别的,全球共有13台。它不直接用于域名解析,而是表示如何找到对应的IP。当发现请求的域名后缀为.com时,返回.com对应的顶级域名服务器地址;本地DNS服务器接收顶级DNS服务器地址,请求顶级DNS服务器查询域名IP;顶级DNS服务器返回权威DNS服务器的地址。顶级域名服务器是众所周知的,负责.com、.net、.org等二级域名,比如cnblogs.com,会返回对应的权威DNS服务器地址;本地DNS服务器收到权威DNS服务器的地址,请求权威DNS服务器查询域名IP。cnblogs.com权威DNS服务器,是域名解析结果的原始来源;权威DNS服务器返回对应的IP。权威DNS服务器查询“通讯录”,获取域名对应的IP地址,返回给本地DNS服务器;本地DNS服务器收到IP返回给客户端;客户端与目标建立连接。至此,我们完成了DNS解析过程。整个过程如下图所示:负载均衡?从客户端的角度来看,上述过程是一个DNS递归查询过程。因为本地DNS会为它做所有的事情,所以它只是坐等结果。在这个过程中,DNS除了将名字映射到IP地址之外,还可以做另外一件很重要的事情——负载均衡。让我们以参观沃尔玛为例。它可能在一个城市有多家商店。如果我们想去沃尔玛,我们可以在附近找一家,而不是去同一家。这就是负载均衡。DNS负载均衡也是有技巧的。1)DNS做内部负载均衡所谓内部负载均衡其实很好理解。就像我们的应用程序访问数据库一样,在应用程序中配置的数据库地址。如果配置为IP地址,一旦数据库切换到另一台机器上,我们就需要修改配置。如果我们有多个应用程序同时连接到一个数据库,我们需要在更改IP后修改这些应用程序的所有配置。是不是很麻烦?因此,我们可以将数据地址配置为域名。更改数据库位置时,只需将域名映射到DNS服务器中的新IP地址即可。在此基础上,我们可以更进一步。比如一个应用要访问另一个应用,如果配置了另一个应用的IP地址,那么这个访问就是一对一的。但是,当接入的应用因为流量过大而无法支撑时,我们就需要部署多个应用。这时候我们不能直接配置IP,而是配置域名。只要在域名解析的时候配置策略,这次返回一个IP,下次返回第二个IP,就实现了负载均衡。2)DNS做全局负载均衡为了保证我们应用的高可用,应用往往部署在多个机房,每个地方都会有自己的IP地址。当用户访问一个域名时,该IP地址可以轮询多个数据中心。如果某个数据中心由于某种原因宕机,只需将DNS服务器的IP地址删除,用户将无法访问宕机的服务器,保证了应用的可用性。此外,我们绝对希望用户能够访问最近的数据中心。这样客户访问速度会快很多,体验会好很多,实现全局负载均衡的概念。负载均衡示例下面以NDS访问数据中心对象存储上的静态资源为例,看一下整个过程。假设全国有多个数据中心,由多个运营商托管,每个数据中心有3个可用区。对象存储可以跨可用性区域部署,以实现高可用性。每个数据中心至少部署两个内部负载均衡器,内部负载均衡器连接多个对象存储前端服务器(Proxy-server)。然后,请求过程如下:当客户端要访问object.yourcompany.com时,需要将域名转换成IP地址进行访问,因此需要请求本地的DNS解析器;本地DNS解析器首先检查本地缓存是否有这条记录。有则直接使用,省略后续查询步骤,提高响应时间;如果没有本地缓存??,则需要请求本地DNS服务器;本地DNS服务器一般部署在数据中心或运营商网络中。本地DNS服务器也需要检查是否有本地缓存??,有则直接返回;如果本地没有,通过第5、6、7步获取IP地址,缓存到本地的DNS解析器中,然后返回给客户端。对于不需要全局负载均衡的简单应用,yourcompany.com的权威DNS服务器可以直接将域名object.yourcompa.com解析为一个或多个IP地址,然后客户端可以使用多个IP地址进行简单轮询用于简单的负载平衡。但是,对于复制应用,尤其是跨地域、跨运营商的大规模应用,需要更复杂的全局负载均衡机制,因此需要专门的设备或服务器来完成。这就是全局负载均衡器(GSLB,GlobalServerLoadBalance)。在yourcompany.com的DNS服务器中,通常通过配置CNAME的方式给object.yourcompany.com取一个别名。比如object.vip.yourcompany.com,然后告诉本地DNS服务器请求GSLB解析这个域名,GSLB在解析这个域名的过程中可以通过自己的策略实现负载均衡。上图画了两层的GSLB,因为它分为运营商和区域。我们希望不同运营商的客户可以访问对应运营商机房的资源,这样就不会跨运营商访问,有利于提高吞吐量,减少延迟。两层GSLB的过程如下:第一层GSLB,通过查看请求它的本地DNS服务器的运营商,知道用户的运营商。假设是移动的,通过CNAME,通过另一个别名object.yd.yourcompany.com,告诉本地DNS服务器请求二级GSLB;二级GSLB,通过查看请求它的本地DNS服务器的地址,知道用户的地理位置,然后将离用户位置比较近的一个Region的6个内部负载均衡地址返回给本地域名服务器;本地DNS服务器将结果返回给本地DNS解析器;本地DNS解析器缓存结果后,返回给客户端;客户端开始访问Region1中属于同一运营商且距离较近的对象存储。当然,客户端得到6个IP地址,可以通过负载均衡随机或轮询选择一个可用区访问。对象存储一般有三个备份来实现存储读写的负载均衡。总结DNS是网络世界的地址簿。可以通过域名查询地址,因为域名服务器是按树形结构组织的,所以域名查询采用递归查询的方式,通过缓存加快效率;在域名和IP的映射中,给应用程序基于域名的负载均衡机会,可以是简单的负载均衡,也可以是基于地址和运营商的全局负载均衡。参考:维基百科——域名系统词条;知乎——域名解析;刘超——网络协议趣谈系列;
