![]()
カスタム検索
|
data-lang="ja">Tweet |
|
![]() |
Modified: 11 February 2006
実験システム1
2台のIPルータと2台のWEBサーバーを設置し、IPルータやWEBサーバーのどれが故障してもサービスを継続できるシステムを構築し、評価する実験です。2ヶ所のプロバイダと契約し、それぞれのIPルータに接続すれば、IPルータはもちろん、片方の回線トラブルがあってもサービスを継続できますので、かなり高い可用性の高いシステムを実現できます。
2台のWEBサーバーと負荷分散サーバーを設定する
2台のIPルータを設定する
障害時に切り替えを行う
完成したシステム
関連ページ (参考)
Apacheの話題と実験
Poundの話題と実験
IPルータの実験
サーバーの死活状態を調べるスクリプト
ダイナミックDNSの実験
2台のWEBサーバーをインストールする
「Apacheの話題と実験」を参考に、2台のWEBサーバーをインストールします。
とりあえず、通常通りで、特別な設定は要りませんが、Listenポートを80でなく、8080 に設定しておきます。
負荷分散サーバーをインストールする
2台のサーバーに、それぞれ、「Poundの話題と実験」を参考に、Pound(分散サーバー)をインストールします。
つまり、1台のサーバーに、それぞれPoundとApacheが稼動し、それぞれのPoundは、自サーバーのApacheと、他サーバーのApacheに接続します。
結果、どちらのサーバーのPoundにリクエスト出しても、2台のWEBサーバーが負荷分散して使えるようにします。
IPルータを設定する
専用のルータを使う場合は、この設定は不要ですが、本実験では、Linuxサーバーをルータとして使って行います。
2台のIPルータを、「IPルータの実験」を参考に、設定します。
要は、通常は、どちらからリクエストしても同じ結果が返されるように設定しますので、片方が壊れて通信できなくなっても、もう片方のルータでサービスが継続できるようになります。
問題点
2台のIPルータを設置すると、それぞれのルータが異なるグローバルIPを持つことになりますので、片方が故障した場合、URLとIPアドレスの対応、つまり、ネームサーバーの切り替えが必要となります。
この問題を解決するには、障害を監視し、障害の発生を検知したら、ネームサーバーの登録を変更するという処理を自動化する必要があります。
ネームサーバーの登録を変更
ネームサーバーの変更は、ネームサーバーのゾーンファイルを変更すればいいのですが、反映に時間がかかりますので、BINDの動的更新機能を使って実現します。
BINDの動的更新機能の設定は、「ダイナミックDNSの実験」を参考にしてください。
ネームサーバーの登録を変更するための2つのファイルを作成します。
以下は、"192.168.0.35" の登録用で、"35"のファイル名で保存します。
update delete www2.tomo.ac update add www2.tomo.ac 10 IN A 192.168.0.35 (空行必要)以下は、"192.168.0.36" の登録用で、"36"のファイル名で保存します。
update delete www2.tomo.ac update add www2.tomo.ac 10 IN A 192.168.0.36 (空行必要)これらは、以下のように実行して変更します。
# /usr/bin/nsupdate /var/named/35 # /usr/bin/nsupdate /var/named/36
TTLは、"10" にしましたが、短すぎると思いますので、調整が必要です。
この時間は、WindowsのPCの更新間隔になりますので、長いと、せっかくネームサーバーが切り替わっているのに、なかなか変わった値を取り込んでくれないことになります。
障害の検出
障害の検出は、定期的にPINGを発行するスクリプトをつくり、"cron" で定期的に実行して行います。
具体的は、「サーバーの死活状態を調べるスクリプト」を参考に作成します。
以下のように、PINGコマンドを3回発行して応答がなければDOWNとみなし、先に作成した、ネームサーバーの登録を変更するコマンドを実行します。
これを、"/var/named/check-alive.sh" のファイル名で保存します。
#!/bin/sh IPA=192.168.84.35 PING='ping -w 2 -c 1' TARGET="UP" checkalive() { $PING $IPA || $PING $IPA || $PING $IPA } checkalive > /dev/null 2>&1 || TARGET="DOWN" if [ $TARGET = "UP" ] then /usr/bin/nsupdate /var/named/35 else /usr/bin/nsupdate /var/named/36 fiこのスクリプトを、"cron"で実行します。
*/3 * * * * /var/named/check-alive.sh
3分毎にチェックするようにしましたが、全体の状態から調整が必要です。
完成図
外部から両方の回線とルータを経由して、HTTPサービスを監視します。
障害(回線、ルータ、WEBサーバーのいずれか)を検知したら、ダイナミックDNSの機能で、ネームサーバーを更新します。クライアントは、DNSを参照して、活きている回線とルータを経由してHTTPサービスを受けることができます。
監視サーバー自身が傷害した場合のために、このサーバも2台(セカンダリDNS)設置すれば、完璧です。