« brainf*ck でマジメに素数探索 | メイン | Brainf*ck で動的リスト »

2006年06月29日

DNS ラウンドロビンと高可用性 (High Availability)

 ウノウラボ Unoh Labs - ベンチャー流サーバ構築のススメ(ネットワーク編) について。
 
 おもしろく読ませていただきました。また、監視系を導入せずに自律的に動作させようという発想も大好きです。

 でも、

DNSは各回線の内側に設置しておきます。例えば上図のような場合、回線A側のDNSは回線AのIPアドレスを返すようにして、回線B側のDNSは回線BのIPアドレスを返すようにします。こうするとどちらかの回線が切れたときは切れたほうの回線のDNSにアクセスできなくなるので、自動的に生きている方の回線に接続されるようになります。

(ウノウラボ Unoh Labs - ベンチャー流サーバ構築のススメ(ネットワーク編))

このような場合は、 DNS ラウンドロビンを使用したほうが良いです。

 あまり知られていないことかもしれませんが、DNS があるホスト名に対して複数の IP アドレスを返した場合、多くのウェブブラウザ注1は、その全てのアドレスに対して接続を試みます (接続に成功するまで)。つまり、DNS ラウンドロビンには高可用性 (High Availability) を実現する機能もある、ということです。

 現在のウノウの手法では、片方の回線が断絶すると、半数のユーザが平均して TTL の 1/2 の時間、アクセス不能になってしまいます。

 DNS ラウンドロビンを設定しておけば、そのようなことは起こりません。50% の確率で接続に時間がかかるようにはなりますが、すべてのユーザに対してサービスを提供し続けることができます。多くのケースでは、しばらくすれば落ちた回線は復帰するでしょうから、毎回 DNS の設定を変更する必要はないでしょう。逆に、片肺飛行を続けなければならないのであれば、そう判明した時点で DNS を変更してやればよいのです。

 このように DNS ラウンドロビンは、サービス事業者にとって負荷分散のみならず、高可用性を実現するための手段にもなります。また、ユーザエージェントの実装戦略としても、DNS から返された全ての IP アドレスに対して接続を試みることは、そうしないよりも接続できる確率が上昇するという点で合理的だといえるでしょう。
 HTTP のユーザエージェントの開発者の方々、あるいは、それ以外の UA を開発している方々も、このように実装することをお勧めします注2

2006年12月5日追記:
 再試験を行いました。4つの応答しない IP アドレスが登録された DNS ラウンドロビンを用意し、その FQDN に対し、DNS キャッシュサーバが1台登録された Windows XP SP2 上で動作する IE6, Firefox 1.5 からアクセスをかけました。両ウェブブラウザとも、全アドレスに接続を試行することを (netstat -na | grep SYN で) 確認しました。


注1: 少なくとも、Internet Explorer 6.0 と Mozilla Firefox 1.5 は、記載のとおり動作します
注2: オマエモナー>Xiino (泣


PS. ウノウの説明でもう一箇所気になったのは、プロキシからインターネット側へ出て行くパケットのルーティングについて、記述がなかった点です。図の構成をそのまま実現してしまうと、片方のルーターにスタティックにデフォルトルートを設定してしまいそうです。実際は、それぞれのルーターの下に、個別にプロキシをぶらさげているのでしょうか?

投稿者 kazuho : 2006年06月29日 10:35 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/669

このリストは、次のエントリーを参照しています: DNS ラウンドロビンと高可用性 (High Availability):

» DNSラウンドロビンとWebブラウザの動作 追加 from SYの技術情報備忘録のblog
手持ちの環境で確認してみました。 [続きを読む]

トラックバック時刻: 2006年08月12日 06:50

» DNSラウンドロビンと負荷分散 from いろいろ日記
これ、知りませんでした。 あまり知られていないことかもしれませんが、DNS があるホスト名に対して複数の IP アドレスを返した場合、多くのウェブブラウ... [続きを読む]

トラックバック時刻: 2006年08月16日 00:53

コメント

ありがとうございます。
最近のブラウザがそのように動作するとは全く知りませんでした。
勉強になります。

APIを公開しているとアクセス元がブラウザだけではないので、やっぱり切る作業っていうのはどうしても必要になってきますね。
後、携帯系がどういう動作をするのか気になります。

ルーティングですが、現状片方のルータにスタティックにルーティングしてます。
サーバが増えたら個別にぶら下げて、高可用性を確保するようにしたいですね。

投稿者 masato : 2006年06月29日 11:12

> APIを公開しているとアクセス元がブラウザだけではないので、やっぱり
> 切る作業っていうのはどうしても必要になってきますね。
> 後、携帯系がどういう動作をするのか気になります。

おっしゃるとおりだと思います。上記方法をとる場合は、アクセスしてくるクライアントの種類によってホスト名を分けた、ホスト名ごとに可用性確保の戦略を変えるしかないと思います。

投稿者 kazuho : 2006年06月29日 11:41

そういえば、昔、以下のような論文を読まされました。結構、いい論文です。

http://www.csie.ncnu.edu.tw/~hychen/web_tech/PART%20I/Dynamic%20load%20balancing%20on%20Web-server%20systems.pdf

投稿者 tmiz : 2006年06月29日 12:45

> 結構、いい論文です。

ぱらぱら見ただけですが、パケットを書き換えてロードバランスさせたりとか、おもしろそうですね。紹介ありがとうございます。

投稿者 kazuho : 2006年06月29日 18:27

LAN内の負荷分散のためにラウンドロビンDNSを検討していてここに来ました。細かいことですが、

>多くのウェブブラウザ注1は、その全てのアドレスに対して接続を試みます (接続に成功するまで)。

とのことですが、IE6で検証したところ、1台に3回ずつリトライし、約5台までしか再接続しないようです。たまに6台だったり3台だったりするようですが、ほとんどの場合は5台でした。

マシンは稼動中でウェブサーバのみ停止している場合は接続拒否応答がありますので3回リトライせずにすぐに次のアドレスにチャレンジしますが、やはり5台程度で諦めるようです。

ラウンドロビンのエントリとして16個のIPアドレス(16個以上はラウンドロビンしないようです)を登録し、Etherrealでキャプチャして調べました。

投稿者 なかむら : 2007年05月09日 13:08

なかむらさん。私は何台までトライするかということを考えたことはなかったので、勉強になります。ありがとうございます。

投稿者 kazuho : 2007年05月11日 05:20