首次披露阿里巴巴DNS系统遇到的极端挑战。
每年双十一,对阿里巴巴的各种技术都是一个挑战。DNS也不例外。
DNS协议从最早的hosts文件,到RFC 1034、RFC 1035把DNS协议标准化,已经有四十年的历史了,是TCP/IP协议族中最古老的协议之一。到现在为止,有上百篇RFC对DNS进行了各种扩充和加固。使得DNS成为最常用,最不可缺少的互联网基础设施之一。大多数网络程序启动后,发出的第一个数据包即是gethostbyname()调用产生的DNS请求包。因为网络上的程序通信,早已抛弃了通过IP直连的方式,转而由域名相互调用。好处很多:方便调试、维护,易于人类理解。在IPv6网络中,更难以直接引用IP地址,必须转化成简单易读的域名形式。
在DNS系统中,主要角色有:DNS解析器、递归DNS、权威DNS。DNS解析器是Windows、Linux上的一段DNS代码,也就是glibc对gethostbyname()实现,作用是接收上层应用的调用,在网络上发出一个DNS请求包,接收应答,提取解析结果返回给上层应用。
递归DNS部署在离PC机、服务器很近的网络位置。递归DNS的服务IP是Windows配置的DNS服务器IP、Linux的/etc/resolv.conf中的NS IP。递归DNS接收DNS解析器发来的请求,去各级权威DNS做递归请求。递归DNS会把递归结果缓存在本地,下次收到同样的请求,就不再去递归了。递归DNS本身是一个缓存,不保存权威的数据。
权威DNS保存了域名和IP的对应关系,由根到各种*域,一级级授权。例如根的权威DNS储存了.com .net .cn等等各个*域的权威DNS的IP。.com的权威DNS保存了taobao.com.的权威DNS的IP。www.taobao.com.的域名和IP地址的对应关系,就存在taobao.com.的权威DNS服务器。递归DNS一级级查找,从taobao.com.的权威DNS拿到www.taobao.com.的IP,返回给用户。
从以上系统能看出来,复杂、耗时的递归逻辑由递归DNS完成,DNS客户端只是简单的发出DNS请求。DNS系统把复杂的逻辑包裹在系统内,对用户提供了简单清晰的逻辑。递归DNS是对用户提供服务的窗口,也是请求压力非常大的一个模块。在阿里巴巴内网,由于以下几个原因,递归DNS收到的请求的qps非常高。
- 各种良莠不齐的应用代码产生的大量无效DNS请求
- 各个业务方的压力测试带来的突发DNS请求
- 低版本OS/glibc带来的多余的主机名正反解请求
- 海量服务器带来的DNS请求,积少成多,汇聚到DNS服务器成为巨大的流量
- DNS攻击,这里具体指针对递归DNS、权威DNS的攻击
双十一的DNS技术挑战
集团内部各个系统间的调用,是通过域名调用,而不是IP。一次淘宝天猫网页的点击,从多台服务器发出几十个DNS请求到DNS服务器。每年双十一零点时,海量的用户请求来到阿里巴巴网络内部,一石激起千层浪,阿里内部各个系统被激活,海量的相互调用导致了DNS请求的峰值。为了应对这么大量的DNS请求,传统的堆机器的方式已不再有效。
在双十一零点峰值场景下,递归DNS的流量是平常的许多倍。而权威DNS的流量上涨不如递归DNS明显。因为在双十一时,被请求量很大的都是重复的域名。一个用户的购买请求,可能触发A、B……Z系统间相互调用。另一个购买请求还是会请求这几个域名。这就使得递归DNS的缓存命中率很高,请求不会到权威DNS。
导致这么多的DNS请求的原因除了双十一,还有操作系统的域名机制的原因。
Windows操作系统自身提供了DNS缓存功能,通过ipconfig /displaydns可以查看系统当前缓存。Linux默认是没有DNS缓存的,但有类似于Windows下的DNS缓存软件nscd。只要启动了nscd服务,就能使用DNS缓存。一般Linux本机是不做DNS缓存的。如果Linux本地缓存了DNS,一旦这个域名对应的IP失效或变更了,本地应用程序就无法立即感知到变化,导致故障。
除了操作系统的缓存之外,应用本身一般也会设计DNS缓存以实现效率的最大化,以JVM为例,JVM对于正常域名的缓存为30秒。
还有一个较大的问题。很多系统使用DNS实现负载均衡,一个域名配置了多个IP。gethostbyname()返回给上层应用的,是第一个IP。这要求递归DNS将多条IP的顺序打乱,随机返回。如果不同IP对应的集群服务能力不同,还需要递归DNS按照权重返回IP。
阿里巴巴的自研DNS解决方案
阿里巴巴DNS团队自研了一套DNS系统——DNS Mega,轻松应对双十一零点的DNS流量洪峰。
DNS Mega是一套递归DNS系统,可以应对大流量的DNS请求。使用单台物理服务器,即可获得非常高的QPS能力。以往需要水平扩展服务器台数,以提高DNS的系统容量,这种方式比较原始,扩容缩容都很慢。有了DNS Mega,一套集群里只需要部署不多的几台服务器,即可满足大量业务服务器的DNS需求。DNS Mega在域名缓存即将过期时,会重新请求这个域名,使得DNS Mega系统中的域名始终反应权威DNS的最新状态。
在应对DNS攻击方面,DNS Mega有一套独特的逻辑。针对递归DNS比较多的攻击是泛域名攻击,也就是请求a.taobao.com b.taobao.com。前缀不断变化的域名请求。一般的递归DNS系统,收到这些请求都不会命中缓存,会到权威DNS递归。占用大量的递归DNS资源。DNS Mega能区分出正常请求和攻击请求,将更多的资源分配给正常请求。
值得高兴的是,包括DNS Mega在内的阿里公共DNS,已经对广大互联网用户提供服务了。PC、移动设备、服务器等各种终端,都可以免费使用阿里公共DNS。用户只需要把本机的DNS地址设置成223.5.5.5和223.6.6.6,即可用到完全免费、快速的公共DNS服务。
想更深入的了解阿里巴巴的DNS系统吗?2017年10月13日上午,杭州云栖小镇,云栖大会DNS专场。我们等你!