DNSのラウンドロビン

DNSのラウンドロビンは枯れた技術で様々な企業で使用されています。

具体的にはDNSの登録する1つのホスト名に対して複数のIPアドレスを登録しておきます。クライアントからの要求に対して順番に先頭のIPを変更して異なるサーバーのIPアドレスを返すことにより負荷分散を行わせるものになります。

ホスト名としてWebserverが以下のように登録してある場合は

Webserver.test.net A 192.168.0.100
Webserver.test.net A 192.168.0.10
Webserver.test.net A 192.168.0.11
Webserver.test.net A 192.168.0.15
Webserver.test.net A 192.168.0.20

クライアント側にこれらのリストが返され、先頭の 192.168.0.100 が使用されます

そして別の端末がWebserverの名前解決を行うと

Webserver.test.net A 192.168.0.10
Webserver.test.net A 192.168.0.11
Webserver.test.net A 192.168.0.15
Webserver.test.net A 192.168.0.20
Webserver.test.net A 192.168.0.100

クライアント側にこれらのリストが返され、先頭の 192.168.0.10が使用されます

このような動作により負荷分散を行います

本日、同僚が研修でテストしていたら思ったような動作にならないと言ってきました。そして調べてみるとWindows Server 2008 と Vista ではラウンドロビンがうまく動かないことがわかりました

どのような動作になるかというと DNSキャッシュの内容が以下のエントリで入ったとします

Webserver.test.net A 192.168.0.100
Webserver.test.net A 192.168.0.10
Webserver.test.net A 192.168.0.11
Webserver.test.net A 192.168.0.15
Webserver.test.net A 192.168.0.20

このようなリストが返されると、一番小さいアドレス(longest match)が選択される仕様になっているようです

2009/11/09 追記
2009/11/18 追記

私の理解が少々間違っていましたので訂正します

実際にはまず自分のIPアドレスを確認します。たとえば、自分のIPアドレスが192.168.0.1だとすると、自分のIPとラウンドロビンのIPを比較します。

11000000 10101000 00000000 00000001 = 192.168.0.1 = Client IP to match.
11000000 10101000 00000000 01100100 = 192.168.0.100 = (24 + 1 = 25 bits matching the client IP)
11000000 10101000 00000000 00001010 = 192.168.0.10 = (24 + 4 = 28 bits matching the client IP)
11000000 10101000 00000000 00001011 = 192.168.0.11 = (24 + 4 = 28 bits matching the client IP)
11000000 10101000 00000000 00001101 = 192.168.0.15 = (24 + 4 = 28 bits matching the client IP)
11000000 10101000 00000000 00010100 = 192.168.0.20 = (24 + 3 = 27 bits matching the client

ここでIPアドレスのマッチングを行います。第3オクテットまでは同じなので第4オクテットに着目します。

192.168.0.10
192.168.0.11
192.168.0.15

が28bit matchなので、この中の先頭のIPアドレスが選択されます。

ですのでこの場合は 192.168.0.10 が選択され続けることになります。

これはVistaよりIPv6がデフォルトで動作する仕様変更に伴い、RFC3484に従ったためにおこるものらしいです

ただし、実機確認してみると意外なことが判明!

この動作は同一セグメントでの動作で、異なるセグメントの場合はちゃんとラウンドロビンが動作しました。

Pingでのテストによると、もしマッチングビットが同じで通信が不可能な場合キャッシュに登録された順番にIPを試します。結果的に通信が確立されたIPがあった場合はそのIPに固定された通信を行います。

192.168.0.10(不可)
192.168.0.11(不可)
192.168.0.15 追記はここまで(2009/11/09)

この動作を以前と同様にするにはレジストリの変更が必要になります

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters
DWORD = OverrideDefaultAddressSelection
Value data: = 1

ちなみに、Windows7 と Windows Server 2008 R2 ではこのレジストリがデフォルトで1になっています(キーは存在しません)。よって、クライアントにWindows7を使用している場合は特に問題はないということになりますね。

参考

DNS Round Robin and Destination IP address selection

いや~、知らなかったな~~~

スポンサーリンク
レクタングル(大)広告
レクタングル(大)広告
  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*