2010-12-27
格安WEBサーバ冗長化・高可用化設計術
|前回は、nginx + ServersManでの検証結果を御紹介しました。今回は、サーバ構成を含めた構築内容を掘り下げて説明していきたいと思います。
ドメイン
画像サーバですので、ドメインはさほど表に出ません。屋号が「studio Usagi」なので価格の安さから「usagi.be」を取得する事にしました。お名前.comで、1,830円/年。DNSサービスも無料で付いてきます。
DNSラウンドロビン
共用レンタルサーバと違って、VPSサーバを使うとなると、httpd / mysqld らデーモンの監視は自身で行わなければなりません(勿論共用でもした方がいいのですが)。とは言っても、一人WEBサービス屋のスタートアップ時に、監視周りに多くの時間は避けませんので、スピート重視で構成を考えていきます。以下構成仕様。
- サービス監視は簡単なスクリプトを用意。反応がなければGMailにアラートを発報
- 一人WEBサービス屋が夜中に携帯アドレスにアラート発報なんて嫌だ。もっとルーズに管理したい。
- 1台落ちても寝続けていられるようにDNSラウンドロビンを利用した2台構成に
という訳で、ServersMan(490円プラン)を2台契約し、お名前.comのDNSサービスを利用して、2台分のAレコードを設定します。手順は「ドメインNavi」ログイン⇒「ドメイン設定」⇒「レンタルDNSレコード設定」で以下の様にAレコードを2つ設定するだけです。
ちなみにJPRS問題で話題に挙がったお名前.comのDNSですが、今のIPアドレスはこちら。
01.dnsv.jp. 940 IN A 210.172.129.68 02.dnsv.jp. 165 IN A 61.127.54.31
お名前.comではセカンダリDNSを無料で設定できるようです。画像サーバはリソースが余っていますので、DNSサーバも同居させ、プライマリ/セカンダリDNSを分散させてもいいでしょう。
※画像サーバとDNSサーバを同居させる場合は、OSソケット枯渇問題や各業者の接続規制に、より注意が必要です。
ブラウザのラウンドロビンアクセスの実装状況
ところで「DNSラウンドロビンなんて、LVSが当たり前になった昨今に頂けない!高可用性が低い!!」という声を聞きますが、DNSラウンドロビンを侮ってはいけません。DNSラウンドロビンは、少なくともWEBサービスにおいては、かなりの高可用性を持っています。ご存知の方も多いと思いますが、昨今のブラウザは、名前解決で複数のIPアドレスが返ってきた場合には、ラウンドロビンアクセスを行います。実際に試してみましょう。以下の様にホスト名にIPアドレスを2つ割り当てた上で、1行目(.29)のWEBサーバは起動しないでおきます。
%dig usagi.be ;; ANSWER SECTION: usagi.be. 300 IN A 183.181.165.29 usagi.be. 300 IN A 183.181.174.76
それでは、ブラウザでアクセスし、その内容をパケットキャプチャで見てみます。今回はWindows XP + IE6の結果を添付しました。
- usagi.beのIPアドレスを取得します(1〜2行目)。
- クライアントは、始めに[ SYN ]パケットを投げますが、.29 は、WEBサーバが起動すらしていませんので[ SYN, ACK ]を応答することはありません(3〜4行目)。
- IE6の場合は、3回[ SYN ]パケットの送信をし、リトライします(5〜8行目)。
- 3回とも失敗したので、次のIPアドレス.76 に対して[ SYN ]パケットを送信します(9行目)。
- 3ウェイハンドシェイクが成功します(9〜11行目)。
- HTTP GET に成功します(12行目以降)。
TCP3ウェイハンドシェイクは、ご覧の通り非常にシンプルなやり取りですので、リトライが発生してもユーザが重たいと感じることはほとんどありません。以下は半年程前になるのですが、主要ブラウザの対応状況をまとめたものになります(Windows XP)。
- ○ IE 6 / 7
- ○ Firefox 3.0.12
- ○ Safari 4 Public Beta
- ○ Chrome 2.0.172.37
- × Opera 9.0.2
ほとんどのブラウザがこのラウンドロビンアクセスを実装しています。Operaのアクセスは、私が運営しているサイトcocoでは、1%程度ですので、許容範囲としました(Operaユーザの皆さんごめんなさい!)。
Vista問題
実はこのラウンドロビンアクセス。初期状態のWindows Vistaでは、どのブラウザを使っていようとも一切機能しません(Windows Server 2008でも同様の様です。)。ある条件に従って1つのIPアドレスにアクセスが集中します。このVista問題の件は話し出すと「IPv6」「getaddrinfo」「getbyhostname」「RFC3484」などなど、非常に長くなりますので割愛させて頂きます。ちなみに、Vistaユーザとなると、結構大きくてcocoの全ユーザの24%でした.....。
※正確には異なるのですが一例を挙げると、一番若いIPアドレスにのみアクセスしようとします。cocoの例では「183.181.165.29」にのみSYNパケットを投げてリトライを繰り返します。クライアント/サーバのIPアドレス帯によって、その動作内容は異なります。詳しくはMS社PDF参照(http://download.microsoft.com/download/6/3/1/631C4737-D6AF-461B-8292-DE12637C03CC/1130LT_Abe.pdf)
※Windows 7では、ラウンドロビンアクセスするよう実装されています。
※もっと細かい事を言い出すとVistaに限らず、UNIXクライアント(getaddrinfoで名前解決している最近のOS)でもこの問題は発生します。ロードバランサとは違いクライアント依存の技術ですから、この辺りの曖昧さは仕方ありません。
まとめ
Vistaの件で拍子抜けしてしまいましたが、いかがでしたでしょうか。ロードバランサ構成を取る事は小規模サービスでは現実的ではありません。OperaユーザとVistaユーザには画像が見れない状況を作ってしまいますが、490円x2である程度の高可用性が実現できるのは大きなメリットではないでしょうか。
また、画像サーバ自身に「HTTP監視&nginx再起動」スクリプトを仕込んでおいて、5分に1回などと定期的に実行する事によりダウンタイムを少なくする事もできます。以下、監視用サンプルスクリプトです。
#!/bin/sh GetHTTPStatus() { wget -S --spider --tries=1 --read-timeout=1 --connect-timeout=1 --read-timeout=1 --no-cache "http://127.0.0.1/monitor.txt" 2> &1 | grep 'HTTP/' | awk '{print $2}' } for I in 1 2 "LAST" do STATUS=`GetHTTPStatus` if [ "$STATUS" = 200 ]; then exit else echo $I if [ "$I" = "LAST" ]; then echo "SHUTDOWN" MSG="[ Alert ] `hostname` : restart ngingx - `date +\"%m/%d %H:%M\"`" echo $MSG | mail -s "$MSG" alert@example.com /etc/init.d/nginx restart exit fi sleep 30 fi done
なお、ブラウザラウンドロビンは、あくまで3ウェイハンドシェイクの原理を利用して実装されていますので、WEBサーバがハングしているケース等においては、3ウェイハンドシェイクは通ってしまい、高可用性を実現できません。
何だか話が複雑で、ラウンドロビンが、かえって駄目って思われてしまったかもしれませんね。ブラウザラウンドロビンは掘り下げると本が1冊書けるぐらい奥深いものですので、触りの部分しか御紹介できませんでしたが、いずれにしましても動作原理・障害影響範囲を把握した上で、コストとのバランスをみながら導入可否を決定してみてください。
[関連記事]
- 18 http://b.hatena.ne.jp/
- 17 http://twitter.com/
- 15 http://b.hatena.ne.jp/hotentry/it
- 9 http://b.hatena.ne.jp/entrylist
- 9 http://b.hatena.ne.jp/entrylist/it
- 9 http://reader.livedoor.com/reader/
- 8 http://b.hatena.ne.jp/hotentry
- 7 http://www.ig.gmodules.com/gadgets/ifr?exp_rpc_js=1&exp_track_js=1&url=http://www.hatena.ne.jp/tools/gadget/bookmark/bookmark_gadget.xml&container=ig&view=default&lang=ja&country=JP&v=5d6b571248635d85&parent=http://www.google.co.jp&libs=core
- 6 http://d.hatena.ne.jp/
- 5 http://hootsuite.com/dashboard