DNS 能做的不只是回傳 IP
基本的 DNS 行為是「給一個名稱,回一個位址」。但託管型 DNS 服務(NS1、UltraDNS 這類)把回答這一步變成了可程式化的決策點——同一個名稱,可以依提問者的位置、各端點的延遲、當下的健康狀態,回傳不同的答案。
這在跨境架構裡很有用:亞洲的使用者導到亞洲節點、歐洲的導到歐洲,不需要在應用層做任何事。但這套機制建立在一個前提上,而那個前提經常不成立——下表第三列就是問題所在。
| 調度方式 | 依據什麼決定 | 限制 |
|---|---|---|
| 輪詢(round robin) | 依序輪流回傳各個位址 | 完全不看位置或健康狀態 |
| 加權分配 | 預先設定的流量比例 | 可控分佈,但仍不看位置 |
| 地理路由(GeoDNS) | 提問的遞迴解析器所在位置 | 不是使用者的位置——除非有 ECS |
| 延遲路由 | 量測到各端點的網路延遲 | 量的同樣是解析器到端點,非使用者 |
| 健康檢查故障轉移 | 端點是否通過健康檢查 | 切換受 TTL 限制,不是即時的 |
先看各種調度方式分別依據什麼。
三種會判斷錯的情況
以下三種都很常見,而且共通點是使用者與解析器不在同一個地方:
- 使用者改用公共 DNS 8.8.8.8、1.1.1.1 這類公共解析器採用任播(anycast),分散在全球。台灣的使用者向 8.8.8.8 發問,實際回應的可能是新加坡或香港的節點,權威伺服器看到的就是那個位置。使用者只是在設定裡改了一行 DNS,您的地理路由就失準了,而這完全不在您的控制範圍內。
- 企業內部解析器集中在總部 許多企業把 DNS 查詢統一導向總部的內部解析器。於是分公司在東京的員工,查詢卻是從台北發出——GeoDNS 會把他們全部導到台北節點。這種情況在日誌上看起來完全正常,因為從權威伺服器的角度,那確實是來自台北的查詢。
- 電信與行動網路的解析器位置 營運商的解析器不一定部署在使用者所在的區域,跨境情境下尤其明顯。中國三大營運商各自的解析器架構不同,這也是同一個網站對電信與移動使用者表現不一致的原因之一。
ECS 補上了什麼,又補不上什麼
EDNS Client Subnet(ECS,定義於 RFC 7871)就是為了解決這個問題:遞迴解析器在轉發查詢時,附帶使用者 IP 的網段片段,讓權威伺服器能依使用者而非解析器判斷位置。NS1 這類服務的地理過濾功能,官方文件也明說在解析器支援 ECS 時效果最好。
但它有三個限制。第一,不是所有解析器都會送 ECS——這牽涉隱私,部分解析器刻意不傳送,您無法要求對方配合。第二,送的是網段而非完整 IP,精細度有限。第三,它增加了權威伺服器的快取負擔,因為同一個名稱要針對不同網段保留不同答案。
如果地理準確度是關鍵需求,任播(anycast)在結構上優於 GeoDNS。任播的路由發生在網路層,依實際的 BGP 路徑決定使用者連到哪個節點——那是使用者的真實位置,不經過解析器這一層。這也是 CDN 通常不依賴 GeoDNS 做節點選擇的原因。
健康檢查與故障轉移沒有想像中快
託管 DNS 的健康檢查會偵測端點是否存活,失效時自動改回傳備援位址。但這個切換要真正生效,必須等使用者手上的快取過期——也就是那筆記錄的 TTL。TTL 設 300 秒,就有最長五分鐘的使用者仍會拿到指向故障端點的答案。
所以 DNS 層的故障轉移適合處理「持續數分鐘以上的故障」,不適合當作即時的高可用機制。若要秒級切換,那是負載平衡器或任播網路的工作,不是 DNS 的。這一點與 TTL 的行為直接相關,跟一般的 DNS 變更是同一套機制。
三個層次的判斷
評估要不要用 GeoDNS 時,依序確認這三項:
一、你的使用者用什麼解析器?
這決定 GeoDNS 對你有多準。一般消費者大量使用公共 DNS,企業使用者則常走內部解析器——兩者都會降低準確度。如果使用者集中在少數地區、且多用當地電信的解析器,準確度會高得多。
二、導錯節點的後果有多嚴重?
如果只是延遲高一些,機率性的準確度可以接受。但如果涉及資料落地、法遵區隔(例如某些資料不得離境),就不能依賴 GeoDNS——那需要在應用層做明確判斷,而不是靠一個看不到使用者的機制。
三、你要的是優化還是故障轉移?
兩者對 TTL 的要求相反。優化希望 TTL 長一點以減少查詢;故障轉移希望 TTL 短一點以加快切換。要同時做到就得取捨,或者把故障轉移交給更下層的機制處理。
設定前該確認的三件事
在導入之前,這三項會決定它能不能達到你的期待:
- 確認服務商支援 ECS 且已啟用 支援與啟用是兩件事,部分服務需要在設定中明確開啟。沒開的話,所有查詢都會依解析器位置判斷。
- 確認 TTL 與你的切換需求相容 先想清楚可以接受多久的切換延遲,再回推 TTL。事後才發現 TTL 太長,那些已經發出的答案不會因為你改設定而失效。
- 確認有辦法驗證實際行為 從不同地區、不同解析器實際查詢,看回傳的是哪個位址。只從自己的網路測試,量到的永遠是同一個答案——那證明不了地理路由有沒有在運作。
小結
GeoDNS 的根本限制是權威伺服器看不到使用者,只看得到解析器。ECS 緩解了這個問題但不能消除它,因為送不送 ECS 由解析器決定,不由你決定。把它當成盡力而為的優化是合理的,當成精確的流量控制則會在出問題時無法解釋。
若您需要的是可靠的就近接入而非機率性的猜測,任播架構在結構上更適合——路由決策發生在網路層,依使用者的實際連線路徑而非解析器位置。我們的 CDN 服務即屬此類,並可在不接入中國大陸節點的前提下部署。