WordPressのDB冗長化で障害が発生しても継続稼働させる方法

WordPressのDB冗長化で障害が発生しても継続稼働させる方法

  • このエントリーをはてなブックマークに追加

こんにちは!

とあるWordPress案件で、ダウンタイムは短くしたいよね!ってことで、冗長構成WEB2台DB2台(Master-Slave)にしました。
今回は、データベースの冗長化部分を紹介します。
といっても、難しいことはなにもありません。HyperDBというプラグインがあるので、設置と設定だけです。

冗長化とは?
何らかのシステム障害が万が一発生した場合に備えて、一部の設備が故障してもシステム機能を維持してサービスを提供できるようにすることです。

流れとしては、次のような感じ。

(1)ダウンロード
(2)設定(ファイル編集)
(3)設置動作確認
(4)動作確認

それでは、いってみましょー。

まずはダウンロード

HyperDBは通常のプラグインとはちょっと違い(「ドロップイン」という)、管理画面でぽちぽちしてインストールするわけではありません。
まずは、『WordPress.ORG』のHyperDBのページからプラグインをダウンロードします。

HyperDBプラグインのダウンロード

ちなみに、zipファイルの中身はこんな感じ。

hyperdb.zip
 ├─ db-config.php # DBへの接続設定(※あとで編集します)
 ├─ db.php        # 実際の処理プログラム
 └─ readme.txt    # ドキュメント

次は、設定です。

続きを読む

設定

編集しなければならないファイルが2つあります。
・wp-config.php(WordPressに元から入ってるファイル)
・db-config.php(ダウンロードしたzipの中に入ってるファイル)

ファイルを編集する前に各DBサーバー(MasterDB・SlaveDB)の前提条件や情報を下記サンプルのようにまとめておきます。
・MasterDB-SlaveDB間はレプリケーション設定をしておく。
・データベース名:database_name
・MasterDB・SlaveDBへの接続ユーザー・パスワードは共通(別でも問題ないですが同じ前提で話を進めます)。
 接続ユーザー:username
 接続パスワード:password
・各データベースのIP
 MasterDBのIP:192.168.●.1
 SlaveDBのIP:192.168.●.2
・データベースへの接続ポートはデフォルトの「3306」とする。

wp-config.phpの編集

本来は、次の一行を追記するだけです。

define('DB_CONFIG_FILE', ABSPATH . 'db-config.php');

が、2台目のサーバーの接続情報を別のファイルに書くことになり情報が散らばるため、このファイルにその情報も記述します。

編集前

この部分を編集します。

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');

/** MySQL database username */
define('DB_USER', 'username_here');

/** MySQL database password */
define('DB_PASSWORD', 'password_here');

/** MySQL hostname */
define('DB_HOST', 'localhost');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

編集後

編集・追記した個所は、「// コメント」の形式で補足してます。

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'database_name'); // 編集:データベース名

/** MySQL database username */
define('DB_USER', 'username'); // 編集:接続ユーザー名

/** MySQL database password */
define('DB_PASSWORD', 'password_here'); // 編集:接続パスワード

/** MySQL hostname */
define('DB_HOST', '192.168.●.1');       // 編集:MasterDBのIP
define('DB_HOST_SLAVE', '192.168.●.2'); // 追記:SlaveDBのIPを定義。

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

define('DB_CONFIG_FILE', ABSPATH . 'db-config.php'); // 追記

db-config.phpの編集

編集前

210行目ぐらいからある記述部分を編集します。

/**
 * This is the most basic way to add a server to HyperDB using only the
 * required parameters: host, user, password, name.
 * This adds the DB defined in wp-config.php as a read/write server for
 * the 'global' dataset. (Every table is in 'global' by default.)
 */
$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,
));

/**
 * This adds the same server again, only this time it is configured as a slave.
 * The last three parameters are set to the defaults but are shown for clarity.
 */
$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,
));

編集後

編集・追記した個所は、「// コメント」の形式で補足してます。

/**
 * This is the most basic way to add a server to HyperDB using only the
 * required parameters: host, user, password, name.
 * This adds the DB defined in wp-config.php as a read/write server for
 * the 'global' dataset. (Every table is in 'global' by default.)
 */
$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,                 // 追記:デフォルト値なので、書かなくてもOK
	'read'     => 2,                 // 追記:SlaveDBを優先的に使用
));

/**
 * This adds the same server again, only this time it is configured as a slave.
 * The last three parameters are set to the defaults but are shown for clarity.
 */
$wpdb->add_database(array(
	'host'     => DB_HOST_SLAVE,     // 編集:SlaveDBのHOSTを設定
	'user'     => DB_USER,
	'password' => DB_PASSWORD,
	'name'     => DB_NAME,
	'write'    => 0,
	'read'     => 1,
	'dataset'  => 'global',
	'timeout'  => 0.2,
));

オプションについては、同ファイルのコメントを見てほしいのですが、
readの値についてちょっと触れておきます。
・0:そのデータベースからは、読み込まない。
・1以上:そのデータベースから読み込みをする。
ここで注目したいのが、1より大きな値を設定することにより接続の重みづけができます。
より小さい値のサーバーへの接続が優先されます。

上記の編集後のように、
MasterDB:read => 2
SlaveDB:read => 1
と設定した場合、SlaveDB → MasterDB の順番で接続を試みます。
MasterDBへの接続も失敗した場合に、初めて『データベース接続エラー』になります。
※writeの値も同様の動作をしますが、この動作をさせるには、データベースの設定をmulti-masterにする必要があります。

準備は整ったので、いよいよ設置です。

設置

計3ファイルを設置します。

db-config.php(zipに入っていたものを編集したファイル)

wp-config.phpなどのファイルと同じ階層に設置します。

db.php(zipに入っていたファイル)

wp-contentディレクトリの中。pluginsやthemesディレクトリと同じ階層に設置します。

wp-config.php

編集したものを、もともとある場所のファイルと置き換えます。

最後に、動作確認です。

動作確認

データベースを停止・起動できる環境なら、片方ずつ停止した状態でサイトを確認してみてください。
レンタルサーバなどで、DBの停止・起動ができない環境であれば、wp-config.phpファイル内の、「DB_HOST」「DB_HOST_SLAVE」に設定した値(IP)を適当な値に変えてテストするのがよいと思います。

おわりに+補足

管理画面から簡単に導入できるものではないですが、今回、紹介させていただいたHyperDBの他にも、ドロップインのプラグインはあります。
ドロップインのプラグインはwp-contentディレクトリに特定の名称のPHPファイルを設置(※wp-config.phpに追記が必要なものもある)することで、WordPressが本来の動作をする前に処理をさせることができます。
・キャッシュ機構の追加
・データベースクラスのカスタマイズ ← 今回はコレ
・メッセージのカスタマイズ
 ・データベース接続エラー画面
 ・メンテナンス中画面
・マルチサイト機能のカスタマイズ
などなど。

実は、今回の案件では、他にもドロップインを使ってカスタマイズを行ったので後々紹介できたらと思います。

※執筆時点の、『WordPress』のバージョンは3.8.1です。
※執筆時点の、『HyperDB』のバージョンは1.1です。

  • このエントリーをはてなブックマークに追加

記事作成者の紹介

jimmy(システムエンジニア)

プログラムやインフラはSONICMOOVに入社してから覚えました!

関連するSONICMOOVのサービス

システムエンジニア募集中!

×

SNSでも情報配信中!ぜひご登録ください。

×

SNSでも
情報配信中!
SONICMOOV Facebookページ SONICMOOV Twitter
システムエンジニア募集中!

新着の記事

mautic is open source marketing automation