DNS でラウンドロビンは当てにならない。

モバイルでもDNSラウンドロビンはちゃんと動作しますか? PCであれば、だいたいのブラウザが対応していると聞きますが、モバイルはどうなんでしょうか? A、B、Cというサーバをラウンドロビンで動かした時に、Bが死んだとします。 その場合、PCはBに行かなくなると思いますが、携帯の場合はどうなんでしょうか? 携帯はキャリアのプロキシ?か何かを通っていそうなので、ちゃんと動くのかが気になります。 また、ラウンドロビンの弱点は何ですか? 今のところ気づいているのは、単に振り分けるだけだから1台に負荷が集中するかもしれないことくらいしかないです。

上の質問を見て、「あれっ、ラウンドロビンって、ブラウザのようなアプリケーションサイドで対応するものだっけ? gethostbyname 辺りで勝手にやっていて、アプリ側は渡された IP で繋ぐだけでは?」と思っていたら、それは、もう古い話らしい。

0000665: wgetがDNSラウンドロビンに対応していない - Vine Linux バグトラッキングシステム

上記ページは、Vine 上の wget の挙動に関する話だが、

問題の本質は,glibc中のgetaddrinfo()がRFC3484 rule 9に準拠した結果,名前解決されたIPアドレスがソートされて返されるためのようです.

と書かれていて、getaddrinfo を使うと、RFC3484 rule 9 に従うことになるので、そのままではラウンドロビンにならないらしい。

私が「ラウンドロビンされる」と報告したwgetは,バージョンは古くてgethostbyname()を使っているために結果的にラウンドロビンされて,Vine標準のwgetは新しくてgetaddrinfo()を使っている(IPv6対応かな?)ために,ラウンドロビンしてくれないということなのでしょう.

となると、gethostbyname を使っていれば、昔どおり、ラウンドロビンになるけど、IPv6 に対応しようとして、getaddrinfo を使うと、アプリケーション側が対応しなければ、ラウンドロビンにならないらしい。

一番問題が大きそうなFirefoxはgetaddrinfoからの結果を自前でラウンドロビンしてる

とあるから、IPv6 対応した上で、ラウンドロビンをしたければ、アプリ側の対応が必要みたい。

で、こんなページもあった。

Syun | We provide professional Internet solution for you to smile.

これだと、Vista の gethostbyname はラウンドロビンにならないらしい。

で、ちょっと調べてみたら、やはりそうらしい。

DNS Round Robin and Destination IP address selection | Networking Blog

これを読むと、IPv6 が有効になっていれば、RFC3484 rule 9 に従って、得られた IP アドレスをソートしてしまうので、これまでのようなラウンドロビンにはならない。それは得られたアドレスが IPv4 か IPv6 かに関係なく、「IPv6 が有効」であればこのような動作になる。Vista からは IPv6 がデフォルトで有効だから、アプリケーション側が対応してなければラウンドロビンは効かなくなる。

Bug#438179: glibc's getaddrinfo() sort order

Debian のメーリングリストに流れていたメッセージに

One of the existing use cases that breaks is round-robin DNS. Round-robin DNS is not an IETF standard; its use has been discouraged by various parties for years; it has limitations that make it unsuitable for any but the simplest of configurations.

とあって、そもそも DNS のラウンドロビンは、IETF 標準では無かったみたい。

いやぁ、知らなかったなぁ...。