突然ですが、WordPressを冗長化したいと思いませんか?1台サーバが落ちてもサービス影響を最小限に、しかもサーバ代以外のお金をかけず冗長化できる方法があるんですよ奥さん。
■ NW構成
下記の図のようなNW構成で実現可能です。
DBはマルチマスタにせず、マスターDBはServer #1 とし、Server #2、および以降スケールアウトするマシンはすべてSlaveとします。
■ 障害パターン
Server #2 の全体障害および部分障害がおきても、DNSラウンドロビンによりServer #1へアクセスした場合は影響がありません。Server #2のMySQLが落ちていても、Server #1のMySQLが生きている限り影響はありません。Server #1の全体障害およびDB障害の際は、エントリの投稿やコメントをつけたりなどの更新系は止まっても、サイト閲覧には支障ありません。
■ 用意するもの
WEB+DBサーバ 2台 ( CentOS 6.3 にて動作確認済 )
Master = 192.168.0.10 Slave = 192.168.0.11 WordPress ( http://ja.wordpress.org/よりダウンロード ) HyperDB ( http://wordpress.org/extend/plugins/hyperdb/よりダウンロード )
■ まずは普通に WordPress をインストールする
2台のサーバに、WordPress をインストールします。ApacheやMySQL、PHPのパッケージはそれぞれOSの標準リポジトリからインストールで大丈夫ですが、バーチャルホストのServerNameだけは同じ値にしておいてください。この時点で特別な設定は何一つ不要です。 wp-config.php のホスト名は、2台ともlocalhostのままでOKです。
さて、2台のサーバでそれぞれ動作確認ができたら、DBのレプリケーション設定を行います。
■ MySQLのレプリケーション設定
とみぞーノート さんの手順そのままでOKです。いわゆる「Master-Slave構成」というやつを構築します。2台のサーバで異なる設定を投入するので、各手順の前に [Master] [Slave] を書いておきます。
● [Master] /etc/my.cnf の[mysqld]セクションに、バイナリログ取得設定とサーバIDを追加
# vi /etc/my.cnf [mysqld] log-bin server-id=1
設定反映後、mysqldを再起動します。
● [Master] レプリケーション用アカウント作成
SlaveからMasterへ接続する際のアカウントを、Master側で作成しておきます。mysqlにログイン後、以下のコマンドを実行します。パスワードは一例ですので必ず変更してくださいね。
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@192.168.0.10 BY 'PASSWORD-HOGEHOGE';
● [Master] テーブルに書き込みロックを行う
Master側のデータを手動コピーする前に、テーブルロックを行います。
mysql> FLUSH TABLES WITH READ LOCK;
● [Master] バイナリログの確認を行う
バイナリログの名前(File)と位置(Position)を確認します。テーブルロック中にやらないと、どんどん数字がインクリメントされてしまうので注意しましょう。
mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | mysqld-bin.000001 | 106 | | | +-------------------+----------+--------------+------------------+
● [Master] データベースをtarコマンドでバックアップする
Master側のデータベースを手動バックアップし、Slave側へSCPなどで転送します。
# cd /var/lib/mysql # ls -l | grep <WordPressのDB> # tar czf <WordPressのDB>.tar.gz <WordPressのDB>
● [Master] テーブルロックを解除する
mysql> UNLOCK TABLES;
マスター側のMySQL設定は以上になります。続いてSlave側の設定を行います。
● [Slave] 静止状態を確保し、データベースをコピーする
Master側からコピーしてきたアーカイブを展開します。書き込みを防止するため、mysqldは止めておきましょう。
# /etc/init.d/mysqld stop # cd /var/lib/mysql # mv <WordPressのDB> <WordPressのDB>.orig # tar xvzf <WordPressのDB>.tar.gz
● [Slave] Slave側のmy.cnfにserver-idを設定し、mysqldを再起動する
Master側と同じく、[mysqld]セクションにserver-idを追加します。他のサーバと被らないようにしましょう。
# cp -p /etc/my.cnf /etc/my.cnf.orig # vi /etc/my.cnf server-id=2 # /etc/init.d/mysqld start
● [Slave] Master側へ接続するためのパラメータを設定する
SlaveとなるMySQLサーバへログインし、以下SQL文を投入します。
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.10' MASTER_USER='repl' MASTER_PASSWORD='PASSWORD-HOGEHOGE' MASTER_LOG_FILE='mysqld-bin.000001' MASTER_LOG_POS=106;
● [Slave] レプリケーションを開始する
以下のコマンドを実行し、192.168.0.11のほうのサーバをSlaveにします。
mysql> START SLAVE;
■ [Master][Slave] HyperDB のダウンロードとファイルコピー
以降の作業は、MasterとSlaveの両方で実施します。
// アーカイブのダウンロード
# wget http://downloads.wordpress.org/plugin/hyperdb.zip # unzip hyperdb.zip
// ファイルコピー
# cp -p db-config.php <WordPressインストールディレクトリ> # cp -p db.php <WordPressインストールディレクトリ>/wp-content/
■ [Master][Slave] db-config.php 設定
Master側とSlave側の動作を設定します。ソース内の赤太文字が追加部分となります。
# cd <WordPressインストールディレクトリ> # vi db-config.php
217~224行目周辺 修正前
$wpdb->add_database(array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME,));
217~224行目周辺 修正後
$wpdb->add_database(array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, 'write' => 1, 'read' => 1,));
230~239行目周辺 修正前
$wpdb->add_database(array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, 'write' => 0, 'read' => 1, 'dataset' => 'global', 'timeout' => 0.2, ) );
230~239行目周辺 修正後
$wpdb->add_database(array( 'host' => DB_HOST_RO, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, 'write' => 0, 'read' => 1, 'dataset' => 'global', 'timeout' => 0.2, ) );
■ [Master][Slave] DB接続先変更
Master、Slaveの両方で、DB接続先を変更します。
# cd <WordPressインストールディレクトリ> # cp -p wp-config.php wp-config.php.orig # vi wp-config.php
修正前
define('DB_HOST', 'localhost');
修正後
//define('DB_HOST', 'localhost'); define('DB_HOST', '192.168.0.10'); define('DB_HOST_RO', '192.168.0.11');
以上でWordPressの冗長化作業は終了です。それでは確認してみましょう。
■ 確認項目
- Master側で記事を投稿し、Slave側にも記事が反映されていること
- Slave側で記事を投稿し、Master側にも記事が反映されていること
- Slave側のmysqldを止めても、サイト閲覧に問題がないこと
- Slave側のmysqldを止めても、記事の投稿ができること
- Master側のmysqldを止めても、サイト閲覧に問題がないこと
ここまで確認できれば、WordPressの冗長化は終了です。ね、簡単でしょう?
ピングバック
たった30分でWordPressを冗長化する方法 » (っ´∀`)っ ゃー | ちゅどん道中記