Google DNS服务器提速技术揭秘
2009-12-06 51CTO 编辑:黄永兵
Google推出了“Google免费公共DNS服务器”据Google官方声称,Google DNS的目标是速度、安全性和有效性,它意味着完全没有劫持、没有阻截、没有过滤的DNS查询,而且速度飞快。那么为什么Google敢说自己的DNS服务器速度快呢?Google官方出具了一份文档说明,我们这就来看一看。
传统的DNS服务器缓慢的原因
随着网页越做越复杂,引用的资源可能来自多个域,于是DNS查找成为网页浏览过程的瓶颈。无论何时,客户端需要查询DNS服务器的时候,由于要查询的DNS服务器数量和它所处的地理位置不同,时间延迟有很大的差异。例如,下图显示由PageSpeed测量出的浏览一个网页时时间都花到哪些动作上了,每个条块表示网页中引用的一个资源,黑色区域表示DNS查找所花掉的时间,在这个页面中,前11秒执行了13次DNS查找,虽然很多查找是并行执行的,图中显示仍然有5个串行查找时间,它们就占据了11秒的大部分时间。
图 1 PageSpeed报告的页面浏览过程各个操作的时间
DNS延迟由两部分组成
1、在客户端(用户)和DNS服务器之间的延迟,受网络通信情况的约束,这个时间所占的比例是非常大的,如客户端和服务器之间的距离,网络拥塞,数据包丢失和长时间重传延迟,服务器本身超载运行,拒绝服务攻击等。
2、DNS服务器之间的延迟,这种延迟主要是以下因素造成的:
(1)缓存丢失。如果某个查询请求不能从缓存中直接返回结果,请求就会递归查询其它DNS服务器,如果遇到根服务器出现这种问题,那影响更厉害。
(2)如果DNS服务器超载运行,所有查询请求必须排队。
(3)恶意流量。拒绝服务器攻击可以给DNS服务器带来过度的负载。
我们认为缓存丢失是DNS延迟最主要的因素。
缓存丢失
即使DNS服务器有充足的本地资源,但与远程DNS服务器之间的延迟是不可避免的,当本地缓存丢失时,解析器至少需要和一个其它DNS服务器沟通,有时甚至是两个或多个,通过对Google搜索的观察,我们发现平均每次解析时间需要130毫秒,由于UDP包丢失或服务器不能响应,大约有4-6%的搜索请求会超时。如果我们采取措施解决如数据包丢失,死掉的DNS服务器,或DNS配置错误,那响应时间会上升到300-400毫秒。
虽然各个DNS缓存丢失率不尽相同,但由于以下原因,缓存丢失是不可避免的:
1、互联网规模在不断变大。随着互联网爆炸式增长,不断有新用户和新的网站加入,互联网内容已经非常庞大。
2、TTL值。DNS TTL值降低的趋势迫使任何解析都需要频繁的查找。
3、缓存隔离。DNS服务器通常都采用了负载均衡技术,每个独立的服务器都维护一份独立的缓存,而不能共用共享缓存池中的解析。
Google免费公共DNS服务器如何提高DNS查找速度
在Google公共DNS中,我们采用了多种技术手段来提高DNS查找速度,其中一些方法是实验性质的,另外一些是遵循标准的。
1、充分配置服务器处理来自客户端的通信,包括恶意流量。
2、预防DoS和放大攻击,虽然这是一个安全问题,但阻止DoS攻击可以提高DNS服务器处理正常请求的能力。
3、共享缓存负载均衡,提高跨服务器集群的缓存命中率。
4、域名预取技术。克服传统的被动式缓存缺陷,我们将通过这个技术满足流量有限和缓存分区等技术挑战。
5、提供给全球用户使用。
Google免费公共DNS服务器提速法宝一:正确配置服务器集群
缓存DNS解析器必须执行比权威服务器更多的工作,因为很多响应不能直接从内存中找到结果,相反,它们需要与其它域名服务器通信,因此需要大量的网络I/O。此外,开放式解析器容易遭受攻击,如发送一些不能解析的全球,这增加了缓存丢失率,同时DoS攻击会增加通信负载。如果解析器没有正确配置集群,合理分配工作负载,可能也会带来负面的性能影响。如数据包被丢掉,需要重传,抵达域名服务器的请求必须排队等。所有这些因素都会引起延迟。
因此,为DNS解析器提供大容量的I/O非常重要,包括处理可能的DoS攻击,唯一有效的方法就是提供非常多的服务器,同时,增加服务器最重要的就是不能降低缓存命中率,这需要采用有效的负载均衡策略。
Google免费公共DNS服务器提速法宝二:共享缓存负载均衡
如果负载均衡配置不当,增加服务器反倒会降低缓存命中率,在一个常见的部署中,多台服务器位于一台负载均衡器背后,使用诸如循环这样的简单算法来分配请求,这样做的结果是每台服务器维护它们自己的独立缓存,因此缓存内容是孤立的。如果每个请求根据通信情况被随机分配,缓存丢失率将不断增长,例如,对于那些长TTL重复查询的域名,缓存丢失率会随集群中服务器数量的增加而增长。
为了提高缓存命中率,最重要的是负载均衡,避免缓存分散在各个服务器上,目前有两种方法:一是使所有服务器使用全局缓存,二是按域名将缓存分区,所有同一域名的查询就会被定向到同一台服务器。在Google公共DNS中,我们同时使用了这两种技术,每台服务器都共享一个小的全局缓存,包括最流行的域名,这些服务器负载均衡就很好控制了,如果这些缓存不能满足查询,它会根据域名将请求发给另一个服务器,所有相同域名的查询都会发给同一台服务器。
Google免费公共DNS服务器提速法宝三:域名预取技术
随着互联网规模的扩大,传统解析器命中率有些限制,它们一般缓存的都是比较流行的域名,我们希望也能够处理冷门的域名,在传统DNS服务器上,由于这些冷门域名访问次数较少,过不了多长时间就会过期,就会从缓存中清除。
为了实现这些目标,我们正在试验域名预取技术,当前主要面临两大挑战:
1、考虑其他域名服务器的限制。为了确保我们的预取技术不会给其它域名服务器带来过多的负载,我们队我们的传出请求做了限制,确保其它服务器的容量不被用尽。
2、管理我们自己服务器的容量限制。由于我们的服务器没有无限的内存和CPU,在挑选域名预取服务器时要谨慎。此外,为了保护缓存不被伪造的攻击吃掉,我们将主要缓存分成主/次分区,并根据流量类型授予每个分区上的读/写权限。
为了最大限度使用固定域名服务器,我们需要权衡每个域名记录的成本,不过要确定每个域名的成本是一项复杂的任务,因为我们想实现以下所有目标,其中一些是相互冲突的:
1、最小化缓存丢失。这意味着我们不需要预取流行的域名,因为考正常的用户访问流量足以保证它不被清除出缓存。
2、即使我们的服务器正在遭受拒绝服务攻击,但仍然要为流行的域名提供服务在,这意味着我们需要预取流行的域名。
3、避免假域名污染攻击,这意味着我们不能完全依靠域名来选择流量。
4、保持选中的域名更新,我们须臾根据流行度,成本等因素调整候选域名。
域名选择问题的复杂性使得它不能在线完成,因此我们将预取系统分成了两部分:管道组件,它是一个外部运行的,脱机的,周期性的过程,它选择域名提交到预取系统;另一个是运行时组件,定期根据它们的TTL窗口解析选中的域名。
管道组件综合来自各个不同源的域名,主要是Google搜索索引和最近的Google公共DNS服务器日志,根据效益进行排列,效益是各种因素的结合,包括命中率、缓存丢失成本和知名度。管道然后参照TTL成本,重新对所有记录进行排列,从顶部选择所有域名,知道成本预算用尽,管道不断更新选定的域名,运行时组件解析选中的域名记录,并根据它们的TTL设置刷新它们。
Google免费公共DNS服务器提速法宝四:分布式DNS服务集群
对于封闭式解析器,不存在这个问题,但对于开放式解析器,服务器越接近用户越好,他们在客户端看到的延迟会更少,此外,足够的地域覆盖也是保证端到端低延迟的重要手段,域名服务器通常会返回优化后的结果,也就是说,如果一个内容提供商在全世界都托管了他们的镜像站点,该提供商的域名服务器将会返回离访问IP最近的IP地址。
Google公共DNS托管在全球的数据中心中,并使用选播路由将用户转向最近的数据中心。
注意,由于域名服务器根据解析器的IP地址而不是用户的IP地址作为定位依据的,Google公共DNS服务器和其它开放式DNS服务有相同的限制:用户可能不会被定向到本地DNS提供商的服务器。这可能导致某些网站浏览起来仍然很慢。