DNSラウンドロビンとは、1つのドメイン名に対して複数のIPアドレスをDNSに登録し、それらを返す順序や見え方を変えることで、アクセス先を分散させる仕組みです。
たとえば example.com に対して、次のように複数のIPアドレスを登録するとします。
この状態でユーザーが example.com にアクセスすると、DNSはこれら複数のIPアドレスを返します。
その結果、利用者ごとに接続先サーバーが分かれやすくなり、負荷をある程度分散できます。
ここで重要なのは、DNSラウンドロビンは通信そのものを制御する仕組みではないという点です。
DNSが行うのはあくまで「この名前には複数の接続先があります」と返すところまでであり、実際にどのIPアドレスへ接続するかは、クライアント側や再帰DNSサーバーの挙動、キャッシュの影響も受けます。
DNSは、ドメイン名をIPアドレスに変換する仕組みです。
たとえば、ユーザーがブラウザでwww.example.comにアクセスすると、最初にDNSへ問い合わせが行われます。
そこでwww.example.com = 192.0.2.10のような情報を受け取り、そのIPアドレスのサーバーへ接続します。
DNSラウンドロビンでは、この返答が1つではなく複数になります。
たとえば、www.example.com = 192.0.2.10, 192.0.2.11, 192.0.2.12のような形です。
DNSサーバーやサービスによっては、これらの返却順を変えることで、結果的にアクセス先が偏りすぎないようにします。
“ラウンドロビン”という言葉から、「1回目はA、2回目はB、3回目はC……と厳密に順番に割り振られる」という印象を持ちやすいですが、実際にはそこまで単純ではありません。
概念としては、
という理解が正確です。
つまり、“完全に均等な順番制御”というより、“DNS応答を使った簡易的な分散”と考えるのが適切です。
たとえば、shop.example.com というECサイトを3台のWebサーバーで運用しているとします。
DNSには、同じホスト名に対して複数のAレコードを設定します。
shop.example.com A 203.0.113.1shop.example.com A 203.0.113.2shop.example.com A 203.0.113.3すると、shop.example.com を名前解決したときに、複数のIPアドレスが返されます。
そのため、あるユーザーはAへ、別のユーザーはBへ、さらに別のユーザーはCへ接続する可能性が高くなります。
ただし、これはロードバランサーのように中央で厳密制御しているわけではありません。
「複数の候補先を返すことで分散を狙う」のがDNSラウンドロビンです。
DNSラウンドロビンが使われる主な目的は、次の3つです。
アクセスを複数サーバーへ分散させて、1台だけに負荷が集中するのを防ぎます。
接続先を複数持たせることで、単一障害点を減らしやすくなります。
ただし、ここは誤解しやすい部分です。
DNSラウンドロビンだけで信頼できるフェイルオーバーが実現するわけではありません。
障害が起きたサーバーのIPアドレスがDNSに残っていれば、そのIPを受け取ったユーザーは接続に失敗します。
専用のロードバランサーを置かなくても、DNS設定だけで比較的簡単に複数サーバー構成を作れます。
DNSレコードを複数設定するだけで始められるため、構成が比較的シンプルです。
専用のロードバランサーや高度な分散装置がなくても、最低限の分散を実現できます。
小規模サイトや静的コンテンツ中心の構成では、シンプルで十分実用になることがあります。
複数拠点のサーバーを同一ドメイン配下にぶら下げる構成の第一歩として使われることもあります。
DNSラウンドロビンは便利ですが、本格的なロードバランサーの代替と考えると不十分です。
DNSは複数のIPアドレスを返すだけで、実際の接続数やCPU負荷、レスポンス状況を見ながら制御するわけではありません。
そのため、次のような要因で偏りが生じます。
このため、理想的に1/3ずつ均等配分されるとは限りません。
単純なDNSラウンドロビンでは、サーバーが落ちてもそのIPアドレスが引き続き返されることがあります。
その場合、そのIPを使ったユーザーは接続に失敗します。
つまり、複数IPを持っていること自体は冗長化の土台になりますが、死活監視付きのロードバランサーのような動きはしません。
DNSの応答はキャッシュされます。
たとえばTTLが300秒なら、その間は同じ応答が使われ続ける場合があります。
そのため、
といった問題が起こります。
ログイン情報やセッション情報、アップロードファイルなどを各サーバーのローカルだけで管理していると、アクセス先が変わったときに不整合が起きやすくなります。
ただし、これも正確に言うと、毎回必ず別サーバーに飛ぶわけではありません。
既存接続の再利用やDNSキャッシュの影響で、同じサーバーにしばらく接続し続けることもあります。
それでも、新しい接続や新しい名前解決のたびに別サーバーへ行く可能性はあるため、サーバー内だけに状態を持つ設計とは相性が悪いと考えるのが実務的です。
DNSラウンドロビンとロードバランサーは、似ているようで役割がかなり違います。
つまり、DNSラウンドロビンは「名前解決レベルで行う簡易的な分散」、ロードバランサーは「通信経路上で行う本格的な分散制御」です。
必ずしもそうではありません。
実際の配分はDNSキャッシュやクライアントの挙動に強く影響されます。
単純なDNSラウンドロビンだけでは不十分です。
障害ノードを自動で外せるわけではないからです。
これも正確ではありません。
同じ名前解決結果や同じ接続が使われることもあるため、毎回必ず切り替わるわけではありません。
DNSラウンドロビンが向いているのは、たとえば次のようなケースです。
逆に、次のようなケースでは単独利用は不向きです。
実際の運用では、DNSラウンドロビン単体より、次のような構成が一般的です。
DNSでは大まかに行き先を分け、各拠点や各クラスタの内部ではロードバランサーで細かく分散します。
DNSサービス側でヘルスチェックを行い、障害がある宛先は返さないようにする構成です。
これは単純なDNSラウンドロビンより、かなり実用性が高いです。
大規模環境では、単なる複数Aレコードではなく、CDNやグローバルロードバランシングを使って地域や状況に応じた制御を行うことが多くなります。
TTLは、そのDNS情報をどれだけ長くキャッシュしてよいかを示す値です。
TTLが短いと、
一方で、
という面もあります。
そのため、DNSラウンドロビンではTTL設計が重要になります。
ただし、TTLを短くしただけで障害対策が完成するわけではありません。
DNSラウンドロビンとは、1つのドメイン名に複数のIPアドレスを設定し、その返し方を工夫することでアクセスを分散させる仕組みです。
ポイントを整理すると、次のようになります。
つまりDNSラウンドロビンは、「簡易的な分散手法としては有効だが、本格的なロードバランシングやフェイルオーバーの代替ではない」という理解が最も正確です。
以上、DNSラウンドロビンについてでした。
最後までお読みいただき、ありがとうございました。