Tech Sketch Bucket of Technical Chips by TIS Inc.

変化するDNSラウンドロビン

Pocket

DNSラウンドロビンによる負荷分散は古くから聞くキーワードでありますが、一昔前と現在とでは実際に行っている事が異なっているようです。今回はそんなことをまとめてみます。


DNSラウンドロビンと最近の流れ

DNSラウンドロビンとはDNSの応答に工夫をしてクライアントからの接続を分散する手法です。
ですが、最近のサービスが実際に行っているDNSラウンドロビンと言うものは古来から行われているDNSラウンドロビンと設定や挙動が異なっています。
今回は記事の中で古いDNSラウンドロビンや最近のサービスやOSSが提供するDNSラウンドロビンを整理してみます。

クラシックなDNSラウンドロビン

クラシックなDNSラウンドロビンの説明と現在の挙動について示します。

クラシックなDNSラウンドロビンの設定

古くからDNSラウンドロビンと呼ばれていたものは以下のような設定をします。

  • ひとつのホスト名に対して複数のResource Record(Aレコード)を設定する
  • DNS問合せに対して、複数のResource Recordを応答する
  • DNS名前解決を行うごとに、応答する複数のResourceRecordの順序を変更する

サーバサイドで応答する順序を変えることでクライアント側が「一番最初のレコードを利用することが多い」という挙動を利用してラウンドロビンさせています。

図にすると以下のようになります。

classic_dns_roundrobin.png

この手法は、よく利用されているBINDなどのDNSサーバで「ラウンドロビンを有効にすること」と「複数のResourceRecordを設定する」の2つの設定だけで容易にリクエストの分散を実現できるためよく利用されていました。

RFC3484

このクラシックな手法はRFC3484が実装されている製品が出てきたことで雲行きが怪しくなってきました。
Wikipediaでの記載をそのまま転載すると

DNSが同一サーバ名に対し複数のIPアドレスを持つ場合に「自分のアドレスに近いアドレスを優先的に選択する」ことを定めており、Windows Vistaなどマイクロソフト製OSの一部や、最近のLinuxなどではこのルールに従いDNSラウンドロビンがデフォルトで無効にされている

とのことで、単純にAレコードを複数設定するだけでは負荷分散の効果を得にくくなっているようです。

ただ、youtubeやgoogleなどは複数応答するレコードの上位プリフィックスをそろえる運用によってDNSラウンドロビンを現在も適用しているようなので、運用次第ではまだクラシックなDNSラウンドロビンも実用的なのでしょう。※参考サイトより
実際にwww.google.co.jpを引いてみると確かに上位24bitが同じIPアドレスの3つ組を取得可能でした。

単一レコードを返すDNSラウンドロビン

クラシックな方法に対して、最近はDNSラウンドロビンという名前で、DNS問合せに対して単一のIPアドレスを返す方法があります。
実際に動作するサービスやOSSの例を見てみます。

Route53 Weighted Resource Record Sets

具体的な例としてはAmazonWebServiceのRoute53を利用して、 (Creating Weighted Resource Record Sets) を設定すると異なる手法でDNSラウンドロビンをするようです。

これでDNSラウンドロビンを行う設定を行います。

  • ひとつのホスト名に対して複数のResource Record(Aレコード)を設定する
  • DNS問合せに対して、単一のResource Recordを応答する
  • DNS名前解決を行うごとに、設定されている複数のResourceRecordの中から、異なるResourceRecordを選んで応答する

この場合はクライアントはDNS応答を1つだけ受け取るのでそこへ接続します。

other_dns_roundrobin.png

冗長性は...?

この方法は冗長性の観点では若干問題を抱えています。
例えば、ラウンドロビン先が死んでいる場合には、クラシックなDNSラウンドロビンの方法ではクライアント側は2番目3番目のレコードで接続を試みるため冗長性を担保しやすいです。
しかし、単一レコードを返すラウンドロビンではラウンドロビン先が死んでいると繋がりません。

高度なDNSラウンドロビン

上記のような問題に対応するためか、分散先サーバの死活監視しながらDNSのRRを変更するという実装も存在するようです。
この場合は目的が負荷分散だけではなく冗長化や可用性の向上の話になってくると思います。

細かくは解説しませんが死活管理をしながらDNSの応答をする例として参考になりそうなスライドの紹介をしておきます。

Mobageの技術を体験

おわり

というわけで、DNSラウンドロビンについてまとめてみました。
一口にDNSラウンドロビンといっても、アクセス先を選択するのがクライアントだったりサーバだったり、Aレコードを1個返したり複数返したりと、同じDNSラウンドロビンという言葉で呼んでいる実態に注意しましょう!

参考

ドメイン名のライフサイクルも話題に、「DNS Summer Days 2012」完全レポート
RFC3484

エンジニア採用中!私たちと一緒に働いてみませんか?