外向けに公開している自宅 Web サーバ環境では、企業向けサーバでよく議論されている、複数台の PC を用意してトラフィックをさばく負荷分散までは要らないけれど、利用者や検索エンジンから、「見たいときにつながらないんじゃダメじゃん」と可用性 (availability) についてマイナスの評価を受けないようにしたいものです。

そうは言っても、WordPress などブログサーバ、OS の kernel アップグレード、仮想マシンのバックアップなど長時間のメンテナンスは定期的に発生するわけで、あらかじめコンテンツをミラーしておいた予備サーバを見に行くようにする方法を整理してみます。

前提条件

  • CentOS + apache + WordPress なサーバが本番 (active)、予備 (backup) 計 2台ある
    (レンタルサーバではなく、すべて自前で運用しているものとする)
  • 本番サーバ: IP アドレス 192.168.0.3
  • 予備サーバ: IP アドレス 192.168.0.4
  • 予備サーバはロードバランシング (負荷分散) 用には使わない。本番が落ちたときにだけ備えて待機

簡単なのは IP アドレスをすり変えてしまうことだが …

予備の IP アドレスを一時的にすり替え、本番サーバのフリをさせるのが話としては簡単です。

[メンテ中] 本番サーバ192.168.0.xxx  予備サーバ 192.168.0.3

ただ、それでは IP アドレスの衝突を避けるために一度、本番 / 予備サーバ双方のネットワークを /etc/init.d/network stop で止めたうえで、/etc/init.d/sysconfig/network-scripts/ifcfg-eth0 内の IP アドレスを書き換える必要があります。

作業自体は慣れれば一瞬で終わりますが、インターネット上の「外」の利用者から見ると、落ちているように見えたり、検索エンジンのボットが巡回してきても、何のステータスコードも返らず、広い意味で SEO (検索エンジン最適化) 的によくありません。

また IP アドレス単位でサーバを管理しているルータからみると、予備サーバにすり替わった瞬間にセキュアでないポートが外からアクセス可能になってしまったり、一回決めた IP アドレスをコロコロ変えると、ネットワーク管理上あまり良くありません。

DNS ラウンドロビンは可用性 (availability) 対策としては不十分

他のアプローチとして、外向け DNS サーバが Web サーバ www.nire.com への問い合わせに対して複数の IP アドレスを返すようにゾーン定義ファイルを書く方法があります。最近の Web ブラウザやプロキシサーバは、その複数の IP アドレス全てに対して接続を試みるように実装されているので、本番も予備も全部書いておけば良いように思えます。しかし、この親切であって must ではないスペック、実装していないクライアントもあります。実装していない場合、DNS サーバが複数の IP アドレスを返しても、うち 1つにだけアクセスして、相手が落ちていたらそれであきらめてしまいます。

pound によるお手軽リバースプロキシ

そこで pound というサーバがあります。主に負荷分散用として紹介されることが多いのですが、実は普段は本番サーバを使い、落ちているときだけ予備サーバに振ることできます。

フェイルオーバーに使えるソリューションは無償のものから有償のものまで色々ありますが、pound を使うのが一番手っ取り早いと思われます。

CentOS なら

yum install pound
chkconfig pound on

だけでインストール完了、/etc/pound.cfg を例えば次のように書いて /etc/init.d/pound start するだけです。

User "pound"
Group "pound"
LogLevel 1
Alive 60
Daemon 1

ListenHTTP
  Address 192.168.0.2 ← pound サーバ自身の IP アドレス
  Port 80
  Service
    HeadRequire "Host: www.nire.com.*" ← Web サーバのドメイン名
    BackEnd
      Address 192.168.0.3 ← 本番 (active) サーバの IP アドレス
      Port 80
    End
    Emergency
      Address 192.168.0.4 ← 予備 (backup) サーバの IP アドレス
      Port 80
    End
  End
End

負荷分散のために使うなら BackEnd – End 節の繰り返しですが、BackEnd の代わりに Emergency と書くのがミソです。