RFC 1034要求我們為 DNS 伺服器分配至少兩個 IP 位址。然而,如果我們使用任播尋址,就可以透過單一 IP 位址實現冗餘。 BGP 任播似乎可以很好地擴展到數百甚至數千台伺服器。
如果是這樣,為什麼我們還需要多個 IP 位址作為 DNS 伺服器?如果我們已經有了選播,它實際上會增強冗餘(有助於可用性)嗎?
我們會遇到哪些問題和錯誤如果我們只使用一個IP位址呢?
1.2.3.4
我的意思是完全省略輔助 DNS 位址,或者當某些設定需要至少兩個時,使用虛假 IP(例如)作為第二個位址。
答案1
單一任播 IP 位址無法提供與不同 IP 前綴中的兩個單播 IP 位址相同的冗餘。
通常,冗餘最困難的問題不是當某些東西完全失敗時,而是當它的行為不當足以仍然通過健康檢查,但實際上無法正常運行時。
我看過一個任播 DNS 設定,其中 DNS 伺服器出現故障,但封包仍會路由到該 DNS 伺服器。無論負責通告前綴的是什麼,都可能根本不知道 DNS 伺服器已關閉。
如果所討論的 DNS 伺服器不是權威 DNS 伺服器,而是遞歸解析器,事情就會變得更加棘手。
這種遞歸解析器需要同時具有用於接收來自用戶端的查詢的任播位址和用於查詢權威 DNS 伺服器的單播位址。但如果單播位址出現故障,它很容易看起來足夠健康,以至於仍然會路由查詢。
任播是可擴展性和減少延遲的絕佳工具。但為了冗餘,它不應該單獨存在。
然而,多個冗餘任播池是一個很好的可用性解決方案。一個眾所周知的例子是 8.8.8.8 和 8.8.4.4。兩者都是任播位址,但它們永遠不應該路由到同一個實體 DNS 伺服器(假設 Google 做得很好)。
如果您有 10 台實體 DNS 伺服器,則可以將它們配置為 2 個池,每個池中有 5 台伺服器,或 5 個池,每個池有 2 台伺服器。您希望避免一台實體 DNS 伺服器同時位於多個池中。
那你該分配多少個IP呢?您需要擁有一個可以彼此獨立設定為任播的 IP。這通常表示您需要為每個池分配整個 /24 的 IPv4 位址空間或 /48 的 IPv6 位址空間。這很可能會限制您可以擁有的池的數量。
此外,如果我們談論的是權威伺服器,則包含所有 NS 記錄以及 A 和 AAAA 黏合的 DNS 回應應適合單一 512 位元組封包。對於根伺服器來說,這有 13 個位址。但這不包括膠水和 IPv6,因此您達到的數字會更低。
每個池應盡可能在地理上分佈。如果您在歐洲有 5 台伺服器,在北美有 5 台伺服器以及 2 個任播 IP,則您無需建立一個跨越每個大陸的池。您將 2 個來自歐洲的放入一個池中,其中 3 個來自北美,另外 5 個放入另一個池中。
如果您有超過 2 個任播池,您可以讓一台實體伺服器暫時位於多個池中。但您絕對不應該允許實體伺服器同時位於所有池中。
選播和單播可以結合起來,但必須小心。如果您有兩個池的 IP,我不會合併。但是,如果您只有一個任播 IP 可供使用,那麼也包含單播 IP 可能是有意義的。問題是,包含單播 IP 不會為您帶來良好的延遲和負載平衡。
如果實體伺服器同時透過單播和選播提供,您可能會面臨使用者到達作為主伺服器和輔助伺服器的相同伺服器的風險,並且如果該伺服器發生故障,則可能會失去存取權限。可以透過僅使用不在任播池中的伺服器的單播位址或始終為使用者提供兩個單播位址來避免這種情況。
混合中的單播位址越多,發送到任播位址的查詢就越少,從延遲和可擴展性方面從任播獲得的好處也就越少。
答案2
最佳實踐是至少使用兩個來自不同前綴的位址,並在兩個不同的 TLD 下為它們指定名稱。如果您願意,這兩個位址都可以是任播的。只有一個 IP 位址會為您帶來單點故障。如果到該位址的路由不起作用(設定錯誤、任播執行個體無法正常運作、前綴被劫持等),那麼您的整個網域將變得無法存取。
每個任播位址至少需要一個/24
IPv4 或/48
IPv6 前綴才能在 BGP 中路由。在許多地方,全域路由表通常不接受較小(較長)的前綴。
絕不曾經輸入一個偽造的 IP 位址作為 DNS 伺服器。這將導致解析器嚴重延遲。
答案3
RFC 1034 僅聲明您需要兩個 DNS 伺服器。這不是強制性要求,而是建議,因此請按照您的意願進行操作。無論如何,如果您想要HA,您的2 個DNS 伺服器可以使用任播分配相同的IP,並且當一台DNS 伺服器發生故障時,您的最終用戶唯一會注意到的就是網路重新聚合時暫時失去連接。
總而言之,使用任播足以符合 RFC 1034。