HyperDBでWordPressとMySQLのレプリケーションを組み合わせて使う

MySQLのレプリケーションとWordPressを組み合わせて使う方法のメモ。
これにより負荷分散と冗長化を実現できる。

以下構成に関する備考。

  • WordPress 3.0.1
  • MySQLのレプリケーションはMaster/Slave構成でセットアップ
  • 書き込みはMasterにのみ
  • 読み込みは両方から

インストール手順

一般的なプラグインとは違ってwp-content/plugins以下にファイルを設置する形ではないので少々めんどくさい。
基本はここに書かれている通り。

  • hyperdb.zipを落としてきて展開
  • db-config.phpを作成
  • wp-config.phpを編集してdb-config.phpを読み込むようにする
  • db.phpをwp-content以下に設置
hyperdb.zipを落としてきて展開
cd /tmp
wget http://downloads.wordpress.org/plugin/hyperdb.zip
unzip hyperdb.zip
cd hyperdb
db-config.phpを作成

ひな形があるのでコピーして編集する。

$ cp db-config.php /var/www/wordpress/db-config.php
$ vi /var/www/wordpress/db-config.php

データベース設定部分を編集。
Masterにのみ書き込み可能として、Slaveは読み込みのみとする。

$wpdb->add_database(array(
        'host'     => DB_HOST,
        'user'     => DB_USER,
        'password' => DB_PASSWORD,
        'name'     => DB_NAME,
        'write'    => 1,
        'read'     => 1,
));

$wpdb->add_database(array(
        'host'     => 'slavedb.example.com',
        'user'     => DB_USER,
        'password' => DB_PASSWORD,
        'name'     => DB_NAME,
        'write'    => 0,
        'read'     => 1,
));

writeとreadというフラグで読み書きのオンオフを設定。
add_databaseを繰り返せば3台目以降も追加できるはず。

他にもいろいろ設定できるぽいがひとまず不要なので割愛。

wp-config.phpを編集してdb-config.phpを読み込むようにする
$ vi /var/www/wordpress/wp-config.php

データベース設定部分にちょいっと付け足す。

define('DB_NAME', 'wordpress_db');
define('DB_USER', 'wordpress_db_user');
define('DB_PASSWORD', 'wordpress_db_password');
define('DB_HOST', 'masterdb.example.com');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
define('DB_CONFIG_FILE', ABSPATH . 'db-config.php');
db.phpをwp-content以下に設置

最後にdb.phpを設置することでHyperDBが有効になる。

$ cp db.php /var/www/wordpress/wp-content/db.php

動作確認

負荷分散の確認

一時的にレプリケーションを止めて新しい記事を投稿してリロードを繰り返すと記事が表示されたりされなかったりすることを確認。
これはつまりMaster側から読んだときは表示されて、Slave側から読んだときは表示されない。

確認が終わったらレプリケーションを再開して常に記事が表示されるようになることを確認。

Masterが落ちたとき

Master側を落としてもサイトの閲覧が問題なくできることを確認。
書き込みはできないので投稿したりコメントしようとするとエラーとなり失敗する。

アクセスカウンターなどアクセスの都度DBに書き込むようなプラグインを使っている場合は動かなくなるだろう。

Slaveが落ちたとき

Slave側を落としてもサイトの閲覧および書き込みが問題なくできることを確認。
書き込みもできるのでサイトの機能は損なわれない。(ただし負荷分散できなくなった分性能は低下する)

次の記事

VimでJavaScript