自宅サーバのWordPressを【Route53+VPS】で冗長化

この備忘録は自宅サーバで運用している。しかし自宅サーバは家族による『ブレーカー落とし』とか『コンセント引っこ抜き』によって何度も落とされており、安定感に欠ける。

しかも落とされすぎてGoogleの検索順位はだだ下がっている。そのたび対策を考え、サーバを二台構成にしたり、UPSを導入したりしたが、根本解決には至らなかった。どれだけ対策に力を入れても『電気機器は電気落とされたらどうしようもない』という厳然たる真理からは逃れられなかった。

そこでクラウドによる冗長化を行うことにした。もっとも三年続けているにも関わらず、この備忘録は極めてアクセス数が少ない。したがって、月数百円のVPS最低プランだけでも十分運用できる。できるのだが、そこはロマンを優先する。

検討

冗長化を考える上で最優先すべきは3つ。

  • DDNSが使える(自宅は固定IPがない)
  • 障害時の自動切替
  • 費用を安くする

まず我が家は固定IPを取得していない。理由は単純に経済性。契約しているISPはeo光で、固定IPのオプションサービスが高価だ。調べてみると初期費用2,000円、月額4,000円だった。これを許容した場合、自宅サーバの維持費と併せて、ちょっとした法人向けのクラウドサービスが契約できるお値段。この時点で固定IPの取得はナシとなった。

そうなるとIP変動ごとにDNSサーバに登録し直すDDNSサービスを使うことになる。DDNSサービスの候補をいろいろ検討した結果、AWSのRoute53を使うことにした。Route53はDDNSに対応しているだけではない。ヘルスチェックとフェイルオーバー機能がある。これらを駆使することで障害発生時にスタンバイサーバへの自動切替ができるのだ。費用的にも月数ドルの出費で済みそうだった。

最後の検討事項は、待機系のスタンバイサーバを何にするか。ここは大変な悩みどころだった。Route53に関連してEC2にしようかとも考えたが、割高だし従量課金のイメージがよろしくない。ここは値段を重視してConohaのVPSを契約することにした。ところがこれまた問題発生。Conohaは最低プランだとスケールアップできないことが発覚した。

※ 512MBプランではスケールアップ・ダウン機能をご利用いただけません。

スタンバイサーバは普段は低スペックでも良いが、いざ切り替わったとき増大した負荷に対応するため、スケールアップできることは大前提だ。スケールアップできないクラウドなんて、クラウドであるメリットがほぼない。

仕方がないため月額900円の少し良いプランにした。これをスタンバイサーバとして遊ばせておくのはもったいないため、メールサーバとしても使うことで妥協点を見出した。資源は有効利用すべきだし、お金がもったいないので、そのうち外形監視用のOSSでも入れようと思う。

構成

今回はDDNSサービスDNSフェイルオーバー(+ヘルスチェック)という2つの機能を両立させる。

構成を実現するために必要だったポイントは3つ。

  • 一日一回、【自宅サーバ→同期→ConohaVPS】でコンテンツ+データベースを同期

    ↑これをしないとせっかくDNSフェイルオーバーしても同じサイト内容が見れない。

  • ヘルスチェックは別のサブドメインを割当てて行う

    ↑本番ドメインはフェイルオーバーされて生き続けるのでヘルスチェックには向かない。

  • DDNSは偉大な先人達が書いたスクリプトを流用して解決

ConohaVPSでのスタンバイサーバ構築は以前書いたWordPress移行(CentOS6→CentOS7)を参考に行った。何度か作業していることもあり、難しくはなかった。これにcronで『コンテンツ+データベース』の同期設定を加えて構築した。

『コンテンツ+データベース』の同期方法は単純で、DBはdumpを用いて、ファイルはrsyncで対応した。

また、Route53でFailover機能を使う場合、ヘルスチェック先はwww.rite.jp以外でおこなう必要があった。当たり前だけど、フェイルオーバーされるとwww.rite.jpは生きつづけてしまうため、ヘルスチェック参照先として役に立たない。

そのためヘルスチェック用として新たにサブドメインddns.rite.jpを切った。www.rite.jpのAliasレコードをddns.rite.jpに設定する。ddns.rite.jpのAレコードは自宅サーバIPとし、ttlは60以下にした。

ちなみにRoute53を利用したDDNS化については、スクリプトのローカライズに手間取るも、きちんと導入できた。

検証とまとめ

意図的に自宅サーバ側のapacheを落としてみたところ、Route53のヘルスチェックが走るタイミングで異常を検知、スタンバイサーバ側へDNSが切り替わった。若干のラグを感じたので、Failure threshold値を3→2に変更した。

Failure threshold: Route 53のヘルスチェック試行回数

ちなみにRequest intervalは30秒であり、これを10秒に変更するには追加料金がかかるので断念した。

Request interval: Route 53のヘルスチェックリクエスト間隔

冗長化費用の概算は下記のようになった。

VPS:900円+Route53:200円=1100円(月額

なんとかこの程度の出費なら我慢できるというレンジにおさまった。せっかくなのでこの冗長化を活用して自宅サーバをバンバン落とし、今までできなかったサーバメンテナンスや自宅ラック整備をしていきたい。