同一 DNS 上的多個伺服器的冗餘

同一 DNS 上的多個伺服器的冗餘

我有一個域名,例如api.test.com.我也有三台伺服器。

我希望這之間有冗餘,所以如果一台伺服器離線,網域api.test.com將不會重定向到它,而只會重定向到其他伺服器。

我發現我們可以在同一個網域上有多個A/AAAA記錄,但是如果電腦是否ping通則不計入計數,只是隨機給出所有可用IP之一。

我該怎麼做才能做到冗餘呢?我應該購買另一台重定向所有請求的伺服器(例如代理)嗎?

答案1

不,這不是它的工作原理。您可以將某種類型和名稱的多個記錄配置到一個區域。客戶通常不知道這一點;它請求特定的名稱和類型(例如,瀏覽器請求您在位址方塊中輸入的名稱,類型為 A、AAAA)。

如果傳回多個記錄,它會隨機選擇一筆記錄並嘗試連接那裡。如果存在另一條記錄,則由客戶端重試連線。伺服器也透過每次以不同的記錄順序回答相同的查詢來鼓勵這種行為。因此,即使某些客戶端“總是選擇第一個”,伺服器上的隨機化仍然會發生。這樣就實現了負載平衡的原始形式。

特殊的 DNS 負載平衡器會傳回 TTL 非常低的 A 記錄,因此它們很快就會過期;因此,伺服器可以透過在回復中省略位址來對突然的負載峰值或後端節點中斷做出快速反應。如果您嘗試解析 Zoom 的視訊會議伺服器,您可以看到這一點;他們使用這項技術。但這需要這個特殊的軟體(DNS 負載平衡器)來管理該名稱的 DNS,而這只是故事的開始。

一般來說,如果在 A 記錄處收到的第一次嘗試的 IP 沒有應答,Web 用戶端通常會回傳失敗,即使有其他 IP 可以嘗試。有些軟體確實會重試,例如OpenVPN可以無限期地重試,但這是一個特例。


DNS 透過完全不同的機制提供冗餘,再次期待足夠聰明的客戶端。有一種特殊類型的 DNS 記錄,稱為SRV(service),有4個資料欄位:優先權、權重、連接埠、名稱。

名稱最簡單:此 SRV 記錄所描述的 A 記錄的名稱。連接埠是所請求的服務位於該名稱的伺服器上的 TCP 或 UDP 連接埠。該名稱必須具有關聯的 A 或 AAAA 記錄;不允許 CNAME。如果該名稱有多個A 或AAAA 記錄,我們將對此特定SRV 記錄執行通常的「嘗試一次」DNS 行為(但用戶端應嘗試其他SRV 記錄(如果有),例如具有更高優先值的記錄)。

權重可以更深入地控制負載平衡:如果有多個記錄具有相同的優先權,客戶端應嘗試根據它們的權重來分散負載。它通常是按機率完成的。

優先級用於冗餘:必須先嘗試具有最低值的記錄,然後是下一個優先級,依此類推。但同樣,重試取決於客戶。

記錄看起來像:

_kerberos._tcp.example.net. SRV 0 100 88 dc.example.net.

下劃線實際上是記錄名稱中的字面下劃線。它表示,「kerberos」服務透過​​ TCP 在 dc.example.net 連接埠 88 上提供。此範例來自 MS Active Directory,它嚴重依賴 DNS 來正常運行,並將其用於 ldap(目錄)和 kerberos(安全框架)。如果你有多個AD網域控制器,就會有更多這樣的記錄,指向不同的DC。

這種類型的記錄用於例如 ldap、kerberos、kpasswd(kerberos 密碼更改)、xmpp(jabber)、sip(ip 電話)和其他服務。

MX就像“SRV 的特例”,它綁定到端口 25,並且只有“優先權”字段,沒有“權重”。這只是一種“舊風格”,是在 SRV 之前發明的(並且是它的靈感來源)。它僅用於電子郵件。

SRV 無法協助您使用 Web 服務。它僅對客戶端知道使用 SRV 記錄來發現伺服器的服務有幫助;網路客戶端從不這樣做。

相關內容