NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

ネットワーク初学者が知っておきたいDNSの基礎知識:負荷分散の仕組み

サムネイル

はじめに

こんにちは、新入社員の小筆です。

私は入社した当初、ネットワークについての知識をほとんど持っていませんでした。
しかし業務でAWSを操作する機会があり、サービスの使い方を学ぶ以前にネットワークの根本的な仕組みを理解する必要があると感じました。 ネットワークの基礎を勉強していく中で、特に興味を持ったのがDNSでした。
そこで自分が疑問に思ったこと、その答えとなるDNSの仕組みについてまとめることにしました。

DNSはどうやって膨大なトラフィックを処理しているのか

インターネット上のあらゆる機器やサービスにはIPアドレスが割り当てられています。 IPアドレスは数字の羅列で表現されるため、私たち人間にとっては覚えにくく、扱いにくいものです。 そこで人が理解しやすいように、IPアドレスの代わりとして文字列で表現されるドメイン名が使用されています。

DNS(Domain Name System)は、このドメイン名を対応するIPアドレスに変換する役割を担っています。 これによりユーザーはIPアドレスを直接覚えることなく、ドメイン名を入力するだけで目的のWebサイトへアクセスできるようになります。 しかし、インターネット上には膨大な数のドメイン名とIPアドレスが存在します。

ではDNSでは日々の膨大なトラフィックをどのようにして処理しているのだろうか と疑問に思いました。

DNSにおける階層構造とは

調べてみると、DNSでは1つのDNSサーバですべてのドメイン名とIPアドレスの対応表を管理しているわけではないということがわかりました。 実際には、DNSはドメイン名をドット(.)で分割した文字列(ラベル)ごとに管理をする階層構造を取ることで、効率的な管理を実現しています。 この「ラベル」という用語は、DNSの公式仕様であるRFC 1034で定義されています。
例えばwww.example.comというドメイン名は、以下のように分割されます。

ドメイン分割

  • com:トップレベルドメイン
  • example:セカンドレベルドメイン
  • www:サードレベルドメイン

次に、それぞれのラベルに対応する情報を管理するサーバが存在し、情報の管理をトップレベルドメインから下位のサーバへ順に委任していく仕組みがあります。 DNSは以下のような階層構造でドメインを管理しています。

1. ルートDNSサーバ

ルートDNSサーバ

階層構造の最上位に位置するサーバで、jpcomなどのトップレベルドメインを管理するDNSサーバがインターネット上のどこにあるのかを管理します。
ルートDNSサーバではドメイン名とIPアドレスの対応表は管理していません。

2. トップレベルドメイン(TLD)DNSサーバ

TLDDNSサーバー

jpcomなどのトップレベルドメインを管理するDNSサーバです。
example.comsample.comなどのDNSサーバがインターネット上のどこにあるのかを管理します。
ルートDNSサーバ同様、このサーバではドメイン名とIPアドレスの対応表は管理していません。

3. セカンドレベルドメインDNSサーバ

2LDDNSサーバ

examplesampleなどのセカンドレベルドメインを管理するDNSサーバです。
www.example.comの場合、このセカンドレベルドメインDNSサーバがIPアドレスの対応表を持っています。
またドメイン名がさらに続く場合は、その情報を持つDNSサーバがインターネット上のどこにあるのかを管理します。

DNSの名前解決の流れ

DNSは階層構造を持つことで、ドメイン名とIPアドレスの対応を分割して管理していることが分かりました。
ではどのように、管理を分散させた状態で名前解決が行われているのでしょうか。
例として、PCでブラウザにwww.example.comと入力してWebサイトを開こうとするとき、以下のようなステップで名前解決が行われます。

