導讀 | 建構一個健壯的系統需要為故障而設計。身為 GitHub 的網站可靠性工程師(SRE),我們一直在尋求透過冗餘來幫助緩解問題,今天將討論最近我們所做的工作,以便支援你透過 DNS 來尋找我們的伺服器。 |
大型 DNS 供應商在其服務中建構了多層冗餘,當出現導致中斷的問題時,可以採取措施來減輕其影響。最佳選擇之一是把你的區域的權威服務分割到多個服務提供者。啟用分割權威很簡單,你只需在網域註冊商配置兩套或多套你區域的名稱伺服器,然後 DNS 請求將分割到整個清單中。但是,你必須在多個提供者之間對這些區域的記錄保持同步,並且,根據具體情況這可能要么設置複雜,要么是完全手動的過程。
$ dig NS github.com. @a.gtld-servers.net. ... ;; QUESTION SECTION: ;github.com. IN NS ;; AUTHORITY SECTION: github.com. 172800 IN NS ns4.p16.dynect.net. github.com. 172800 IN NS ns-520.awsdns-01.net. github.com. 172800 IN NS ns1.p16.dynect.net. github.com. 172800 IN NS ns3.p16.dynect.net. github.com. 172800 IN NS ns-421.awsdns-52.com. github.com. 172800 IN NS ns-1283.awsdns-32.org. github.com. 172800 IN NS ns2.p16.dynect.net. github.com. 172800 IN NS ns-1707.awsdns-21.co.uk. ...
上面的查詢是向 TLD 名稱伺服器 詢問 github.com. 的 NS 記錄。它傳回了我們在網域名稱註冊商中配置的值,在本例中,一共有兩個 DNS 服務供應商,每個四筆記錄。如果其中一個提供者發生中斷,那麼其它的仍有希望可以服務請求。我們在各個地方同步記錄,並且可以安全地修改它們,而不必擔心資料陳舊或狀態不正確。
完整地配置分割權威的最後一部分是在兩個 DNS 服務提供者中將所有名稱伺服器作為頂層 NS 記錄新增至區域的根。
$ dig NS github.com. @ns1.p16.dynect.net. ... ;; QUESTION SECTION: ;github.com. IN NS ;; ANSWER SECTION: github.com. 551 IN NS ns1.p16.dynect.net. github.com. 551 IN NS ns2.p16.dynect.net. github.com. 551 IN NS ns-520.awsdns-01.net. github.com. 551 IN NS ns3.p16.dynect.net. github.com. 551 IN NS ns-421.awsdns-52.com. github.com. 551 IN NS ns4.p16.dynect.net. github.com. 551 IN NS ns-1283.awsdns-32.org. github.com. 551 IN NS ns-1707.awsdns-21.co.uk.
在 GitHub,我們有幾十個區域和數千筆記錄,而大多數這些區域並沒有關鍵到需要冗餘,因此我們只需要處理一部分。我們希望有能夠在多個 DNS 服務提供者中保持這些記錄同步的方案,並且更一般地管理內部和外部的所有 DNS 記錄。所以今天我們宣布了 OctoDNS。
配置OctoDNS 能夠讓我們重新打造我們的 DNS 工作流程。我們的區域和記錄儲存在 Git 倉庫的設定檔中。對它們的變更使用 GitHub 流,並像個網站一樣用分支部署。我們甚至可以做個 “空” 部署來預覽哪些記錄會在變更中修改。設定檔是 yaml 字典,每個區域一個,它的頂層的鍵名是記錄名稱,鍵值是 ttl、類型和類型特定的資料。例如,當包含在區域檔案 github.com.yaml 中時,下列配置將建立 octodns.github.com. 的 A 記錄。
octodns: type: A values: - 1.2.3.4 - 1.2.3.5
配置的第二部分將記錄資料的來源對應到 DNS 服務提供者。下面的程式碼片段告訴 OctoDNS 從 config 提供者載入區域 github.com,並將其結果同步到 dyn 和 route53。
zones: github.com.: sources: - config targets: - dyn - route53
一旦我們的配置完成,OctoDNS 就可以評估當前的狀態,並建立一個計劃,其中列出將需要將目標狀態與來源相符的一組變更。在下面的範例中,octodns.github.com 是一個新的記錄,所以所需的操作是在兩者中建立記錄。
$ octodns-sync --config-file=./config/production.yaml ... ******************************************************************************** * github.com. ******************************************************************************** * route53 (Route53Provider) * Create * Summary: Creates=1, Updates=0, Deletes=0, Existing Records=0 * dyn (DynProvider) * Create * Summary: Creates=1, Updates=0, Deletes=0, Existing Records=0 ******************************************************************************** ...
預設情況下 octodns-sync 處於類比運作模式,因此不會採取任何行動。一旦我們審閱了變更,並對它們感到滿意,我們可以添加 `--doit' 標誌並再次執行命令。 OctoDNS 將繼續它的處理流程,這次將在 Route53 和 Dynect 中進行必要的更改,以便建立新的記錄。
$ octodns-sync --config-file=./config/production.yaml --doit ...
此刻,在兩個 DNS 服務提供者裡我們有了相同的資料記錄,並且可以輕鬆分割我們的 DNS 請求給它們,並知道它們將提供準確的結果。當我們直接執行上面的 OctoDNS 命令時,我們的內部工作流程依賴部署腳本和 chatops。你可以在 README 的工作流程部分中找到更多資訊。
總結我們認為大多數網站可以從分割權威中受益,並且希望使用 OctoDNS,其中最大的障礙已被掃除。即使對分割權威不感興趣,OctoDNS 仍然值得一看,因為它將基礎設施即程式碼的好處帶給了 DNS。
想幫助 GitHub SRE 團隊解決有趣的問題嗎?我們很樂意加入我們。在這裡申請。
以上是OctoDNS 的使用方法和 DNS 分割權威配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!