キャッシュと TTL — 速さと鮮度のトレードオフ
TTL の残り時間、miss の回数、negative caching を秒数で手計算する。
TTL は『この答えを何秒キャッシュしてよいか』
第 3 章では、再帰リゾルバが root → TLD → 権威と辿る流れと、キャッシュヒット時にその道のりが省略されることを見ました。本章では、その キャッシュがどれだけ持つか = TTL を秒数で扱います。
TTL は DNS レコードに付く寿命です。再帰リゾルバは、その TTL が切れるまで同じ RRset を再利用できます。TTL が長ければ速くなり、権威サーバへの負荷も減ります。一方で、権威側で値を変えても、TTL が残っているあいだは古い答えが見え続けることがあります。
expires_at = fetched_at + TTL(
expires_at = 失効時刻、fetched_at = レコードを取得した時刻、TTL = レコードに記された寿命の秒数)— 取得時刻に TTL を足したものが失効時刻です。remaining = expires_at - now(
remaining = 残り TTL、now = 現在時刻)— 0 未満になったら再利用できません。max stale ≒ 期限までの残り — 更新直後でも、既存キャッシュはすぐには消えません。小問 5-1 — まずは秒数を手で数える
TTL を『感覚的に長い・短い』でなく、秒数として扱います。
Q23. 再帰リゾルバが 12:00:00 に TTL 300 秒のレコードを取得しました。12:03:20 時点の残り TTL は何秒ですか。
300 秒から経過 200 秒を引くので、残り TTL は 100 秒です。
Q24. 再帰リゾルバが 12:00:00 に TTL 300 秒の旧レコードを取得し、権威側では 12:02:00 に新レコードへ更新されたとします。その resolver では、その時点から最大あと何秒旧レコードが返りえますか。
キャッシュの有効期限は 12:05:00 なので、12:02:00 の更新時点から最大 180 秒は旧レコードが残りえます。
スライダで体感する
次のシミュレータでは、1 時間のあいだに権威データが何回か更新される状況を作っています。TTL、更新間隔、同じ再帰リゾルバに来る問い合わせ間隔を変えながら、ヒット率 と 古い答えを返す区間 の両方を見比べてください。
小問 5-2 — miss の回数と鮮度のトレードオフ
TTL を短くすると何が増え、何が減るかを数字で確認します。
Q25. 1 つの再帰リゾルバに対し、0 秒以上 300 秒未満の間、10 秒おきに同じ名前・型の問い合わせが来るとします。TTL は 60 秒で、最初はキャッシュが空です。権威側への miss は何回起きますか。
TTL 60 秒なので、初回取得後は 60 秒ごとに失効します。0〜299 秒では 0, 60, 120, 180, 240 の 5 回 miss します。
Q26. TTL を短くしたときに起こりやすい変化として正しいものはどれですか。
TTL を短くすると古い値が残る時間は短くなりますが、そのぶん cache miss が増えやすく、上流問い合わせも増えやすくなります。
negative caching もある
DNS は『存在しない』という結果もキャッシュします。つまり typo した名前への NXDOMAIN や、『その型のデータはない』という否定応答も、しばらく再利用されます。これを知らないと、さっき作ったレコードがまだないと言われる ような挙動で混乱します。
否定応答の保持時間は、SOA レコードの minimum フィールドで決まります(RFC 2308)。SOA レコードは次の構造を持ちます。
| フィールド | 意味 |
|---|---|
| MNAME | マスター(プライマリ)権威サーバのホスト名 |
| RNAME | ゾーン管理者のメールアドレス(@ を . に置換した形式) |
| serial | ゾーンのシリアル番号。値が増えるとセカンダリが転送を取り直す |
| refresh | セカンダリが SOA を再取得しに行く間隔(秒) |
| retry | refresh が失敗したときの再試行間隔(秒) |
| expire | セカンダリがマスターと連絡が取れない場合に、ゾーンデータを破棄するまでの猶予(秒) |
| minimum | negative caching TTL の上限(秒)。NXDOMAIN や NODATA がこの時間キャッシュされる |
つまり「typo の NXDOMAIN がいつまで残るか」は、その親ゾーンの SOA の minimum 値(と応答の TTL)で上限が決まります。
また、『キャッシュ』という言葉は広すぎるので、どの層のキャッシュか を分けて考える必要があります。DNS の TTL は名前解決結果の寿命であり、HTTP キャッシュや CDN edge cache とは別です。詳しくは第 6 章で扱います。
運用のコツ: 切り替え前に TTL を事前に短くしておき、移行後に戻す、という運用がよく行われます。変更直前に TTL を短くしても、すでに配られた長い TTL のキャッシュには効きません。
小問 5-3 — 否定応答と層の違いを確認する
NXDOMAIN が残る時間と、DNS キャッシュ以外との違いを整理します。
Q27. negative caching について最も正しい説明はどれですか。
DNS では NXDOMAIN や特定 RR type が存在しないという否定応答もキャッシュされます。これが negative caching です。
Q28. ある resolver が 13:00:00 に NXDOMAIN 応答を 120 秒でキャッシュしました。13:01:00 にその名前のレコードが新たに作成されたとして、その時点からあと何秒待てば、その resolver が上流へ再問い合わせしうる状態になりますか。
NXDOMAIN のキャッシュ期限は 13:02:00 なので、13:01:00 時点から見ると残り 60 秒です。
この章で持ち帰ること
- TTL は 『この答えを何秒キャッシュしてよいか』 という寿命
- TTL を長くするとヒット率が上がり、短くすると鮮度が上がる
- NXDOMAIN のような 否定応答にもキャッシュ がある