字節二面:DNS 解析一個地址的時候會返回多個IP 嗎?

2023.06.30

字節二面:DNS 解析一個地址的時候會返回多個IP 嗎?


要實現一個域名對應多個IP 地址的效果,只需要在DNS 解析操作平台,添加一條解析記錄,將網站的域名指向服務器的IP 地址。一般情況下,一個域名對應一個IP 地址,也就只需添加一條解析記錄即可。

答案是不會。本題的考察點其實就是 DNS 負載均衡。

一個域名對應多個IP

從理論上講,一個域名是可以對應多個IP 的,在這種情況下,當不同的用戶訪問該域名時,就會訪問到不同的IP 地址。

要實現一個域名對應多個IP 地址的效果,只需要在DNS 解析操作平台,添加一條解析記錄,將網站的域名指向服務器的IP 地址。一般情況下,一個域名對應一個IP 地址,也就只需添加一條解析記錄即可。

如我們想要將 www.itmtx.cn 這個域名分別指向1.1.1.1(北京電信)、2.2.2.2(上海移動)、3.3.3.3(深圳聯通)三個IP。

那麼我們就可以在DNS 服務器中配置三個A 記錄,分別為:

  • www.itmtx.cn IN A 114.100.20.201;
  • www.itmtx.cn IN A 114.100.20.202;
  • www.itmtx.cn IN A 114.100.20.203;

圖片圖片

如果現在北京用戶訪問 itmtx.cn 這個域名,上海用戶也在訪問,兩個用戶雖然都訪問同一個域名,但訪問的IP 地址並不相同,而是會根據DNS 事先配置的「解析策略」將解析得到的那個IP 地址返回給對應的訪客。

每次域名解析請求都會解析出一個不同的IP 地址返回給訪客,這樣就構成了一個服務器集群,並實現負載均衡的效果。不同用戶就近訪問不同的服務器IP 地址,訪問速度大大提升,同時也減輕了單個服務器的訪問壓力。同時,由於有多個備選IP,當其中一個出現問題時,可以通過宕機切換,提高業務可用性。

DNS 解析策略

常見的DNS 解析策略包括:

  • 輪詢(Round Robin):DNS 服務器按順序返回多個IP地址,實現請求的輪流分發到不同的服務器上。
  • 權重(Weighted):為每個IP 地址分配不同的權重,權重越高的服務器被選中的概率越大。
  • 響應時間(Response Time):DNS 服務器可以通過測量服務器的響應時間來選擇最快的服務器,將域名解析為對應的IP 地址。

各個DNS 解析產品可能採用的解析策略不一樣,以DNSPod 解析為例,他採用的就是權重+ 隨機的策略:

圖片圖片

基於DNS 實現負載均衡的優缺點

基於DNS 實現負載均衡是十分簡單和有效的技術手段,它主要有以下幾點優勢:

  1. 將負載均衡工作交給DNS,省去了網站管理維護負載均衡服務器的麻煩;
  2. 技術實現比較靈活,操作簡單,成本低,適用於大多數TCP/IP 應用;
  3. 對於部署在服務器上的應用來說,不需要修改任何代碼就能實現不同機器上的應用訪問;
  4. 很多DNS 系統還支持基於地理位置的域名解析,可以將域名解析成距離用戶地理位置最近的服務器地址,加快用戶訪問速度。

但基於DNS 的負載均衡同樣也存在一些弊端:

  1. 目前的DNS 系統是需要經過遞歸服務器、頂級服務器、權威服務器以及眾多緩存等多級解析的,在每一個環節都可能存在解析記錄緩存。如果服務器IP 發生變動,即使修改了A 記錄,也需要各級緩存失效後才能生效。而在解析生效前的這段時間,用戶可能就會根據緩存記錄訪問到已經被更換過的服務器上,從而導致訪問失敗。
  2. 為了本地DNS 服務器能夠及時同步權威服務器上的最新記錄,所以一般將DNS 緩存刷新時間設置得比較小,這就會導致DNS 頻繁發起解析請求,從而造成額外的網絡問題。
  3. DNS 本身並不具備主動監測服務器負載情況或動態調整權重的能力,不能區分不同服務器之間的性能和負載差異,不能反映服務器當前的運行狀態,所以一些大型網站總是使用DNS 域名解析作為第一級負載均衡手段,然後在通過負載均衡服務器提供更高級的負載均衡算法(比如最少連接:將請求發送到擁有最少開放連接的服務器),從而完成最終請求。