一种应用于DNS权威服务器的CNAME加速方法
技术领域
本发明涉及DNS权威服务器技术领域,具体涉及一种应用于DNS权威服务器的CNAME加速方法。
背景技术
DNS(Domain Name System,域名系统)最早于1982年有保罗·莫卡派乔斯发明;原始的技术规范在882号因特网标准草案(RFC 882)中发布。1987年发布的第1034和1035号草案修正了DNS技术规范,并且废除了之前的地882和883号草案。在此之后对因特网标准草案的修改基本上没有涉及到DNS技术规范部分的改动。
现今在DNS系统中,常见的资源记录类型有以下几种:
一、主机记录(A记录):于RFC 1035中定义,A记录是用于指定主机(或域名)对应的IP地址记录;
二、别名记录(CNAME记录):于RFC 1035中定义,CNAME记录用于将多个别名绑定在一个A记录上;
三、域名服务器记录(NS记录):于RFC 1035中定义,用来指定哪些域名是由哪些DNS服务期解析的;
四、IPv6主机记录(AAAA记录):于RFC 3596中定义,于A记录对应将域名解析到指定的IPv6的IP上。
DNS一般查询流程如图1所示,包括以下步骤:
1)客户端向本机配置的本地名称服务器发出DNS域名查询请求;
2)本地名称服务器收到请求,先查询本地的缓存,如果有该域名的缓存,则本地名称服务器将DNS域名查询结果缓存并返回给用户,结束本次DNS域名查询;如果没有该域名的记录,本地名称服务器再以DNS客户端的角色发送与步骤1)中一样的DNS域名查询请求至根名称服务器;根名称服务器收到DNS请求后,把所请求的DNS域名中顶级域所对应的顶级域名称服务器A名称及地址返回给本地名称服务器;
3)本地名称服务器根据根名称服务器返回的顶级域名称服务器A地址,向对应的顶级域名称服务器A发送与步骤1)中一样的DNS域名查询请求;顶级域名称服务器A在收到DNS查询请求后,把所请求的DNS域名中下一级子域所对应的名称服务器名称及地址返回给本地名称服务器,根据逐级授权机制,最终本地名称服务器获取到所查询域名的权威服务器;
4)本地名称服务器将DNS查询请求发至所查询域名托管的权威服务器,权威服务器将DNS请求结果返回给本地名称服务器;
5)重复步骤1)至4),直至权威服务器将客户端需要的DNS请求结果返回给本地名称服务器,本地名称服务器将DNS域名查询结果缓存并返回给用户,结束本次DNS域名查询;
基于上述步骤,我们发现在多级CNAME的情况下,一次DNS查询会经历多次重复的迭代查询,极大影响了查询效率以及响应时延,影响用户体验,而该场景在普通CDN(Content Delivery Network,即内容分发网络)业务中会频繁出现,于是为了更好地处理这种场景,本发明提出了一种应用于DNS权威服务器的CNAME加速方法。
发明内容
本发明提供了一种应用于DNS权威服务器的CNAME加速方法,解决了多级CNAME导致一次DNS查询经历多次重复的迭代查询动作,从而影响解析效率、增加权威服务器的压力问题。
一种应用于DNS权威服务器的CNAME加速方法,包括以下步骤:
1)客户端向本机配置的本地名称服务器发出DNS域名查询请求;
2)本地名称服务器收到请求,先查询本地的缓存,如果有该域名的缓存,则本地名称服务器将DNS域名查询结果缓存并返回给用户,结束本次DNS域名查询;如果没有该域名的记录,本地名称服务器再以DNS客户端的角色发送与步骤1)中一样的DNS域名查询请求至根名称服务器;根名称服务器收到DNS请求后,把所请求的DNS域名中顶级域所对应的顶级域名称服务器A名称及地址返回给本地名称服务器;
3)本地名称服务器根据根名称服务器返回的顶级域名称服务器A地址,向对应的顶级域名称服务器A发送与步骤1)中一样的DNS域名查询请求;顶级域名称服务器A在收到DNS查询请求后,把所请求的DNS域名中下一级子域所对应的名称服务器名称及地址返回给本地名称服务器,根据逐级授权机制,最终本地名称服务器获取到所查询域名的权威服务器;
4)所查询域名托管的权威服务器设置多级CNAME,本地名称服务器将DNS查询请求发至所查询域名托管的权威服务器,如果存在多级CNAME,权威服务器会内部迭代查询CNAME,找到最终的CNAME记录或A记录,将找到的CNAME记录或A记录返回给本地名称服务器,本地名称服务器将DNS域名查询结果缓存并返回给用户。
本发明中,本地名称服务器迭代查询到权威名称服务器的DNS请求返回的是CNAME,权威名称服务器内部能够自动查询CNAME的结果并返回给客户端,包括托管在权威服务器的不同域的跨域CNAME查询。
步骤4)中,所查询域名托管的权威服务器设置多级CNAME,具体包括:配置多级CNAME,同步到各个的所查询域名托管的权威服务器。
现有的同步方式一般为DNS服务器的同步方式。数据中心部署主DNS服务器,同时在多个地区部署从DNS服务器,通过主DNS服务器向多个从DNS服务器发送同步数据。这种传统的同步方式首先是同步速度较慢,而且主DNS服务器的压力会比较大(同时更新新的DNS记录,处理DNS请求,发送DNS同步数据)。
本发明中,同步到各个的所查询域名托管的权威服务器,具体包括:
I)通过在数据中心部署主redis集群和redis哨兵,通过redis哨兵实时监控主redis集群服务状态出现故障做到及时的故障转移;
II)部署多台从redis服务器,主redis集群将主redis的数据发送给从redis服务器,将从redis同步;
III)所查询域名托管的权威服务器从从redis服务器获取并更新数据,数据包括多级CNAME、A记录、AAAA记录等。
所查询域名托管的权威服务器则均匀分布在各个地区,每个权威服务器只需要获取最近的从redis服务器的数据即可。
步骤II)中,边缘(不属于数据中心的主机)以及中心部署多台从redis同步主redis的数据,DNS服务器则均匀分布在各个地区,每个DNS服务器只需要获取最近的从redis服务器的数据即可。
如果存在多级CNAME,权威服务器会内部迭代查询CNAME,查询CNAME的限制最大层级数为6级,如果CNAME查询到6级之后还没有得到相应的A记录或者AAAA记录,那么权威服务器(即权威名称服务器)会将CNAME返回给客户端。查询CNAME的限制最大层级数为6级,能够保证权威服务器的解析效率,并且避免权威服务器的压力。
权威服务器会内部迭代查询CNAME,具体包括:
A、用户的DNS请求迭代查询到使用的权威服务器上;
B、权威服务器先识别用户所在的地区以及运行商信息;
C、权威服务器带着地区以及运行商信息以及用户的DNS请求进行内部查询。
步骤C中,内部查询包括:
a、将DNS记录用redis哈希(hash)结构存储起来;
b、查询多级CNAME的过程中,该条CNAME会存在多个域,根据带权轮询算法选取CNAME;
c、查询到A记录,根据权威服务器带着地区以及运行商信息,返回跟权威服务器带着地区以及运行商信息最相关的结果,作为最佳结果。
步骤b可以缓解某个域下压力过大。
在常规的DNS协议下,DNS记录要以某种格式存储下来而这种传统的存储形式解析起来比较复杂,查询的时间复杂度较高
本发明改变了原有的DNS记录存储格式,将这些记录用类似字典的形式存储起来,即采用redis哈希(hash)结构存储,这样服务器查询的速度会大大加快,当然我们能够采取这样的格式取决于我们特殊的DNS数据同步方式。
本发明同时实现了CNAME和A记录的负载均衡以及智能调度功能。
本发明实现了CNAME与A记录的负载均衡。本发明本身实现了契合DNS查询场景的带权循环调度算法,通过认为可配置的方式实现了CNAME与A记录的负载均衡。
该项发明集成并调用实时更新的基于用户IP地理位置信息以及运营商归属地的地址库,能够保证返回的结果尽可能的靠近发送DNS请求的客户端所属地。
与现有技术相比,本发明具有如下优点:
本发明大大减少了客服端访问权威名称服务器的频率,减少了顶级域名称服务器以及权威名称服务器的压力。
本发明大大减少了多级CNAME下客户端递归查询的次数,减少了DNS的解析时间。
本发明极大提升了客户端体验及安全性,缩短打开网页时间的同时,降低被劫持的风险。
本发明的应用于DNS权威服务器的CNAME加速方法,通过权威服务器内部自动进行的多级CNAME查询,可以使远端递归服务器直接获取到查询结果,而无需进行多次迭代查询,降低了远端递归服务器与权威服务器的交互次数,极大提升了递归服务器的查询效率,同时也降低了解析时延。
附图说明
图1为现有技术中一般DNS查询流程的示意图;
图2为本发明应用于DNS权威服务器的CNAME加速方法实现的DNS查询流程的示意图;
图3为本发明中CNAME加速内部实现流程的示意图;
图4为本发明数据同步机制的示意图;
图5为现有技术中常规数据同步机制的示意图。
具体实施方式
如图1所示,为现有技术中一般DNS查询流程的示意图。
如图2所示,为本发明一种应用于DNS权威服务器的CNAME加速方法,包括以下步骤:
1)客户端向本机配置的本地名称服务器发出DNS域名查询请求;
2)本地名称服务器收到请求,先查询本地的缓存,如果有该域名的缓存,则本地名称服务器将DNS域名查询结果缓存并返回给用户,结束本次DNS域名查询;如果没有该域名的记录,本地名称服务器再以DNS客户端的角色发送与步骤1)中一样的DNS域名查询请求至根名称服务器;根名称服务器收到DNS请求后,把所请求的DNS域名中顶级域所对应的顶级域名称服务器A名称及地址返回给本地名称服务器;
3)本地名称服务器根据根名称服务器返回的顶级域名称服务器A地址,向对应的顶级域名称服务器A发送与步骤1)中一样的DNS域名查询请求;顶级域名称服务器A在收到DNS查询请求后,把所请求的DNS域名中下一级子域所对应的名称服务器名称及地址返回给本地名称服务器,根据逐级授权机制,最终本地名称服务器获取到所查询域名的权威服务器;
4)所查询域名托管的权威服务器设置多级CNAME,本地名称服务器将DNS查询请求发至所查询域名托管的权威服务器,如果存在多级CNAME,权威服务器会内部迭代查询CNAME,找到最终的CNAME记录或A记录,将找到的CNAME记录或A记录返回给本地名称服务器,本地名称服务器将DNS域名查询结果缓存并返回给用户。
如图3所示,为本发明中CNAME加速内部实现流程,权威服务器会内部迭代查询CNAME,具体包括:
A、用户的DNS请求迭代查询到使用的权威服务器上;
B、权威服务器先识别用户所在的地区以及运行商信息;
C、权威服务器带着地区以及运行商信息以及用户的DNS请求进行内部查询。
步骤C中,内部查询包括:
a、将DNS记录用redis哈希(hash)结构存储起来;
b、查询多级CNAME的过程中,该条CNAME会存在多个域,根据带权轮询算法选取CNAME;
c、查询到A记录,根据权威服务器带着地区以及运行商信息,返回跟权威服务器带着地区以及运行商信息最相关的结果,作为最佳结果。
图3对本发明进行更全面的描述:
首先用户的DNS请求迭代查询到使用的权威服务器上。权威服务器先识别用户所在的地区以及运行商信息,然后权威服务器带着这些信息进行内部查询。
以xxx.upyun.com的DNS请求为例子。
该DNS服务器发现xxx.upyun.com属于upyun.com的域。
于是该DNS服务器便往upyun.com域下面的记录开始查寻找。
在常规的DNS协议下,DNS记录要以某种格式存储下来而这种传统的存储形式解析起来比较复杂,查询的时间复杂度较高。
本发明改变了原有的DNS记录存储格式,将这些记录用类似字典的形式[redis哈希(hash)结构,采用KV键值对]存储起来,这样权威服务器查询的速度会大大加快,当然我们能够采取这样的格式取决于我们特殊的DNS数据同步方式(下面会详细介绍)。
由于本发明内部还实现了CNAME负载均衡(为了缓解某个域下的压力过大,我们会将一个域下的域名CNAME到另一个域下或者是该域的其他域名下面)DNS权威服务器会获取到多个域名a.upyun.com,b.upyun.com,c.upcdn.net,d.ialloc.com。该DNS权威服务器会根据带权轮询算法选取CNAME。
如果拿取到了c.upcdn.net,即使upcdn.net与upyun.com已经不属于同一个域下了但是只要是托管与该DNS权威服务器的域都能继续查询直到得到相应记录,获取多个域名如61.152.73.208,111.62.9.80,111.62.9.72。本发明实现的DNS记录存储形式保证了不同域之间的切换查询高效迅速。
最终在返回结果选择上我们还会依据用户的地理位置以及运营商信息返回最佳结果。
同时该项发明还优化了DNS服务器的同步形式,如下图4中所示。配置多级CNAME,同步到各个的所查询域名托管的权威服务器。同步到各个的所查询域名托管的权威服务器,具体包括:
I)通过在数据中心部署主redis集群和redis哨兵,通过redis哨兵实时监控主redis集群服务状态出现故障做到及时的故障转移;
II)部署多台从redis服务器,主redis集群将主redis的数据发送给从redis服务器,将从redis同步;
III)所查询域名托管的权威服务器从从redis服务器获取并更新数据,数据包括多级CNAME、A记录、AAAA记录等。
所查询域名托管的权威服务器则均匀分布在各个地区,每个权威服务器只需要获取最近的从redis服务器的数据即可。
对于DNS权威服务器,架构上不会只部署一台,只部署一台会导致某些地区DNS请求响应太慢,所以一般DNS权威服务器的部署都会覆盖多个地区,然而当DNS权威服务器覆盖范围变大的时候同步数据就变得比较困难。
图5是一般DNS服务器的同步方式。数据中心部署主DNS服务器,同时在多个地区部署从DNS服务器,通过主DNS服务器向多个从DNS服务器发送同步数据。这种传统的同步方式首先是同步速度较慢,而且主DNS服务器的压力会比较大。同时更新新的DNS记录,处理DNS请求,发送DNS同步数据。
如图4所示,本发明采用了不同的同步方式,通过在数据中心部署主redis集群,通过redis哨兵实时监控主redis服务状态做到及时的状态转移。边缘以及中心部署多台从redis同步主redis的数据,DNS服务器则均匀分布在各个地区,每个DNS服务器只需要获取最近的从redis服务器的数据即可。这种设计主要利用了redis的读写高效性确保了同步的高速。同步的高速使得我们能够对CNAME做一些灵活的调整加速DNS查询。
本发明利用了redis中的hash结构(hash是一个string类型的field和value的映射表)来存储DNS记录,使得DNS服务器能够快速查找到相应记录。相对来说DNS协议中的DNS记录形式就显得笨重不易处理。
本发明的同步实现中并没有所谓的主从DNS服务器,不会出现单台DNS服务器压力过大导致DNS查询速度变慢的情况。