【総集編】大規模DNSインフラに関して検討/考察する
ISPや超大企業、CloudFlareやAkamaiなどのCDNプロバイダなどの持つ大規模DNSインフラではDNSは高信頼性、耐障害性、高可用性が求められます。そのため1台のDNSサーバではなく、複数のDNSサーバやロードバランサーなどを組み合わせてDNSインフラを構築するのが一般的となります。今回は大学や超大企業のDNSインフラとISPやCDNプロバイダのDNSインフラをそれぞれ構成を検討し考察を行います。
DNSの冗長化/信頼性を支える仕組み
エニーキャストDNS
エニーキャストDNSはPublic DNSを支える仕組みの1つで1つのIPアドレスを複数のサーバに適用することで、複数のサーバのうち最も地理的に近いサーバがDNSレスポンスを提供する仕組みのことです。 エニーキャスト自体は複数の異なる物理的な場所に存在するサーバー群に、同じ単一のIPアドレスを割り当てるルーティングのテクノロジでエニーキャストDNSはそれをDNSに応用したものとなります。
この仕組みによりレイテンシの減少、DNS解決サービスの稼働時間の増加、DNSフラッドDDos攻撃に対する耐性を望むことができます。
HAクラスタ
HAクラスタはサーバを複数台用意して冗長化し、障害が発生してもシステムの停止時間を最小限に抑え、業務の可用性を向上させるシステム構成のこと。
この構成ではアプリケーションが起動しているサーバーで障害が発生した場合、アプリケーションを他のサーバに引き継がせることで、継続的にサービスを運用することができます。
構成方法
Active-Standby構成
この構成ではサーバを2台以上用意し、通常時は1台のサーバ(Active)がすべてのサービスを処理し、もう1台(Standby)は待機状態となります。Activeサーバに障害が発生すると、Standbyサーバが処理を引き継ぎを行いサービスを提供します。

- 特徴- シンプル: 構成が比較的単純で管理しやすい
- 高可用性: Activeサーバーの障害時にサービスが停止する時間を最小限に抑えられる
- リソースの無駄の発生: Standbyサーバーは通常、待機しているだけでリソースが活用されない
 
この構成はデータベースサーバやファイルサーバなど、状態を共有する必要があるサービスや、フェイルオーバー時のデータ整合性が重要なシステムに適しています。
Active-Active構成
この構成では2台以上のサーバが、通常時から並行してサービスを処理します。いずれかのサーバに障害が発生しても、残りのサーバが処理を引き継ぎ、サービスを継続します。

- 特徴- リソースの有効活用: すべてのサーバーが稼働しているため、ハードウェアリソースを最大限に活用可能
- スケーラビリティ: トラフィックの増加に応じてサーバーを追加することで、パフォーマンスを向上できる
- 複雑な構成: セッション情報やデータを共有するための仕組み(共有ストレージなど)が必要となり、構成が複雑になる傾向がある
 
この構成はステートレスなWebサーバーやAPIサーバーなど、個々のリクエストが独立しているサービスに適しています。ロードバランサーと組み合わせて使用するのが一般的となります。
データの共有方法
共有ストレージ
共有ストレージはHAクラスタを構築するサーバから物理的に接続された共有ディスクにデータを格納することで、フェールオーバ後も同一データにアクセスできるようにする方式です。主にActive-Standby構成で使用されます。そのため、一方のサーバが共有ストレージの特定領域を利用している場合、もう片方からはアクセスできない特徴があります。

ミラーストレージ(レプリケーション)
レプリケーションとはデータを複数のサーバに複製する構成です。主にActive-Active構成で使用されます。
DNSの場合はマスタースレーブ構成と呼ばれるマスターデータ(元の情報を持つ)サーバとスレーブデータ(元の情報のコピーを持つ)サーバの役割に分ける構成で構築されます。
このときDNSサーバはマスターサーバ、スレーブサーバという関係となり、スレーブサーバはDNSゾーン転送という仕組みでマスターサーバからゾーン情報を受け取り保存します。

