閱讀404 返回首頁    go 阿裏雲 go 技術社區[雲棲]


輕鬆應對雙十一零點的DNS流量洪峰

首次披露阿裏巴巴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請求包,接收應答,提取解析結果返回給上層應用。

未命名.png

    遞歸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非常高。
1. 各種良莠不齊的應用代碼產生的大量無效DNS請求
2. 各個業務方的壓力測試帶來的突發DNS請求
3. 低版本OS/glibc帶來的多餘的主機名正反解請求
4. 海量服務器帶來的DNS請求,積少成多,匯聚到DNS服務器成為巨大的流量
5. 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專場。我們等你!

最後更新:2017-09-20 18:02:58

  上一篇:go  Spring cloud zuul
  下一篇:go  9月20日雲棲精選夜讀:異構計算&高性能計算分論壇——揭秘拿什麼實現超算平民化、國際化?