Replication

故障轉移和 DNS 傳播延遲

  • October 18, 2020

當 DBMS 在故障後故障轉移時,如果它故障轉移到不同且不相關的數據中心中的伺服器,則該數據庫的子域名的 IP 地址將需要在該名稱的 DNS 伺服器中更改,並且由於 DNS傳播延遲,世界上所有的 DNS 伺服器可能需要幾天的時間才能獲得新主伺服器的 IP 地址,在此期間,一些客戶端仍會嘗試訪問舊主伺服器。除了更改客戶端軟體以從某個地方獲取主伺服器的 IP 地址之外,可以做些什麼來處理這個問題,或者這是唯一的選擇?謝謝。

在 SQL Server 中,可用性組偵聽器的預設行為是向 DNS 註冊所有子網中的所有IP。雖然 DNS 將所有 IP 附加到偵聽器的A Record,但只有目前主節點的正確子網中的 IP 將線上。其他 IP 將在 DNS 中作為網路名稱,但對於任何實際主機實際上不會線上/可解析。

在預設配置下,多子網 AG 要求連接到它們的客戶端包含MultiSubnetFailover=true作為連接字元串屬性。此屬性告訴驅動程序期望 DNS 為偵聽器名稱提供多個 IP 地址,並嘗試所有這些地址以找到要連接到該網路名稱的正確 IP。未指定此屬性的客戶端將獲得多個 IP,並且不知道如何正確處理它們——大多數驅動程序會隨機選擇一個返回的 IP (或者可能只是看似隨機),並嘗試連接到該 IP。當它選擇錯誤的 IP 時,這可能會導致隨機(或看似隨機)的連接失敗。

發生故障轉移時,DNS 記錄不會更改。相反,線上和響應請求的 IP 將會改變。前一個主 IP 將下線並停止響應,另一個 IP 將在新子網中上線,並開始處理流量。這就是為什麼客戶端MultiSubnetFailover=true連接字元串屬性是必要的。客戶的司機需要知道如何處理這個問題。

您可以關閉此行為,以便 DNS 一次只註冊一個 IP 地址,或者甚至創建兩個偵聽器,以便一個使用預設行為,另一個一次註冊一個 IP。使用單 IP 偵聽器時,您確實需要等待 TTL 過期,並且在客戶端注意到故障轉移並能夠重新連接之前傳播 DNS 更新。在這種情況下,您可能希望將 TTL 設置得足夠低,以使停機時間可以接受。調整 TTL 最終是您可以拉動的槓桿,以防止 DNS 傳播花費數天時間。

引用自:https://dba.stackexchange.com/questions/278260