DNSラウンドロビンの個人的な大いなる誤解について書いている記事。
そして全体的に「要出典」タグがつきそうな記事ですので悪しからず。
参考
- UnboundとDNSラウンドロビン - インフラエンジニアway - Powered by HEARTBEATS
- DNSラウンドロビンを使った時にアクセス・負荷が偏る話 - 元RX-7乗りの適当な日々
- DNSラウンドロビン - Wikipedia
- アクセスを振り分けて障害対策、サーバーを冗長化する「3つの方法」 | 日経クロステック(xTECH)
DNSラウンドロビンについての(個人的な)大いなる誤解
大変申し訳ございませんでした。
私はDNSラウンドロビンについて大いなる誤解をしておりました。
ここに懺悔して悔い改めます。
誤解⇒DNSラウンドロビンってDNSサーバが順番にIPアドレスを返してくれるんだよね。DNSサーバーすげぇー。
事実⇒DNSサーバはIPアドレスのリストを返すだけ。どのIPアドレスを使うかはクライアントの実装による。
なんという大いなる誤解。
DNSラウンドロビンとは
DNSラウンドロビンとは、Wikipediaによれば
DNSラウンドロビン (DNS round robin)とは、一つのドメイン名に複数のIPアドレスを割り当てる負荷分散技術の一つである。 トラフィック負荷を複数のIPアドレスに振り分けることにより、例えばHTTPサーバに対するアクセスをほぼ同量ずつ複数のサーバマシンに分配することができる。
とあり、サーバーの負荷分散技術として語られることが多いテクニックです。
日経のページからの引用ですが、
例えば、Aレコードに「192.168.10.1」「192.168.10.2」「192.168.10.3」というIPアドレスを登録しておくと、DNSサーバーは名前解決の問い合わせごとに「192.168.10.1→192.168.10.2→192.168.10.3」と順番に切り替て応答する。Aレコードの最後尾に登録されているIPアドレスを返したら、次は先頭のIPアドレスに戻って応答する。こうしてサーバーへのアクセスを振り分ける。
『アクセスを振り分けて障害対策、サーバーを冗長化する「3つの方法」 | 日経クロステック(xTECH)』より引用
とあります。
↑を読むと、DNSサーバーは順番に1つのIPアドレスを返すと思いません?私だけ?これがそもそもの勘違いだったわけですが。
なんでこんなことに行きついたのか
そもそもなんでこんな、細かいことに行きついたかというと、
Cisco Packet Tracer(Packet Tracer - Wikipedia)で、
遊んでいたからです。
DNSサーバーとWebサーバーを立てて、複数のIPアドレスを1つのFQDNに割当てるAレコードを設定して、
クライアントのブラウザでホスト名からWebサーバーにアクセスするという遊びをやっておりました。
私の中では、これでDNSラウンドロビンができると思っていたのですが、
何回やっても、クライアントが同じIPアドレスでWebサーバーにアクセスしに行っているんですね。
あれ?これじゃAレコードを複数登録する意味なくね?となるわけです。
そういうわけでDNS Answerのパケットを覗きました
すると、DNSサーバーのAnswerはIPアドレスのリストを返しているではありませんか。
「1つのIPアドレスを返すじゃないんかい!」馬鹿な私は一人でつっこみをいれておりました。
大いなる誤解
その時私は思いました。「これはバグだ」と。
鬼の首を取ったように意気揚々と調べてみるとどうやら正常な動作のようでした。
DNSサーバーで1つのFQDNに対して複数のIPアドレスが登録されている場合はその全てをリストにしてAnswerとして返すようです。
DNSラウンドロビンとは、DNSの名前解決要求に対する応答の度にそのリストの順番を順繰りに入れ替えているだけとのこと。
(順繰りかどうかはDNSサーバーの実装によるっぽい。ランダムな場合もあるっぽい)。
複数のIPアドレスをAnswerとして受け取ったクライアントは、その中からIPアドレスを選ぶわけなんですが、
昔(WindowsだとVista以前)のDNSクライアントはIPアドレスのリストの一番上を選択する傾向があったらしく、
リストの順番が大事だったようです。
DNSサーバー側でリストの順番を順繰りに変えていれば、
クライアント側は結果的に別のサーバーにアクセスしに行く、という理屈のようです。
おお、なんという私の誤解。
しかし、Wikipedediaにもありますが、最近のWindowsやLinuxでは
DNSクライアントのIPアドレスの選択方法について「RFC3484」に則ったIPアドレスを選択するようで、
一番最初のIPアドレスを選択しない(ラウンドロビンをしない)設定がデフォルトになっていることが多いようです。
結局のところIPアドレスを選ぶクライアントの挙動によるっぽい
DNSサーバーがいくら複数のIPアドレスを順番を変えて応答しようが、
クライアント側でDNS Answerの中の最初のIPアドレスを選択しないのだとしたら
DNSラウンドロビンの意味がないですね・・・。
ろくに調べていませんが、RFC3484の環境でもDNSラウンドロビンを働かせるテクニックもあるようですね。
やっぱりどんな技術も実践してみると色々と発見があるものです。
うーん、しかし伝聞スタイル過ぎる記事になってしまった・・・。
というわけでここまでお読みいただき、ありがとうございました。