- ブラウザURL入力
- DNS名前→IP今ここ
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理
- DB保存
第25週で、委任によって権威そのものが別の組織へ分かれることを見ました。今回はその先、1つのゾーンを担当する複数台が同じ中身を保つ仕掛けを扱います。
まず結論
権威を1台しか置かないと、その1台が落ちた時点でゾーン全体が引けなくなります。だから複数台置き、すると「複数台が同じ中身を持つ」ことをどう成り立たせるかという問題が生まれます。
その答えが SOA の SERIAL の比較です。受け取る側が自分の版と相手の版を見比べ、進んでいたときだけ転送を始めます。中身は最後まで受け取る側が取りに行きます。
権威サーバを2台構成にしました。2台目に、1台目と同じレコードを手で書き写す必要があるでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
複数台にした瞬間に生まれる問題
第25週『名前からアドレスへ — DNSは巨大な委任の木』で、委任によって権威が組織ごとに分かれることを見ました。その先を1台で受けると、その1台が引けなくなった時点でゾーンの名前がまとめて引けなくなります。だから権威は複数台置かれ、新しい問題が出ます。複数台が同じ中身を持つことを、どう成り立たせるか。
DNS の答えは、ゾーンに版番号を付けてその数だけを比べることです。版番号は SOA の SERIAL に入っています。RFC 1034 §4.3.5 の逐語。
To detect changes, secondaries just check the SERIAL field of the SOA for the zone. In addition to whatever other changes are made, the SERIAL field in the SOA of the zone is always advanced whenever any change is made to the zone.
中身の比較をしていません。 数を1つ比べ、進んでいれば取りに行き、同じなら何もしない。向きも重要で、RFC 9499 §6 が secondary server を定義する動詞は retrieve。転送は受け取る側が始めます。
SOA の中の、比べられる数
実際の SOA に RFC 1035 §3.3.13 の定義順を当てます(macOS、DiG 9.10.6、2026年9月17日)。
jp. 86400 IN SOA z.dns.jp. root.dns.jp. 1789651802 3600 900 1814400 9001 MNAME z.dns.jp. 主たるデータ源2 RNAME root.dns.jp. 責任者のメールボックス3 SERIAL 1789651802 ゾーンの版番号(32ビット)4 REFRESH 3600 この秒数待って SERIAL を確認しに行く5 RETRY 900 確認できなかったときの再試行間隔6 EXPIRE 1814400 この間ずっと確認できなければ破棄7 MINIMUM 900 RFC 1035 ではゾーン内 RR の TTL の下限
数字はすべて秒(RFC 1035 の逐語で "All times are in units of seconds.")。SERIAL だけが版番号です。
同じ日に jp の8台の権威すべてへ直接 SOA を問い合わせると、8台とも 1789651802 を返しました。ただしこれは、転送が落ち着いた瞬間の1観測です。 「常に同じ」とは言えず、ずれる時間帯がありうるからこそ REFRESH・RETRY・EXPIRE があります。
受け取る側は、相手のゾーンが更新されたことを何で判断しますか。
待つ時間を縮める合図
REFRESH が 3600 秒なら、次に SERIAL を確認しに行くのは最大で1時間後です。この待ち時間を縮めるのが NOTIFY(RFC 1996)。取り違えが起きやすいので §3.11 の原文を置きます。
Upon completion of a NOTIFY transaction for QTYPE=SOA, the slave should behave as though the zone given in the QNAME had reached its REFRESH interval (see [RFC1035]), i.e., it should query its masters for the SOA of the zone given in the NOTIFY QNAME, and check the answer to see if the SOA SERIAL has been incremented since the last time the zone was fetched. If so, a zone transfer (either AXFR or IXFR) should be initiated.
受け取った側がするのは「REFRESH 間隔に達したかのように振る舞う」ことです。そのあと自分から SOA を問い合わせ、SERIAL を比べ、転送を始めます。つまり NOTIFY が運ぶのは合図だけで、ゾーンデータは運ばれません。 RFC 1996 §1.2 の言い方も「ポーリングに対する割り込み(an interrupt as opposed to poll model)」であって、配送方式の転換ではありません。
全量か差分か — トランスポートが揃っていない
中身を運ぶ方法は2つ。ゾーン全体の AXFR(RFC 5936)と、変わった部分だけの IXFR(RFC 1995)。AXFR には「どこまでが1つの版か」を判別する規定があります(§2.2)。
In such a series, the first message MUST begin with the SOA resource record of the zone, and the last message MUST conclude with the same SOA resource record. Intermediate messages MUST NOT contain the SOA resource record.
所有者が教育目的での利用を明示的に許可したテスト用ゾーンで実行すると、1行目と最終行が SERIAL まで含めて同一の SOA になることを確かめられます。他人のゾーンに転送を要求してはいけません。許可の確認が先です。
次にトランスポート。2つをまとめると誤ります。
運ぶもの トランスポートの規定AXFR ゾーン全体 UDP 上のセッションは "not defined"(RFC 5936 §4.2)IXFR 変わった分 まず UDP を試すべき(RFC 1995 §2)
AXFR 側の "not defined" は、定義されていないのであって禁止ではありません。規範の出どころは RFC 1034 §4.3.5 の「正確さが不可欠なので、AXFR 要求には TCP か他の信頼できるプロトコルを使わなければならない」。第25週の「UDP と TCP の両方が必須」(RFC 7766 §5)は、ここで効き方が変わり、AXFR にとって TCP は唯一の選択肢になります。 IXFR 側の逐語は「クライアントはまず UDP を使って IXFR クエリを行うべきである」。
「ゾーン転送は TCP で行われる」——AXFR と IXFR をまとめたこの言い方は妥当ですか。
AXFR と IXFR(今回)
AXFR はゾーン全体を送ります。IXFR は要求側が自分の SERIAL を添え、サーバはその版からの差分を返します。ただし RFC 1995 §2 は、サーバが「ゾーン全体を転送することを選んでもよい」とも書きます。
WAL のフルページイメージ(DB編『先に書くログ — 順序を縛ると、書く回数が減る』)
WAL は変更内容のログです。差分だけのように見えますが、公式は「ディスク上の実ページを変更する前に、定期的にフルページイメージを永続 WAL ストレージへ書く」と述べます。
AXFR / IXFR と、WAL の差分レコード / フルページイメージ。全量と差分を両方持つ理由に共通するのは何でしょうか。
「差分を適用する側は、適用の前に何を持っていなければならないか」を両方で考えてください。
- ・矢印はすべて secondary が起こしている。押し込まれる段は1つも無い
- ・EXPIRE の間ずっと確認できなければ、secondary は複製を破棄する(RFC 1034 §4.3.5)
この章のまとめ
- 権威を複数台置くと「同じ中身を保つ」という別の問題が生まれる。その解が SOA の SERIAL の比較で、比べるのは版番号1つ(RFC 1034 §4.3.5)。
- 転送を始めるのは受け取る側。RFC 9499 §6 の secondary の定義の動詞は retrieve。NOTIFY はデータを運ばない——RFC 1996 §3.11 は「REFRESH に達したかのように振る舞え」で、問い合わせも比較も転送の開始も受け取った側が行う。
- AXFR は先頭と末尾を同じ SOA で挟む MUST(RFC 5936 §2.2)。トランスポートは IXFR と揃っておらず、AXFR は UDP 上が "not defined"(禁止ではない)、IXFR は「まず UDP で試すべき」(RFC 1995 §2)。
- anycast はアドレスを1つに保ったまま複数のノードから到達性を広告する仕掛け(RFC 4786)。レコード種別の網羅は既存のクイズ群「DNS(名前解決)」の DNS VI に譲る。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
RFC 5936 が AXFR と UDP の関係について実際に書く表現はどれですか。
用語集(3語)
- primary server / secondary server
- RFC 9499 §6 は secondary server を RFC 1996 §2.1 から引いて「ゾーン転送を使ってゾーンを取得する権威サーバ」と定義。master / slave は参照として残るのみ。
- SOA の SERIAL / REFRESH / RETRY / EXPIRE
- SERIAL は RFC 1035 §3.3.13 の定義で「ゾーンの元の複製の、符号なし32ビットの版番号」、RDATA の3番目。残り3つは秒で、RFC 1034 §4.3.5 によれば REFRESH 秒待って SERIAL を確認し、できなければ RETRY 秒ごとに再試行、EXPIRE の間ずっとできなければ複製を破棄しなければならない。
- anycast
- RFC 4786 (BCP 126) が扱う配り方。サービスを安定した IP アドレスの集合に結び付け、その到達性を複数の独立したノードから広告する。
出典(一次ソース)
- RFC 9499 §6 — ゾーン転送・primary / secondary の定義(BCP 219) ↗
- RFC 5936 §2.2 / §4 — AXFR の SOA 挟み込みの MUST と、トランスポート ↗
- RFC 1995 §2 — IXFR の SERIAL 比較と「まず UDP で試す」 ↗
- RFC 1996 §3.11 — NOTIFY 受信後に受け取った側が行うこと ↗
- RFC 1034 §4.3.5 — SERIAL による変更検出と REFRESH / RETRY / EXPIRE ↗
- RFC 1035 §3.3.13 — SOA RDATA の7フィールド ↗
- RFC 4786 (BCP 126) — anycast サービスの運用 ↗