EC2で冗長構成のWordPressサイトを構築する

前の記事の最後にも書いてありますが、ロードバランシングの設定をしただけでは実用的ではなくて、同期もする必要があります。 今回は同期の設定をして、冗長構成のWordPressサイトを作っていきたいと思います。

データベースの同期

同期の方法としては、2つのインスタンスに別々にmysqlを入れてレプリケーションという機能を用いて同期することも可能ですが、今回はAmazon RDSのマルチAZという機能を用いて同期する方法を使います。

下の図のような構成が目標です。

実は、前記事にロードバランシングについて書いてあって、マルチAZの記事もあるので、だいたいその2つを組み合わせるだけです。

まず、マルチAZの記事に従ってRDSの設定を行います。そして、この記事を参照して、WordPressからRDSを参照できるようにします。 この際、RDSのセキュリティグループには気をつけてください。EC2インスタンスのグローバルIPを許可しても、実はプライベートIPで通信が行われていて、RDSにつながらないーというようなことが起こったりします。

ファイルの同期

実はデータベースの同期だけでは十分ではありません。画像ファイルはデータベースではなく、EC2側に保持されるためです。

ファイルの同期には、lsyncdとrsyncを用いた方法がよく使われます。ですが簡単のため、あまりスマートではないけれど比較的わかりやすい方法を紹介します。

マスターとスレーブにrsyncをインストールして以下のコマンドを実行するだけです。cronでこのコマンドを実行すれば、数分程度は遅延がありますが、おおよそマスターとスレーブのファイルが同期されることになります。

rsync -avz (--delete) (-i 秘密鍵) マスターのユーザー名@マスターのIPorドメイン名:マスターのディレクトリ スレーブのディレクトリ

なお、このコマンドはマスター、スレーブ間でssh接続ができる必要があります。 また、–deleteをつけない場合は、ファイルの新規作成と内容の変更のみをコピーできますが、ファイルの削除は反映されません。–deleteをつけるときは、意図せぬ削除をしないように十分注意しましょう。

管理画面へのアクセス

ここまでは、最も単純なロードバランシングを使っていていて、あらゆるアクセスはマスターとスレーブに均等に振られます。 しかし、管理画面へのアクセスが均等に振られては、編集をマスター、スレーブ両方で行った場合にコンフリクトして予期せぬ事が起こる可能性があります。 よって、できれば管理画面へのアクセスをマスターの側のみにしたいところです。

これは、ELBの設定を少しいじるだけで簡単に実現することができます。

まず、今あるターゲットグループとはべつに、マスターのインスタンスのみが属するターゲットグループを作成します。

そして、使っているロードバランサの「リスナー」欄の「ルールの表示/編集」欄をクリックします。

すると、ルールの編集の画面になります。ここで、「+」マークをクリックして後、「ルールの挿入」をクリックします。

続いて、IFの「条件の追加」をクリックし、「/wp-admin/*」というパスを設定します。

最後にTHENの「アクションの追加」をクリックし、転送先としてマスターのみが属するターゲットグループを設定します。

このように設定することで、wp-adminディレクトリ内のファイルにアクセスする際には必ずマスターの方にアクセスするようにできます。