探索 DNS 解析

2022.05.05
探索 DNS 解析

DNS 在日常生活中非常重要。每個在線的人都需要訪問它,但與此同時,這對它來說是一個非常大的挑戰。如果 DNS 服務器出現故障,整個 Internet 網絡將被關閉。
DNS 服務器
在現實世界中,當您閱讀新聞、在線下單、下載文件或觀看直播時,您需要通過訪問域名訪問目標網站,例如 youtube.com、google.com 等。只需要記住這些網站的名稱,而不是它們的 IP 地址,因為 IP 地址比網站名稱更難記住。因此,您需要一個充當 DNS 服務器的網站/域地址簿。

DNS 在日常生活中非常重要。每個在線的人都需要訪問它,但與此同時,這對它來說是一個非常大的挑戰。如果 DNS 服務器出現故障,整個 Internet 網絡將被關閉。

另外,在線的人分佈在世界各地,如果每個人都去同一個地方訪問某個服務器,延遲會非常大。因此,DNS 服務器必須設置為高可用、高並發和分佈式。

所以它應該有一個像這樣的樹狀層次結構:
根 DNS 服務器:返回頂級域 DNS 服務器的 IP 地址。
頂級域DNS服務器:返回權威DNS服務器的IP地址。
Authoritative DNS Server:返回對應主機的IP地址。
DNS解析過程
為了提高 DNS 解析性能,許多網絡會根據位置部署 DNS 緩存服務器。 DNS解析過程如下:(這里以訪問google.com為例)

客戶端會發出DNS請求詢問google.com的IP是什麼,它會首先在瀏覽器緩存中查找google.com的IP地址。
然後該請求將被發送到本地 DNS 服務器。本地 DNS 服務器由您的 Internet 服務提供商 (ISP) 自動分配,該服務提供商通常是您的 ISP 提供的路由器。
本地 DNS 服務器收到客戶端的 DNS 請求,並在其緩存中查找 google.com 的 IP 地址。如果能找到對應的入口,則直接將IP地址返回給客戶端。否則,本地 DNS 服務器會詢問其根域名服務器:“你能告訴我 google.com 的 IP 地址嗎”?作為最高級別的 DNS 服務器,全球有 13 個根域名服務器。它不直接解析域名,而是充當“嚮導”。
根DNS服務器收到本地DNS請求,發現要搜索的域名後綴是.com,然後告訴本地DNS服務器:“好的,既然你要找的域名是.com的後綴,由.com管理,這裡是.com區域的頂級域DNS服務器的IP地址,去問問吧。”
本地 DNS 服務器轉為 .com 區域的頂級域名服務器,請求 google.com 的 IP 地址。頂級 .com 區域 DNS 服務器再次定向請求。它提供了負責 google.com 的權威 DNS 服務器的 IP 地址。
本地 DNS 服務器然後轉向權威 DNS 服務器並詢問 google.com 的 IP 地址。這一次,google.com的權威DNS服務器是域名解析結果的原始來源。它將 google.com 的 IP 地址直接返回給本地 DNS 服務器。
然後本地 DNS 服務器將 IP 返回給客戶端並緩存它。至此,DNS解析完成。
總結一下,我畫了下面這張圖:
DNS 負載均衡
內部負載均衡
DNS 服務器首先執行內部負載平衡。比如應用要訪問數據庫,是應該在應用中配置數據庫的IP地址,還是配置數據庫的域名?

很明顯,域名應該是配置的,因為一旦數據庫因為某種原因被移動到另一台機器上,如果多個應用程序都配置了這個數據庫,一旦IP地址發生變化,所有這些應用程序都需要返工。

但是,如果配置了域名,則只需將域名映射到DNS服務器中的新IP地址即可完成工作,大大簡化了運維工作。

在此基礎上,我們可以走得更遠。例如,如何在訪問它的多個應用程序之間進行負載平衡?只需將其配置為域名即可。在域名解析中,我們只需要配置策略,這次返回第一個IP,下次返回第二個IP,實現負載均衡。

全局負載均衡
為了確保我們的應用程序的高可用性,它們通常部署在多個計算機數據中心,每個數據中心都有自己的 IP 地址。

當用戶訪問一個域名時,這個IP地址可以輪詢多個數據中心。如果某個數據中心由於某種原因宕機了,只需在 DNS 服務器中刪除該數據中心對應的 IP 地址即可。這樣可以達到一定程度的高可用性。

另外,我們肯定希望紐約的用戶訪問紐約的數據中心,西雅圖的用戶訪問西雅圖的數據中心,這樣客戶體驗會非常好,訪問速度會超級快。這就是全局負載均衡的概念。

讓我們看看它是如何工作的,假設全國有多個地區,每個地區都有三個可用區。
當客戶端要訪問app.metaleap.com時,需要將域名轉換為IP地址才能訪問,所以需要請求本地DNS解析器。
本地 DNS 解析器首先檢查本地緩存中的該記錄。如果有,直接使用。
 如果沒有本地緩存,則需要請求本地 DNS 服務器。
本地DNS服務器也需要檢查是否有本地緩存,有則返回。
如果沒有本地DNS,則需要從根DNS服務器遞歸查找.com的頂級域名服務器,直到找到metaleap.com的權威DNS服務器,並交給本地DNS服務器。權威的 DNS 服務器通常會返回真實的 IP 地址。
對於不需要全局負載均衡的簡單應用,metaleap.com的權威DNS服務器可以直接將域名app.metaleap.com解析為一個或多個IP地址,然後客戶端可以使用多個IP地址輪詢實現簡單負載均衡。

但是對於復雜的應用,尤其是跨區域、跨數據中心的大規模應用,需要更複雜的全局負載均衡機制,需要專門的設備或服務器來做這件事——全局負載均衡器(GSLB,Global Load Balancer Balancer) .

在metaleap.com的DNS服務器中,一般通過配置CNAME,給app.metaleap.com起一個別名,如app.vip.metaleap.com,然後告訴本地DNS服務器請求GSLB解析域名, GSLB在解析域名的過程中,可以通過自己的策略來實現負載均衡。

圖中繪製了兩層 GSLB,數據中心和區域。我們希望不同數據中心的客戶能夠訪問同一數據中心的資源,以提高吞吐量並減少延遲。

綜上所述
DNS 是網絡世界的地址簿。您可以通過域名搜索地址。由於域名服務器是按樹形結構組織的,因此域名搜索是遞歸的並被緩存以提高性能。

在域名和IP映射的過程中,應用有機會進行基於域名的負載均衡,可以是簡單的負載均衡,也可以是基於地址、數據中心、區域的全局負載均衡。