フェイルオーバーのしくみ

このエントリーをはてなブックマークに追加
はてなブックマーク - フェイルオーバーのしくみ
Share on Facebook
Post to Google Buzz
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Share on FriendFeed

PHPer.jpが障害時にどのようにサービスを継続する設計になっているかを基本的な構成で説明したレイヤー毎に説明します。

エッジレイヤのフェイルオーバー

エッジサーバには2つの対称なサーバに独立のグローバルIPが割り当てられていて、どちらでも同じように利用可能です。これらのグローバルIPはそれぞれDNSのAレコードに割り当てられています。

上図のように、エッジサーバのうちのひとつがトラブルになると、ブラウザの機能により他のサーバに切り替えが行われます。実験によると数リクエスト取りこぼすくことがあるようです。

ルーティングレイヤのフェイルオーバー

ルーティングレイヤには、対称Varnishが2台配置されています。このVarnishサーバに対し、エッジレイヤからのリクエストはラウンドロビンでリクエストされます。Varnishサーバの片方がトラブルになると、エッジサーバは自動的に正常なVarnishサーバに切り替えを行います。

現在はそれぞれ独立したキャッシュを持っているためキャッシュヒット率が下がりますがこれは将来的に改善予定です。

アプリケーションレイヤのフェイルオーバー

PHPer.jpのアプリケーションレイヤのフェイルオーバーのしくみの理解は重要です。

PHPer.jpの管制をしているUmeboshiはアプリケーションサーバの動作を監視しており、アプリケーションサーバに異変があると、
該当サーバを廃棄し新しいサーバを割り当てます。割り当て後gitのリポジトリから自動的にソースコードをデプロイします。

つまり、PHPer.jpでは PHPアプリケーションは完全にgitにより構成管理されており、デプロイした時点で動作するように構成する必要があります。逆に言うとアプリケーションをgitにより完全に復元可能な状態にしておけばアプリケーションサーバを複数台構成にしなくてもある程度の耐障害性を得ることができます。

データベースサーバのフェイルオーバー

PHPer.jpの管制をしているUmeboshiはデータベースサーバの動作を監視しており、MySQLのフェイルオーバーについては非同期のレプリケーションを利用しています。マスターデータベースサーバがトラブルになると、スレーブがマスターに昇格することでサービスを継続します。

以上、PHPer.jpのフェイルオーバーのしくみをざっくり説明させていただきました。ユーザサービスに直接かかるところを重点的に設定してあります(逆に、gitやUmeboshiの冗長化は出来ておりません)。ご質問などありましたらコメント欄などでお知らせ下さい。

  • DAISUKE

    はじめまして。
    PHPer.jp、最近知りましたが良さそうなサービスですね!
    PHPは好きでコーディングも出来るので、サービスを利用できるかなと思っています。

    で、二点ほど質問させてください。

    一点目は、
    本記事とも若干関連するかもですが、ツイッターで障害が出ている旨のツイートがありました。どういう類の障害なのでしょうか?

    二点目は、
    Virnishと、nginxって同じような機能を提供していると思ったのですが、分ける理由って何でしょう。

    どちらもよければできるだけ詳しく知りたいです。
    面倒な質問ですいません。。お忙しいと思うので、お手すきの時にでも。