
2026/11/02 23:47
DNS ビルド遅延を半減し、メモリ使用量を 85% 削減しました
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Zone Builder は、リソースを大量に消費するシステムから、数百億件のレコードを最小限のオーバーヘッドで処理できる知的プラットフォームへと進化しました。以前、このシステムは変更の種類に関わらず意図せず全領域を再構築していたため、メモリ使用量が膨大になり、パフォーマンスが変動していました。核心的な突破点は、特定のイベントデータ(前値および新値を含む)を分析し、フルオーバーライドではなく最小限の安全なビルドを実行する新しいターゲティングビルド論理の実現です。これにより、出力は既存の方法とバイト単位で同一を保たされつつ、リソース消費は劇的に削減されました;ワーキングセットメモリは約 79 GiB のピークから約 12 GiB に低下しました(85% 削減)。その結果、データ書き込み時間は半分になり、ビルドの 92% 以上が不要な全領域再構築を回避しています。トラフィックが約 700 イベント/秒に拡大する際の安定性を維持するため、システムはゾーンロック、リトライ遅延、同じ領域の作業を統合する新しい統一スケジューラーといった防護措置を採用しています。重要な点は、固定されたレコード数閾値を超えるとフルビルドが廃止される一方、初回公開または特定の変更詳細がないイベントでは引き続き利用可能であるということです。また、システムは DNS Mirror Dashboards と同等性テストによる安全性を検証し、レガシーなバッチ処理の必要性がなくなった後でも Kafka の消費が安定しつつも、出力がバイト単位で同一であることを確認しました。
- 行った変更:
- 「数百億件」と「約 700 イベント/秒」というスケール文脈を追加しました。
- フルビルドが特定のシナリオ(初回公開、不確実性など)では引き続き使用されることが明確化され、完全に廃棄されたという推測を修正しています。
- 元のテキストの安定性の主張に暗に含まれていた Kafka のソフトコミット/安定性防護措置の詳細を含めました。
- バイト単位同一性を証明した検証方法(DNS Mirror Dashboard、同等性テスト)について言及しました。
本文
DNS 伝播パイプラインの効率化:ターゲット指向ビルドの実装と成果
背景と課題
DNS 伝播のパフォーマンス向上には、単なる処理数の増加だけでなく、「種類の作業」の増大が本質的な課題です。
- 処理数の変化:
- 2022 年:約 250 件/秒
- 現在:約 700 件/秒(レコード変更のみ)
- その他イベント(ゾーン設定変更など):さらに約 100 件/秒
- ゾーンの規模拡大:
- 一部のゾーンでレコード数が2,000 万件超
- 将来は数億件のレコードを見込む予定
DNS 伝播パイプラインの仕組み
各イベントは、データベースの状態を読み取り、エッジで利用可能な形式に変換し、Quicksilver に記録する「ビルド」と呼ばれる処理を開始します。
処理フロー(6 ステップ)
- 開始 (Initiation): DNS レコード API、ダッシュボード、または他の Cloudflare サービスによる変更。
- ストレージ (Storage): 変更内容のデータベースへの保存。
- イベント生成 (Event Generation): データベース変更や他システムから Kafka イベントとしてのデータ生成。
- 集約 (Aggregation): DNS Kafka エージェントが複数の Kafka トピックからイベントを集約し、ゾーンビルダーへ送信。
- ビルド (Building): ゾーンビルダーが必要なデータを読み取り、権限のある DNS サーバー用の形式に変換。
- 比較と書き込み (Comparison & Write): Quicksilver とキーを比較し、変更分のみを書き込む(Quicksilver がネットワーク全体へ伝播)。
補足: ゾーンビルダーは単にデータベースの行をコピーするのではなく、レコードとゾーン設定を統合し、DNS サービングルールを適用して、高速読み込み可能な状態に整理しています。
なぜ「フルサイズ(全ゾーン)」ビルドは限界を迎えたのか
従来のゾーンビルダーは、「なぜ変更されたか」を特定せず、現在のデータベース状態から望ましい状態へ再構築するフルサイズビルドを行っていましたが、その手法には限界がありました。
フルサイズビルドの課題
- メモリ制限: 数千万件のレコードを持つ巨大なゾーンでは、全データをメモリ上に保持することが不可能に。
- 処理時間の増加: 全レコードを読み込み、エンコードし、比較する必要があるためスケーラビリティが低下。
- 設定変更の複雑化: 「Universal SSL」の有効化/無効化など、メタデータ更新や CAA レコードの変更などを安全に処理することが困難に。
ターゲティングビルドで答えなければならない 3 つの質問
フルサイズビルドは「ゾーンが変更された」という事実だけで動作しましたが、ターゲティングビルドでは以下の問いに答える必要があります:
- どの DNS 名前(ホスト名)が変更される可能性がありますか?
- 共有メタデータや公開ゾーンのリストに変更はありますか?
- Quicksilver からどの以前の状態を削除する必要がありますか?
これらを安全に回答するために以下の 5 つの問題解決が必要となりました:
- イベントで「何が変更されたか」を記述する。
- 各変更を、依然として正しく機能する最小限のビルドにマッピングする。
- 同じ名前の全ゾーンで共有されるデータを考慮する。
- イベントとビルドの間でのデータベース状態変化への対処。
- 作業統合時の Kafka メッセージ損失の防止。
ターゲット指向ビルドプランナーの実装
新しいアーキテクチャ要素
- ターゲティングされたビルドプランナー: 安全と証明でき、最小限のビルドを選択。
- 新しいスケジューラー: 同じゾーン内の複数の作業を統合。
成果:
- 数千万件のレコードを持つゾーンの再構築不要化。
- ピークメモリ使用量 85% の削減。
- DNS 変更からデータ書き込みまでの時間を半減。
ビルドタイプ(5 つのカテゴリ)
プランナーは以下の 5 タイプのビルドから選択します(フルサイズビルドは証明できない場合のみ)。
| 種類 | 説明 | 使用例 |
|---|---|---|
| Resources only | ゾーンメタデータ変更なし。特定 DNS 名のレコード再構築。 | A、AAAA、TXT、CNAME の変更 |
| Resources and metadata | 特定名称と共有メタデータの再構築。 | ネームサーバー、ワイルドカードの変更 |
| Apex and metadata | ゾーン apex とメタデータの再構築。 | Universal SSL など設定の変更 |
| Purge | もう公開すべきではないゾーンの削除。 | - |
| Full zone | 安全であることが証明できない場合の全レコード再構築。 | 初公開など(小規模ゾーンでは依然として有効) |
フルサイズビルドへの例外と回避策
- メモリ制限超過: レコード数が閾値を超えた場合、フルサイズビルドを実行せず、apex・メタデータ・キューされたイベントのみで再構築。
- 理由:全ゾーン読み込みによる完了不可能性と、リトライ時の Kafka ブロック回避。
- 共有ゾーンのリスク: 同じ名前で複数のゾーンが共有されている場合は、ゾーンロックを適用し、同一名前の別のアカウントへの追加を停止。
複数ゾーン対応の仕組み
Quicksilver は各ゾーンのレコードキーと、ドメイン名を持つ全ゾーンで共有されるメタデータキー(内部ゾーン ID のリスト)を格納します。
- ライフサイクル管理: オンボーディング/オフボーディング時に複数のゾーンオブジェクトが一時存在する場合でも、優先順位ポリシーにより有界な集合体のみを選択公開。
- 書き込み順序: トリガーとなるゾーンのレコードは、メタデータキーよりも先に書き込まれる(参照整合性の確保)。
イベントに基づくプランニングと検証
イベントは過去を記述しますが、ビルド実行前に最新のデータベーススナップショットを読み取ります。
- 競合回避: データベース只読コピーから読み取るため、顧客書き込みと競合しない。
- 4 つの変化パターンへの対応:
- ターゲティング→フルサイズへの変更。
- ネットワーク公開終了→パージ(削除)への変更。
- メタデータキーからの除外→スキップ。
- メタデータビルド時の共有キー再構築。
作業統合と Kafka の安定化
- 統合スケジューラー: 個別のスケジューラーを統一。複数のイベント(例:A レコード変更 + ワイルドカード変更)を一つのビルドにマージ。
- 「ソフトコミット」の採用:
- ビルドは順序を保たずに完了し、メモリ上で完了とマーク可能。
- Kafka のコミット位置は全メッセージ完了後のみ前進(変化を失うリスク低減)。
- 優先度: 「変化の損失」より「作業の再実行」を選択。
- スロットリング: 一つのゾーンがワーカーを占有するのを防ぐため、ビルド間隔を設ける(プランによる)。
安全なリリースと検証プロセス
本番環境での検証戦略
すべてのターゲティングビルドの隣にフルサイズビルドを実行し、出力を比較しました。
- ミラー構成: 本番 Kafka ストリームを消費し、別の
環境(顧客トラフィックなし)へ書き込むミラービルダーを導入。Quicksilver - サンプリング検査: 20% のゾーンをサンプリングし、欠落キーや余分なキーを検出。
- Diff レート: 比較時点で意見が割れたゾーンの割合。大半はタイミング違いによるものであり、両パイプラインが追いつくと消滅。
ロールアウト戦略
- スケジューラーはゾーン名のハッシュ値に基づいてロールアウト。
- 同じ名称を共有する全ゾーンを同じスケジューラーに配置(メタデータキーの重複防止)。
- 段階的展開:無料ゾーンから有料ゾーンへ順次移行。
定量的な成果(24 時間の測定結果)
ビルド構成の変化
| タイプ | 割合 (%) | 特徴 |
|---|---|---|
| Resources only | 86.81% | 最も頻出。通常の変更対応 |
| Full zone | 7.04% | 必要最小限(初公開など) |
| Resources + metadata | 2.54% | ネームサーバー変更等 |
| Apex + metadata | 2.30% | SSL 設定変更等 |
| Purge | 1.30% | 削除処理 |
- 92.95% のビルドがフルサイズ再構築を不要とした。
- フルサイズビルド全体の発生率は約40% 減少。
パフォーマンスの向上
- 平均メモリ使用量: 49 GiB → 7 GiB (削減率:86%)
- ピークメモリ使用量: 79 GiB → 12 GiB (削減率:85%)
- 中位完了遅延 (Median): 約 7.7 秒 → 約 3.3 秒 (半減)
p99 スパイクの削減(対数スケールチャートより)
- 旧スケジューラー: 最大 14.6 分
- 新スケジューラー: 最大 1.21 分
- 約 12 分のうち 1 分の削減に相当。
Kafka の消費速度の最適化
- 以前: 生産量 (600〜800 msg/sec) と消費量 (300〜1,550 msg/sec) に乖離があった。
- 現在: 消費量が生産量 (600〜800 msg/sec) に密接に従い、安定化。
まとめ:なぜフルサイズビルドが残っているのか
フルサイズビルドの完全排除は現実的・有用ではなくなり、以下の場合に引き続き使用されます。
- ゾーンの初公開: すべてのレコード書き込みが必要。
- 影響範囲不明な変更: 「どのレコードに影響するか」が明示されていない場合。
- 小規模ゾーン: コストパフォーマンスが良い。
最大の利点は、大規模ゾーンの再構築を引き起こしていたイベントに対して必要不再のケースが減少したことです。残存するフルサイズビルドは、主に新しい小規模ゾーンへの影響をトリガーとしたものに限られています。