一、常規DNS調度策略原理
以CDN系統為例(其他業務系統大多采用類似的策略),來說明一下多地域部署服務如何實現用戶訪問請求調度的。
Step 1:客戶端(假設IP地址為IP1)向Local DNS(假設IP地址為IP2)發出域名解析請求(假設請求的域名為www.taobao.com )
Step 2:Local DNS代理客戶端向權威服務器發起域名解析請求
Step 3:權威服務器根據域名( www.taobao.com )和IP2(對應的地域和ISP)進行調度並返回對應的解析結果。
Step 4: 客戶端根據調度返回的IP發起業務訪問請求。
二、調度精確性問題
2.1 問題描述
從上面的調度過程可以看出,業務系統會根據客戶端的local dns IP來判斷客戶所處地域和運營商,並根據該地域和運營商來調度到就近的服務節點。
可以看出,當客戶的Local DNS與客戶的地域和運營商不匹配時,此時按照Local DNS來調度就會出現調度不精確的問題。
下面看幾個來自客戶的反饋(探測結果來自AliCDN崑崙探測工具):


探測的客戶端IP和Local DNS IP以及對應的地域,運營商如下所示:
客戶端IP |
220.249.84.** |
220.249.84.** |
客戶端歸屬 | 武漢聯通 | 武漢聯通 |
Local DNS IP |
183.61.13.** |
222.73.134.** |
Local DNS 歸屬 | 珠海電信 | 上海電信 |
很容易看出,Local DNS地域和運營商與客戶端都不匹配,此時按照Local DNS IP調度會對用戶體驗造成非常大的影響(國內跨運營商的訪問延遲和帶寬都存在非常大的問題,相信大家有深刻體驗)。
2.2 問題影響面
根據我們的經驗,影響的客戶端佔比在3%-7%之間。
2.3 原因
無線場景下主要由於以下兩個方面因素導致:
(1)國內三大運營商Local DNS布點不足且不均勻,大量流量集中在2000個以內的Local DNS上,大的Local DNS對應的流量超過5Gb
(2)很多手機(尤其是山寨機)Local DNS配置不準確
如果擴展到全網(含有線訪問請求),還需要考慮一個因素:
(3)公共DNS(如google 8.8.8.8,阿里的223.5.5.5,223.6.6.6)導致調度系統無法識別Local DNS的具體位置。
三、解決辦法
業界當前常見的解決思路都是通過獲取客戶端的IP來精確定位客戶端地域和運營商,實現上,有三種方式:
(1)HTTPDNS
客戶端通過HTTP請求向httpdns服務器發出域名解析請求,此時httpdns服務器可以拿到客戶端的精確IP,並基於客戶端IP進行調度。
(2)edns client subnet
通過dns包中加入客戶端IP信息,使得DNS調度系統可以拿到客戶端IP並進行調度。
(3)http 302跳轉
當調度系統給出的調度結果不準確時,業務服務器仍然可以根據客戶端IP來判斷調度是否合理,並且在必要時通過302跳轉來實現重定向進而實現精確調度。
三種方式的優缺點對比如下:
客戶端修改 | Local DNS修改 | 權威DNS修改 | 系統開銷 | 使用範圍 | |
HTTPDNS | 有 | 無 | 低 | 最廣 | |
edns client subnet | 無 | 需支持edns client subnet | 需支持edns client subnet | 低 | 中等 |
http 302 | 有(需支持302跳轉) | 無 | 高 | 最差 |
HTTPDNS綜合來看是最優的解決方案,當前阿里雲已經推出了HTTPDNS商業化產品。