DNS與HTTPDNS


DNS服務器

  • 根DNS服務器:返回頂級域DNS服務器的IP地址

  • 頂級域DNS服務器:返回權威DNS服務器的IP地址

  • 權威DNS服務器:返回相應主機的IP地址

    流程圖:

負載均衡

  • 內部負載均衡:可以配置域名,每次返回不同的ip
  • 全局負載均衡:高可用,如果某個服務器掛了,在DNS里直接刪除對應ip,埃博征訪問。

示例:DNS訪問數據中心中對象存儲上的靜態資源。

假設全國有多個數據中心,托管在多個運營商,每個數據中心三個可用區。對象存儲通過跨可用區部署,實現高可用性。在每個數據中心中,都至少部署兩個內部負載均衡器,內部負載均衡器后面對接多個對象存儲的前置服務器。

  1. 當一個客戶端要訪問object.yourcompany.com時,需要將域名轉為ip,所以請求本地DNS解析器。
  2. 本地DNS解析器查看是否有本地緩存這個記錄,如果有則直接使用
  3. 如果沒有,請求本地的DNS服務器。
  4. 本地的DNS服務器一般部署在你的數據中心或所在運營商的網絡中,本地DNS服務器需要查看本地是否有緩存,如果有則返回。
  5. 若無,本地DNS需要遞歸的從根DNS服務器,查到頂級域名服務器,最終查到權威DNS服務器,返回給本地DNS服務器。

對於不需要做全局負載均衡的簡單應用來講,權威DNS服務器可以直接將object.yourcompany.com域名解析為一個或多個ip地址,服務端可以通過多個ip地址,進行簡單的輪詢,實現簡單的負載均衡。

  • 全局負載均衡器(GSLB, Global Server Load Balance),在DNS服務器中,一般通過配置cname的方式,給object.yourcompany.com起一個別名,然后告訴本地DNS服務器,讓他請求GSLB解析這個域名,在解析這個過程中,通過自己的策略實現負載均衡。

  • GSLB可以分運營商和地域,第一層GSLB,通過查看請求他的本地DNS服務器所在的運營商,就知道用戶的運營商,通過起別名,告訴本地DNS服務器去請求第二層的GSLB。

    第二層GSLB查看請求他的本地DNS服務器的地址,知道了用戶的地理位置,將距離用戶位置比較近的region里,六個內部負載均衡的地址,返回給DNS服務器。

    本地DNS服務器將結果返回給本地DNS解析器,然后解析器返回給客戶端

    客戶端得到了6個ip地址,可以通過負載均衡的方式,隨機或者輪詢選擇一個可用區進行訪問。

DNS存在的問題

  1. 域名緩存問題

    本地做一個緩存,直接返回緩存數據。可能會導致全局負載均衡失敗,因為上次進行的緩存,不一定是這次離客戶最近的地方,可能會繞遠路。

  2. 域名轉發問題

    如果是A運營商將解析的請求轉發給B運營商,B去權威DNS服務器查詢的話,權威服務器會認為你是B運營商的,就返回了B運營商的網站地址,結果每次都會誇運營商。

  3. 出口NAT問題

    做了網絡地址轉化后,權威的DNS服務器,沒法通過地址來判斷客戶到底是哪個運營商,極有可能誤判運營商,導致跨運營商訪問。

  4. 域名更新問題

    本地DNS服務器是由不同地區,不同運營商獨立部署的,對域名解析緩存的處理上,有區別,有的會偷懶忽略解析結果TTL的時間限制,導致服務器沒有更新新的ip而是指向舊的ip。

  5. 解析延遲

    DNS的查詢過程需要遞歸遍歷多個DNS服務器,才能獲得最終結果。可能會帶來一定的延時。

HTTPDNS工作模式

定義:不走傳統的DNS解析,而是自己搭建基於HTTP協議的DNS服務器集群,分布在多個地點和多個運營商,當客戶端需要DNS解析的時候,直接通過HTTP協議進行請求這個服務器集群,獲得就近的地址。

  1. 在客戶端的SDK里動態請求服務端,獲取HTTPDNS服務器的ip列表,緩存到本地。SDK也會在本地緩存DNS域名解析的結果。這個緩存和本地DNS的緩存不一樣,不是整個運營商統一做的,而是手機應用來做的,如何更新,何時更新。

  2. 如果本地無,就需要請求HTTPDNS的服務器,在本地的ip列表中,選擇一個發出HTTP請求,返回一個要訪問的網站的ip列表。手機客戶端知道手機坐在的運營商,可以精確做到全局負載均衡。

  • HTTPDNS的緩存設計

    解析的過程不需要本地DNS服務遞歸調用一大圈,一個HTTP請求直接搞定,本地也有緩存,過期時間,更新時間都可以自己控制。

    緩存設計模式三層:客戶端,緩存,數據源

    • 對於應用架構,就是應用,緩存,數據庫。tomcat,redis,mysql
    • 對於HTTPDNS來說,就是手機客戶端,dns緩存,httpdns服務器

    例如dns緩存在內存中,也可以持久化到存儲上,app重啟后,就可以盡快的從存儲中加載上次積累的解析結果。

    sdk中的緩存會嚴格按照緩存過期時間,如果沒有命中,或已經過期,則不允許使用過期記錄,會發起一次解析,保障記錄是新的。

    解析可以是同步或異步的。

    同步更新的優點是實時性好,缺點是如果有多個請求都發現過期的時候,會同時請求HTTPDNS,浪費資源。對應到應用架構中緩存的Cache-Aside機制,先讀緩存,不命中讀數據庫,同時寫入到緩存。

    異步的優點是多個請求都過期的情況可以合並為一個,同時可以在即將過期的時候,創建一個任務進行預加載,防止過期之后再刷新成為預加載。缺點是當請求拿到過期數據,如果可以請求就沒問題,如果不能請求,則失敗,等下次緩存更新后,再請求方能成功。

    對應於應用架構中緩存的Refresh-Ahead機制,即業務僅僅訪問緩存,當過期就定期刷新。

  • HTTPDNS調度設計

    客戶端嵌入了SDK,在客戶端HTTPDNS服務端可以根據手機的國家,省市地點,運營商,選擇最佳的服務節點。

小結:

  • 傳統的DNS有解析慢,更新不及時,轉發跨運營商,nat跨運營商等問題,影響了流量的調度。
  • HTTPDNS通過客戶端sdk和服務端,直接解析dns,繞過了傳統dns缺點,實現智能調度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM