2010.06.11 Friday Yahoo!ブックマークに登録 はてなブックマークに追加 はてなブックマーク - DNS ラウンドロビンのすすめ - その5 livedoorクリップに投稿
DNS ラウンドロビンのすすめ - その5
ウラッチです。半年振りの更新です。今回でDNSラウンドロビンに関するエントリは終了したいと思います。

前回は、WindowsクライアントPCにおける、DNSラウンドロビンの扱いについて説明しました。今回はLinuxの実装について説明したいと思います。Windows Vistaで見られたIPアドレスのソート機能ですが、この現象はLinuxでも見られます。日々の運用の中でアクセスログのサイズが妙に片方のデータセンターだけ大きくなっていることから気付きました。それでは早速検証していきます。

リクエスト先情報は、以下の通りです。2つのデータセンターを利用しています。
% dig search.jword.jp a
〜省略〜
search.jword.jp. 60 IN A 203.167.55.120
search.jword.jp. 60 IN A 210.172.134.120
DNSクライアントとなるLinuxの環境は、以下の通りです。
% uname -a
Linux foo.jword.jp 2.6.18-92.el5 #1 SMP Tue Jun 10 18:51:06 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
以下のようなシェルスクリプトを作って、リクエストを投げ続けます。
#!/bin/sh

while [ 1 ]
do
wget "http://search.jword.jp"
rm -f index.html
sleep 60
done
後は、tcpdumpを使ってパケットを記録するだけです。
% tcpdump host search.jword.jp -w log.txt
DNS TTLを超えるように一定時間、実行し続けておきましょう。終わったら、log.txtを見ます。
% tcpdump -r log.txt
14:11:43.710365 IP 203.167.55.120.http > 192.168.1.244.60462: . 1:1323(1322) ack 123 win 46 <nop,nop,timestamp 4260368205 91311776>
14:11:43.710369 IP 192.168.1.244.60462 > 203.167.55.120.http: . ack 1323 win 67 <nop,nop,timestamp 91311793 4260368205>
14:11:43.710611 IP 203.167.55.120.http > 192.168.1.244.60462: . 1323:2645(1322) ack 123 win 46 <nop,nop,timestamp 4260368205 91311776>

〜省略〜

14:28:59.559528 IP 203.167.55.120.http > 192.168.1.244.39685: FP 3967:4740(773) ack 123 win 46 <nop,nop,timestamp 4261404339 92347611>
14:28:59.559615 IP 192.168.1.244.39685 > 203.167.55.120.http: F 123:123(0) ack 4741 win 129 <nop,nop,timestamp 92347642 4261404339>
14:28:59.570421 IP 203.167.55.120.http > 192.168.1.244.39685: . ack 124 win 46 <nop,nop,timestamp 4261404355 92347642>
Windows Vista同様、若いIPアドレスにのみアクセスが集中する現象を確認できます。原因は以下の通りです。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getaddrinfo.3.html
getaddrinfo() の中で使用される並べ替え関数は RFC 3484 で定義されている。特殊なシステムでは、 /etc/gai.conf を編集することで、この順序を微調整することができる (/etc/gai.conf は glibc 2.5 以降で利用できる)。

RFC 3484は『Default Address Selection for Internet Protocol version 6』の表題の通り、IPv6に関するメモ
IPv6の登場に伴い、名前解決ライブラリもアップデートが進み、古くから使われていたgethostbyname()ではなく、getaddrinfo()が使われるようになっていきました。弊社システムは特殊なシステムではありませんが、例えばHTTP APIで各システム間のデータ連携をする際に、アクセスが一方のIPアドレスに偏ってしまう仕様は、負荷・ディスク容量の面などにおいて問題です。IPv4を優先するように/etc/gai.confを編集し、この現象を回避しています。
scopev4 ::ffff:0.0.0.0/96 50
結果、2サイトのIPアドレスと通信していることを確認できます。
17:18:24.880422 IP 210.172.134.120.http > 192.168.1.244.51062: . ack 124 win 46 <nop,nop,timestamp 2437944718 102512955>nop,wscale 7>
17:18:25.898432 IP 203.167.55.120.http > 192.168.1.244.57656: . ack 123 win 46 <nop,nop,timestamp 4271573564 102513975>
gai.confは簡単な書式で「ラベル アドレス 優先順位」となっています。詳しくは、「man 5 gai.conf」してみてください。
「::ffff:0.0.0.0/96」の部分については詳しく説明したいのですが、IPv6に関するイロハから説明しなければならなくなってしまいますので、ポイントとなる点のみ列挙し、割愛させて頂きます。

  • IPv6については、まずはIPv6 - Wikipediaから勉強
  • IPv4では、2進数で表記された数値を8ビット単位でドット(.)で区切り、10進数表記する。[例] 192.0.2.1
  • IPv6では、128ビットを表記する際、IPv4と同様の表記では冗長になりすぎるため、16進数で表記された数値を16ビット単位で、コロン(:)で区切って表記する。[例] 2001:0db8:bd05:01d2:288a:1fc0:0001:10ee
  • IPv6にもIPv4同様、特殊なアドレスが色々あります(例 IPv4-mapped(射影)アドレス「::ffff:0.0.0.0/96」。
  • IPv6とIPv4は概念が根本的に異なる。例えばプライベートアドレスではなくて、サイトローカルアドレス、リンクローカルアドレスなどといったものがある。

IPv6はIPv4の延長で簡単に使えるものではありませんので、まだまだポイントは沢山あるのですが、「gai.conf」で検索するだけでも有益な情報がみつけられますので、一つずつ熟読しながら習得することをお勧めします。

さて、RFC 3484のソートについては、未だ疑問で更に勉強してみようと思っているのですが、いずれにしましても異なるデータセンターで運用しているサービスは、全てこのIPアドレス偏り問題に直面します。「ディザスタ・リカバリ」を行うべきではないということなのでしょうか.....。


以上、5回に渡ってDNSラウンドロビンについて説明してきましたが、いかがでしたでしょうか。DNS一つとっても実運用を含めて考えると、非常に奥が深いことが分かって頂けたかと思います。次回からは高可用性・負荷分散に関するテクニックを紹介していけたらと思っています。


[ 関連記事 ]
DNS ラウンドロビンのすすめ - その1
DNS ラウンドロビンのすすめ - その2
DNS ラウンドロビンのすすめ - その3
DNS ラウンドロビンのすすめ - その4
DNS ラウンドロビンのすすめ - その5
uratch | WEB | 14:16 | comments(1) | trackbacks(0) | pookmark
Comment
凄い勉強になりました!
まさか、sortされてしまうとは。
この先どのように対応検討しているのかもお聞きしたいです。
Yuzo, 2011/02/02 11:57 AM









Trackback
URL : http://techblog.jword.jp/trackback/58
tech_blog_03.gif
Calendar
SunMonTueWedThuFriSat
   1234
567891011
12131415161718
19202122232425
262728293031 
<< March 2017 >>
New Entries
Archives
Categories
Recent comment
Recent trackback
Profile
Links
Mobile
qrcode
Admin
Seach this site