たった30分でWordPressを冗長化する方法


wordpress突然ですが、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の冗長化作業は終了です。それでは確認してみましょう。

 

■ 確認項目

  1. Master側で記事を投稿し、Slave側にも記事が反映されていること
  2. Slave側で記事を投稿し、Master側にも記事が反映されていること
  3. Slave側のmysqldを止めても、サイト閲覧に問題がないこと
  4. Slave側のmysqldを止めても、記事の投稿ができること
  5. Master側のmysqldを止めても、サイト閲覧に問題がないこと

ここまで確認できれば、WordPressの冗長化は終了です。ね、簡単でしょう?

たった30分でWordPressを冗長化する方法”に関する1件のコメント

  1. ピングバック

コメントは受け付けていません。