DNS でラウンドロビンは当てにならない。
上の質問を見て、「あれっ、ラウンドロビンって、ブラウザのようなアプリケーションサイドで対応するものだっけ? 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 を使うと、アプリケーション側が対応しなければ、ラウンドロビンにならないらしい。
とあるから、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
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 標準では無かったみたい。
いやぁ、知らなかったなぁ...。