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;
用戶可以根據自己的需求,選擇合適的安全方案。