ダウンタイムをほぼ0でサーバを移転する。

 データセンター変更に伴なうサーバの移動や、専用サーバの他社への乗り換えでIPアドレスが変更となる場合、通常は1日程メンテナンス時間を頂くのが基本になります。....がECサイトなど24時間稼働が前提のサービスではダウンタイムを極限まで減らしたいという要望があったりします。

今回は、この問題について考えてみましょう。
 サーバ移転時に最も反映に時間が掛かるところはどこかといえば、DNSサーバのIPアドレス変更により、それぞれのプロバイダ、企業のDNSサーバ全てに更新が浸透するのに最大で1〜2日掛かるというところです。これは、djbdns + rsync over sshセカンダリDNSへの更新時間を極限まで減らしても、TTLを0にしても、どうしても即時反映とはいかない部分が残ってしまいます。

 そこで、どうするかといえばWEBサービスであれば、DNSIPアドレス変更と同時にApacheのmod_proxy等のプロキシーを使って移転先のWEBサーバにつないでしまえばいいのです!!これであれば、DNS更新が間に合わなかったリクエストをプロクシーを経由して移転先にアクセスさせることができます。ちなみに、アクセス元IPアドレスがプロキシーサーバのIPアドレスになるので気になる方はmod_rpafなどを入れておきましょう。

 他のサービスも同様にプロクシーを使う方法が有効ですが、SMTPポートはPROXYを使うとオープンリレーになってしまうことがあるので注意が必要です。SMTPの場合はSMTPサーバの設定をセカンダリMXに切り替えて、移転先のSMTPサーバに転送してあげるといった方法を使うことになるでしょう。

小中規模のECサイトのWEBサイトのみであれば、stoneを使ったお手軽移動がオススメです。stoneはご存知、仙石 浩明さんが作成した軽量プロキシープログラムです。こういった用途にまさにうってつけで、簡単なサイト移転等では良く使わせてもらっています。
以下、djb様のdaemontoolsを使ったstoneの設定例を付記しておきます。daemontoolsが動作していることが前提です。

cd /usr/local/src/
wget http://gcd.org/sengoku/stone/stone-2.3e.tar.gz
tar xvzf stone-2.3e.tar.gz
cd stone-2.3d-2.3.2.7
make linux
mkdir /var/stone
chmod +t /var/stone
cp stone /var/stone
cd /var/stone
cat << EOD > run
#!/bin/sh
 
exec 2>&1
exec /var/stone/stone -f 6 \
[移転先IPアドレス]:80 80
EOD
chmod 700 run
mkdir log
cd log
cat << EOD > run
#!/bin/sh
exec multilog t \
./main
EOD
chmod 700 run
ln -s /var/stone /service/stone

※適時、必要であればセキュリティオプションなどを設定してください。-fオプションはサービスレベルで使用するときは必須ですので、規模に応じて調節してください。わたしはコレであやうくサービス落としかけました。※ stoneは個人での使用を目的に開発されたものですので、サービス用途で使う時はちゃんとオプションを設定しましょう。

あれっ確かこれを初めて実現したときは確かに武勇伝だった気がするけど、今や日常になってしまっているよ。