名前解決の流れ

  1. キャッシュDNSサーバに問い合わせ
    キャッシュDNSサーバは、利用者からの名前解決の問い合わせ窓口の役割を担っています。 キャッシュDNSサーバがドメイン名を管理するDNSサーバへ問い合わせをし、結果を利用者に返答します。 問い合わせの結果は一定期間キャッシュDNSサーバ内に保存され、保存期間内に同じ問い合わせが来た際には再度問い合わせをせずに、自身のキャッシュの中に保存されている情報を利用者へ返します。
    例えば、PCからキャッシュDNSサーバに対してwww.example.comのIPアドレスについて問い合わせをしたとします。
    キャッシュDNSサーバは、自身のキャッシュ内のwww.example.comに対応するIPアドレスが保持されているかを確認します。 キャッシュDNSサーバ内にIPアドレスが見つかった場合、名前解決はここで終了です。
    IPアドレスがなかった場合、次の工程へ進みます。

  2. ルートDNSサーバに問い合わせ
    キャッシュDNSサーバは、ルートDNSサーバに対してwww.example.comのIPアドレスについて問い合わせをします。
    すると、ルートDNSサーバが「.comの情報はこのトップレベルドメインDNSサーバに聞いて!」と返します。

  3. トップレベルドメインDNSサーバに問い合わせ
    キャッシュDNSサーバは、ルートDNSサーバが教えてくれたトップレベルドメインDNSサーバに対してwww.example.comのIPアドレスについて問い合わせをします。
    すると、トップレベルドメインDNSサーバが「example.comの情報なら、このDNSサーバに聞いて!」と返します。

  4. セカンドレベルドメインDNSサーバに問い合わせ
    キャッシュDNSサーバは、トップレベルドメインDNSサーバが教えてくれたセカンドレベルドメインDNSサーバにwww.example.comのIPアドレスについて問い合わせをします。
    すると、セカンドレベルドメインDNSサーバが「www.example.comのIPアドレスは93.184.215.14だよ」と、目的のwww.example.comに対応するIPアドレスを返します。

  5. ブラウザがIPアドレスに接続
    キャッシュDNSサーバは一連の問い合わせによって取得したIPアドレスをPCへ返します。
    そしてPCのブラウザでIPアドレス(93.184.215.14)を使って目的のサーバに接続し、www.example.comの内容を取得・表示します。

このようなステップを踏んだうえで、私たちはブラウザにドメイン名を入力することで目的のWebサイトまでたどり着くことができているということが分かりました。

しかしこの階層構造で行われる名前解決を見ると、 ルートDNSサーバへ高負荷がかかるのではないか? と疑問に思いました。 名前解決の流れに記述した通り、キャッシュDNSサーバにキャッシュが残っていなかった場合、常にルートDNSサーバへ問い合わせするようになっています。 この高負荷の対策をルートDNSサーバはどのように対処しているのでしょうか。

ルートDNSサーバの負荷分散

ルートDNSサーバにおける負荷分散について調査してみると、以下のことが分かりました。

  1. 13のクラスタ構造
    ルートDNSサーバは、A~Mまでの13のサーバクラスタとして構成されています。 クラスタ構成とは、複数のサーバを1台のシステムとして動作させる仕組みのことで、これにより負荷分散と障害耐性を実現しています。
    また、DNSが名前解決に使用する通信プロトコルであるUDPの応答パケットにはサイズ制限があり、この制約に対応するため13という数に設計されています。
    さらに、各クラスタは物理的に冗長化されており、世界中に約550台以上のサーバが分散配置されています。
    この冗長化により、特定のサーバにアクセスが集中することを防いでいます。
    ルートDNSサーバの具体的な配置場所は、root-servers で確認できます。
    このサイトを見ると、日本にあるルートDNSサーバは東京に13台、大阪に5台、福岡に1台あることがわかります(2024年12月現在)。

  2. IP anycastによるルーティング
    DNSではIP anycastというネットワーク技術を利用し、問い合わせを地理的に最も近いルートDNSサーバに振り分けます。 その結果、ルートDNSサーバへの問い合わせを複数のルートDNSサーバへ分散させ、負荷分散を行います。

これらの方法によって、ルートDNSサーバへの問い合わせに対し効率的な負荷分散を実現しています。

まとめ

今回はDNSの仕組みと負荷分散手法についてまとめてみました。
ドメイン名の階層構造による分散管理や、サーバを物理的に分散配置することで膨大なトラフィックの処理を実現できていることがわかりました。
今後もインターネットの基礎知識などをインプットし、業務に活かしていきたいと思います。
以上、長くなってしまいましたが最後まで読んでいただきありがとうございました。

執筆者:小筆赳
Webアプリケーションエンジニア