DNS 的層次架構

DNS 是樹狀的分散式系統:

根域(.)
├── .com
│   ├── example.com   ← authoritative DNS server
│   │   ├── api.example.com
│   │   └── www.example.com
│   └── google.com
└── .tw
    └── ...

遞迴查詢的過程

當你輸入 api.example.com,你的電腦的 DNS resolver 要解析它:

你的電腦
  ↓ 詢問本機 DNS cache / /etc/hosts
  ↓ 沒有 → 問 recursive resolver(通常是你的 ISP 或 8.8.8.8)

Recursive Resolver
  ↓ 詢問 Root Name Server(知道所有 TLD 的位置)
  → Root: ".com 的 TLD server 在 192.5.6.30"
  ↓ 詢問 .com TLD Server
  → TLD: "example.com 的 authoritative NS 在 ns1.example.com (203.0.113.1)"
  ↓ 詢問 ns1.example.com(authoritative server)
  → "api.example.com 的 A record 是 93.184.216.34"

Recursive Resolver 把結果快取,返回給你的電腦

這個過程在 cache 都是 cold 的時候可能需要 20-200ms,但大多數情況 resolver 有 cache,所以幾毫秒就解析完了。


TTL(Time to Live):每個 DNS record 都有保鮮期

Authoritative DNS server 在每個 record 上設定 TTL(秒)。Resolver 快取這個 record,直到 TTL 過期才重新查詢。

api.example.com.  3600  IN  A  93.184.216.34
                   ↑
                   TTL(這個 record 快取 3600 秒 = 1 小時)

為什麼改了 DNS 不立刻生效

  1. 你在 authoritative DNS 改了 A record 指向新 IP
  2. 但所有曾經解析過這個域名的 resolver 都在快取舊的 record,直到 TTL 過期

如果 TTL 是 3600(1 小時),改了 record 後最多需要等 1 小時,全球的 resolver cache 才會刷新。

最佳實踐:在計劃做 DNS 切換之前,提前 24-48 小時把 TTL 降到 300(5 分鐘),這樣切換完成後等待時間更短,確認新設定沒問題後再把 TTL 調回。


Recursive vs Iterative 查詢

Recursive(你的電腦問 resolver):resolver 幫你問完整個鏈,返回最終答案。

Iterative(resolver 問 root/TLD/authoritative):root 只告訴 resolver「去問誰」,不幫它繼續查。


Flush DNS Cache

如果你改了 DNS record 但想立刻測試:

# macOS
sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder
 
# Linux (systemd-resolved)
sudo systemd-resolve --flush-caches
 
# Windows
ipconfig /flushdns
 
# 用 Google 的 DNS 查詢(bypass 本機 cache)
dig @8.8.8.8 api.example.com
 
# 或直接問 authoritative server(不管任何 cache)
dig +trace api.example.com

DNS 看起來是「把域名翻成 IP」的簡單事,但理解它的遞迴結構和 TTL 機制,能讓你在 migration、disaster recovery、CDN 切換這類場景做出正確的決策。