ロードバランサ
ロードバランサは複数のサーバにアクセスを振り分けることができる仕組みのことです。 多数のアクセスをうまく分散させて1つのサーバに集中しないようにするためのものと考えることができます。
主にロードバランサの仕組みは以下の2つがあります。
- ラウンドロビン型- 複数のサーバにクライアントからのリクエストをすべてのサーバで均等に分けて送ることで負荷分散を図るもの
 
- リーストコネクション型- 複数のサーバの中で現在のアクセスが少ないサーバにリクエストを転送するもの
 
大規模DNSインフラの構成管理
ISPやCDNプロバイダでは大規模なDNSインフラが構築されています。これらのDNS環境では複数のDNSサーバが立ちあがっており、様々なDNSソフトウェアや冗長化/信頼性を高める技術により構築されます。
大規模DNSインフラではデータベースバックエンドとマスタ/スレーブ構成がDNS管理に採択されているため、それぞれの仕組みに関して紹介します。
データベースバックエンド
この構成ではPowerDNSなどのゾーン情報をデータベースから読み込むソフトウェアの使用が前提となります。 仕組みとしては複数のDNSサーバが同じデータベースを参照し、ゾーン情報の一元管理を行います。管理者がデータベースのレコードを更新すると、その変更はすべてのDNSサーバに即座に反映される形となります。

- 特徴- サーバの増設がサービス停止することなく行える
- ゾーン転送のように待ち時間が発生せずリアルタイムで変更される
- ゾーン情報の追加/変更はデータベース操作のみで行える
 
マスタ/スレーブ構成
このDNS管理方法は昔からある方法で、1台のDNSサーバーをマスタとして設定し、ゾーンの正となる情報を保持させます。他のDNSサーバーはスレーブとして、マスターから定期的にゾーン情報をコピーします。ゾーン転送には、手動での実行や、NOTIFYという通知機能を使う方法があります。

- 特徴- スレーブサーバに複数のDNSサーバソフトウェアを使用して安全性の向上を図ることができる
- 各サーバーが独立したゾーンファイルのコピーを持つため、マスターサーバーがダウンしてもスレーブサーバーがサービスを継続できる
- データベースを使わないため構成が比較的シンプル
 
大規模DNSインフラの環境を考察する
ISPなどの大規模DNSインフラでは上記で紹介した技術が多数使われています。
具体的にはマスタ/スレーブ構成とロードバランサを組み合わせて多数のDNSサーバを構築して運用しているケースは多いです。例えば、以下の構成ではスレーブDNSサーバは複数の種類のDNSサーバで構築し、安定性の向上を図っています。

この構成ではDNSサーバが攻撃を受けて1つのサーバがダウンしても、他の種類のサーバがその攻撃に対して耐性を持っていれば、全種類のサーバがダウンすることはないため、非常に堅牢な構成と言えます。
また、CloudFlareなどのCDNプロバイダやGoogleの8.8.8.8などはKubernetesと相性がいいCoreDNSなどを用いて、サーバの負荷に応じて自動でDNSサーバが増減するような構成にしているとも推測できます。これはKubernetesのHorizontal Pod Autoscaler(HPA)機能と連携することで、CPU使用率やQPSに基づいてDNSサーバのコンテナ数を自動的に増減させることができるためです。この仕組みによりDNSサーバは負荷に応じてスケーリングし、リソースを効率的に利用することができます。
総括
ある程度の企業/組織DNSインフラになるとDNS権威サーバ/DNSキャッシュサーバの冗長化は必須となります。
また、サーバを冗長化する際はサーバをデプロイする物理アプライアンスを別にする構成、もしくは2台以上の物理アプライアンスで構築した仮想化基盤上で片方の物理アプライアンスが落ちても、片方でサービスを提供し続けられる構成が重要となります。
ここで紹介した冗長化/信頼性を支える技術はDNSだけではなく、Webサーバやデータベースサーバなどにも使用されており、現在のサーバインフラには無くてはならない技術となっています。
サーバを設計する際は、機能要件だけではなく非機能要件(システム品質や制約)も洗い出し、可用性/信頼性なども考慮した設計をすることが重要です。