DNS是網絡的基礎服務,網絡上的各種應用對DNS的依賴性很高。DNS的穩定,直接決定了上層應用服務的穩定。那如何保障DNS服務的高可用呢?
我們先來看下高可用的概念:
高可用
高可用(High availability):指系統無中斷地執行其功能的能力,一般用下面的公式來衡量:

- MTBF: Mean time between Failures,平均多久出一次故障;
-
MTTR: Mean time to recover,出故障後的恢複服務的時間。
實作dns高可用,主要靠降低出故障、故障後快速恢複。下圖是dns服務架構簡圖,分為管控層和解析層,後面分别描述這兩層如何實作高可用。
管控層
管控層最主要的兩個功能: DNS資料的持久化,DNS資料下發到adns(dnsserver)。
1 資料持久化
管控層接收使用者配置的域名資料後,持久化存儲在資料庫。利用了資料庫團隊的X-Cluster産品,實作資料的高可用,消除了運維誤操作等原因導緻的資料丢失:
資料庫采用三地五副本,同城強同步方案部署;
資料庫各個節點間采用Paxos 協定選主,在任意階段出現問題後,資料内部自選主切換;
應用機房部署與資料庫解耦,可以任意機房部署;
在資料庫Leader 故障場景下,資料庫會自動發生切換,應用連入任意節點擷取目前Leader 位置後恢複應用業務。
2 資料下發
管控與adns之間,主要通過穩定的内部網絡來下發資料,資料傳輸出錯的機率低;
管控向adns發送資料時,有資料補償機制,對與下發失敗,做多次重試,如果重試都無法成功,報警轉人工處理。
解析層
解析層由adns叢集組成,部署在全球的上百個idc機房,通過anycast釋出大量的服務ip。使用者向這些ip發送dns請求,擷取解析結果。
1 消除單點
解析層主要靠消除單點實作failover,來減少故障。
- 主機到網絡:每台adns通過雙網口,雙上聯到兩個不同的交換機,避免網口單點、交換機的單點故障;
- 叢集内:adns分成多個不同叢集,每個叢集内多台adns,這些機器向交換機釋出相同的IP,通過ECMP分發流量。同叢集内DNS都是熱備的關系,當某台adns出問題,交換機把流量分發到其它伺服器。
- 叢集間:多個不同的叢集,釋出相同的ip,這些叢集之間,通過網絡的anycast技術互相熱備,某個叢集不可用,流量被轉到其它可用的叢集。
- NS IP:由于特殊原因(比如營運商黑洞等),個别IP全網都無法通路。我們對每個NS配置多個IP,LocalDNS會基于SRTT算法,選擇出最短的rt的IP,将請求轉發過去,進而避開有問題的IP。
2 系統容量
監控系統實時監控各個伺服器、叢集的qps容量;
adns叢集,部署上具備水準擴容能力,容量能達到機房的帶寬。
3 如何保證解析正确
部署資料對賬系統,對adns之間做資料對比,adns與管控的DB做資料對比;
部署撥測系統,對zone的soa做撥測,對特定域名的rr記錄做撥測;
通過上面的兩類手段,及時發現資料異常并作出響應,避免異常或者縮短異常的處理時間。
一般通過摘除有問題的伺服器的路由,幾秒鐘即可生效。
4 安全防護
作為面向公網的服務,網絡攻擊無法避免,會影響系統可用性。我們采用了下面兩類安防手段,提高dns的可用性。
1) 網絡攻擊防護
常見的dns攻擊,是4層的ddos攻擊。對于超大流量的網絡攻擊,利用機房部署的aliguard,做網絡防護;
為了減少ddos防護系統對dns的影響,我們設定了很高的防護門檻值,對應門檻值之下的ddos攻擊,通過我們高性能的dnsserver(adns)來承載攻擊。
2) 應用安全
為了應對DNS投毒、欺騙等場景,我們的dnsserver,支援dnssec;
為了應對DNS劫持,我們支援有連接配接的協定,比如tcpdnshttpdnstlsdoh;
使用者可以根據自己的需求,選擇合适的安全方案。