DNSのラウンドロビンとは、1つのホスト名に対して複数のIPアドレスを設定し、アクセス先候補を複数持たせることで、通信先を分散させる仕組みです。
たとえば、www.example.com に対して次のように複数の A レコードを設定します。
www.example.com. 300 IN A 203.0.113.10
www.example.com. 300 IN A 203.0.113.11
www.example.com. 300 IN A 203.0.113.12
このように設定すると、www.example.com を名前解決したときに、DNSは複数のIPアドレスを応答として返します。
そして、その応答の並び順や、実際にどのIPアドレスへ接続するかは、DNSサーバーだけでなく、再帰DNSサーバー、OS、ブラウザ、クライアントの実装などの影響も受けます。
つまり、DNSラウンドロビンは、専用のロードバランサーのように通信を直接制御する仕組みではなく、DNSレベルで複数の接続先候補を提示する方式です。
通常、1つのホスト名には1つのIPアドレスを対応させます。
一方、DNSラウンドロビンでは、同じホスト名に複数のIPアドレスを登録します。
たとえば、次のような構成です。
203.0.113.10203.0.113.11203.0.113.12これらをすべて www.example.com に紐づけておくことで、利用者は同じURLにアクセスしていても、結果として異なるサーバーへ接続される可能性があります。
ここで重要なのは、DNSラウンドロビンは「問い合わせのたびに必ず1つだけIPアドレスを順番に返す仕組み」とは限らないことです。
実際には、複数のIPアドレスがまとめて返されることも多く、その中からどれに接続されるかは利用環境によって変わります。
設定方法はシンプルで、同じホスト名に対して複数の A レコード、または AAAA レコードを登録します。
www.example.com. 300 IN A 203.0.113.10
www.example.com. 300 IN A 203.0.113.11
www.example.com. 300 IN A 203.0.113.12
www.example.com. 300 IN AAAA 2001:db8::10
www.example.com. 300 IN AAAA 2001:db8::11
多くのDNSサービスでは、管理画面から同じホスト名に対して複数レコードを追加するだけで構成できます。
DNSの設定だけで、複数サーバーへの分散構成を作れます。
専用のロードバランサーを用意しなくても始められるため、導入のハードルは比較的低めです。
高機能なロードバランサーやマネージドLBサービスを使わずに、複数台構成の入口を作れるため、小規模サイトや簡易的な冗長化には向いています。
構成がほぼ同じWebサーバーを複数台並べて、アクセスを分散させたい場合には使いやすい方法です。
DNSラウンドロビンは便利ですが、本格的な負荷分散や高可用性を実現する仕組みとしては限界があります。
DNSラウンドロビンは、あくまで複数の接続先候補を返すだけです。
その後の接続先は、DNSキャッシュ、クライアントの実装、接続再利用などの影響を受けるため、実際のアクセスがきれいに均等分散される保証はありません。
そのため、「3台あるから必ず3等分される」とは考えないほうが安全です。
単純なDNSラウンドロビンでは、あるサーバーが停止していても、そのIPアドレスがDNSに残っている限り、利用者にそのIPが返される可能性があります。
その結果、一部のユーザーは障害サーバーへ接続しようとして失敗します。
つまり、単なる複数Aレコードの設定だけでは、ヘルスチェック付きロードバランサーのような自動フェイルオーバーは期待できません。
DNS応答はキャッシュされるため、設定変更や障害時の切り替えが即座に全利用者へ反映されるとは限りません。
TTLを短くすれば反映しやすくはなりますが、実際には
などにより、想定より切り替えが遅れることがあります。
ログイン状態、買い物かご、アプリケーションセッションなどをサーバーごとにローカル保持している場合、アクセスのたびに別サーバーへ行くことで不整合が起こる可能性があります。
そのため、DNSラウンドロビンを使う場合は、次のような対策が必要になることがあります。
DNSラウンドロビンは、各サーバーのCPU使用率、応答速度、同時接続数などを見てリアルタイムに振り分ける仕組みではありません。
そのため、高性能サーバーと低性能サーバーを混在させた場合でも、単純な複数レコード設定だけでは適切な配分はできません。
TTLは、DNS応答をどれくらいの時間キャッシュしてよいかを示す値です。
www.example.com. 60 IN A 203.0.113.10
www.example.com. 60 IN A 203.0.113.11
TTLを短くすると、DNS変更の反映や障害時の切り替えを早めやすくなります。
ただし、TTLを短くしたからといって、すべての利用者がその秒数どおりに切り替わるわけではありません。
一般的には、次のような考え方をすることが多いです。
ただし、短すぎるTTLはDNS問い合わせ数を増やすため、運用方針とのバランスが必要です。
DNSラウンドロビンとロードバランサーは似ているようで役割が違います。
つまり、DNSラウンドロビンはロードバランサーの完全な代替ではなく、あくまで簡易的な分散方式です。
DNSラウンドロビンが向いているのは、次のようなケースです。
次のようなケースでは、DNSラウンドロビン単体は不向きです。
実務では、DNSラウンドロビンは単体で完結させるよりも、次のような仕組みと組み合わせることが多いです。
つまり、DNSラウンドロビンは分散構成の入口としては有効ですが、高可用性や高度な負荷分散を実現するための完成形ではありません。
必ずしもそうではありません。
実際の分散結果は、DNSキャッシュやクライアント実装に大きく左右されます。
単純な複数Aレコード設定だけでは、自動的に障害サーバーが除外されるとは限りません。
同じではありません。
DNSラウンドロビンはDNSレベルの簡易分散であり、通信制御そのものを行うロードバランサーとは役割が異なります。
TTLを短くすることで切り替えしやすくはなりますが、即時反映が保証されるわけではありません。
DNSラウンドロビンとは、1つのホスト名に複数のIPアドレスを設定し、DNS応答で複数の接続先候補を返すことで、アクセスを分散させる仕組みです。
メリットは、
という点です。
一方で、
という制約があります。
そのため、DNSラウンドロビンは「手軽な分散方式」ではあるが、「本格的なロードバランシング機構そのものではない」と理解するのが最も正確です。
以上、DNSのラウンドロビンの設定についてでした。
最後までお読みいただき、ありがとうございました。