MySQL HyperDB + Keepalivedを利用した、wordpress の負荷分散
当記事、2012年に書いた記事になりますので、hyperdbがあるかないのかもわかりませんが、当方で活用する案件が発生しましたので、再アップしました。
思っていたより簡単にできた、そして結果からいいますと、思っていたよりパフォーマンスがよく無かった記憶があるのですが、こちらで検証したチープな環境だったからでしょう。。。きっと
表題の通り、wordpressのデータベースを、MySQL レプリケーションを駆使して負荷分散する際に活用できるプラグインです。それプラスといってはなんですが、KeepAlived(LVS)を間にはさんで、スケールアウトしやすい構成にしていました、以下の構成図になります。
- データベースは、MASTER :1台 SLAVE :3台 の構成
- 更新用のVIP(192.168.101.80)、参照用のVIP(192.168.0.70)の二種類を利用し、参照用のVIPでロードバランシングを行う
- HyperDBの設定を、MASTER用、SLAVE用に分ける
とまあ、こんな感じです。MySQLのレプリケーションや、KeepAlivedの設定については割愛させていただきます。
以下、HyperDBの設定手順です。
- HyperDBのダウンロード http://wordpress.org/extend/plugins/hyperdb/ からHyperDBプラグインをダウンロードし、解凍します。
- 以下のファイルが展開されます。
-rw-r--r-- 1 root root 14486 7月 27 13:05 db-config.php -rw-r--r-- 1 root root 28653 7月 13 23:37 db.php -rw-r--r-- 1 root root 5605 7月 13 23:37 readme.txt
- db-config.phpをwordpressルートディレクトリにコピーし、以下の通り編集します。
# cp /usr/local/src/hyperdb/db-config.php /var/www/html/wordpress/# vi /var/www/html/wordpress/db-config.php /** Sample Configuration 1: Using the Default Server **/ /** NOTE: THIS IS ACTIVE BY DEFAULT. COMMENT IT OUT. **//** * 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.) */ /* こちらにはMASTERの設定を記載します */ $wpdb-add_database(array( 'host' = DB_HOST, 'user' = DB_USER, 'password' = DB_PASSWORD, 'name' = DB_NAME, 'write' = 1, 'read' = 0, ));/** /* こちらはSLAVEの設定を記載します */ * 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' = '192.168.101.70', 'user' = DB_USER, 'password' = DB_PASSWORD, 'name' = DB_NAME, 'write' = 0, 'read' = 1, ));
- db.php を所定の場所にコピーします
# cp /usr/local/src/hyperdb/db.php /var/www/html/wordpress/wp-content/
- wp-config.phpを編集します
# vi /var/www/html/wordpress/wp-config.php // replication setting define('DB_NAME', 'wordpress'); define('DB_USER', 'dbuser'); define('DB_PASSWORD', 'yourpassword'); define('DB_HOST', '192.168.101.80'); define('DB_CHARSET', 'utf8'); define('DB_COLLATE', ''); define('DB_CONFIG_FILE', ABSPATH . 'db-config.php');// ** MySQL 設定 - こちらの情報はホスティング先から入手してください。 ** // /** WordPress のためのデータベース名 */ // define('DB_NAME', 'wordpress');/** MySQL データベースのユーザー名 */ // define('DB_USER', 'dbuser');/** MySQL データベースのパスワード */ // define('DB_PASSWORD', 'yourpassword'); /** MySQL のホスト名 */ // define('DB_HOST', '192.168.101.80'); /** データベースのテーブルを作成する際のデータベースのキャラクターセット */ // define('DB_CHARSET', 'utf8'); /** データベースの照合順序 (ほとんどの場合変更する必要はありません) */ // define('DB_COLLATE', '');
- 以上で設定は終了です
実際に負荷分散されているか確認してみる。
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags - RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.101.70:3306 rr - 192.168.101.43:3306 Route 10 6 13 - 192.168.101.42:3306 Route 10 6 10 - 192.168.101.41:3306 Route 10 5 10 TCP 192.168.101.80:3306 rr - 192.168.101.41:3306 Route 10 2 8
ipvsadm でデータベースの負荷分散状況を見る限りでは・・うまくいっているようです。