Help us understand the problem. What is going on with this article?

WordPressをlsync+rsyncとHyperDBを使って冗長化

More than 5 years have passed since last update.

今回の設定条件

CentOS 6.6
MySQL 5.6
MasterサーバIP:192.168.10.1
SlaveサーバIP:192.168.10.2
WordPressインストール&初期設定済み

データベースの同期化

Masterサーバ側の作業

MySQLの設定ファイルを編集

# vi /etc/my.cnf
----
[mysqld]
#バイナリログ取得
log-bin
#識別ID(任意)
server-id=1
---

再起動

# /etc/rc.d/init.d/mysqld restart

MySQLに接続

# mysql -u root -p

Slaveサーバから接続するためのユーザーを追加
syncは任意のユーザー名

mysql> GRANT REPLICATION SLAVE ON *.* TO sync@192.168.10.2 IDENTIFIED BY 'パスワード'

TABLEをロックしておく

mysql> FLUSH TABLES WITH READ LOCK
mysql> SHOW MASTER STATUS;

+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mysqld-bin.000001 |       99 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

ファイル名(File)とログ内の現在地(Position)が表示されるので記録しておく。

データベースをバックアップ

# cd /var/lib/mysql/
# tar zcvf db_backup.tar.gz データベース名

圧縮したファイルをSlave側にコピーしておく

ロック解除

# mysql -u root -p
mysql> UNLOCK TABLES;

Slaveサーバ側の作業

MySQLを停止

# /etc/rc.d/init.d/mysqld stop

元のデータベースを退避しておく

# cd /var/lib/mysql/
# mv データベース名 データベース名.org

コピーしておいたファイルを解凍

# tar zxvf db_backup.tar.gz

MySQLの設定ファイルを編集

# vi /etc/my.cnf
-----
[mysqld]
server-id=2
-----

mysql5.6でuuidを独自に保持するようになったので値を保持しているファイルを削除しておく。

# mv auto.cnf auto.cnf.org

MySQLを起動

# /etc/rc.d/init.d/mysqld start

レプリケーションの開始

Slave側

mysql> CHANGE MASTER TO
       MASTER_HOST='192.168.10.1', ←Master側IP
       MASTER_USER='sync', ←Masterに接続するユーザー名
       MASTER_PASSWORD='パスワード',
       MASTER_LOG_FILE='mysqld-bin.000001', ←Masterで記録していたFile
       MASTER_LOG_POS=99; ←Masterで記録していたPosition

mysql> START SLAVE;

Master側のTableを適当にINSERTなどしてみてSlave側のTableが変更されるか確認する。

Slave側の /var/log/mysqld.log に

[ERROR] Slave I/O: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 159

こんなエラーが出る場合は、auto.cnfの削除が抜けているかもしれないので確認。

同期を止めたい場合は

mysql> STOP SLAVE

WordpressにHyperDBプラグインを設定

MasterとSlave両方で設定

適当な場所にプラグインをダウンロードして解凍

# wget http://downloads.wordpress.org/plugin/hyperdb.zip
# unzip hyperdb.zip

解凍されたファイルを書くフォルダにコピー

# cp db-config.php [WORDPRESSのインストールディレクトリ]
# cp db.php [WORDPRESSのインストールディレクトリ]/wp-content/

db-config.phpの設定
217行目から
※viで行番号を表示したい場合は
:set number

$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'     => 2,  //追加
));

/**
 * 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,  //書き換え
        'user'     => DB_USER,
        'password' => DB_PASSWORD,
        'name'     => DB_NAME,
        'write'    => 0,
        'read'     => 1,
        'dataset'  => 'global',
        'timeout'  => 0.2,
));

wp-config.phpを編集

# vi wp-config.php

/** MySQL のホスト名 */
define('DB_HOST', '192.168.10.1');
define('DB_HOST_SLAVE', '192.168.10.2');

Wordpressにアクセスして接続テストをしてみる
インストール画面などになってしまう場合は、データベースの接続がうまくいっていない。

mysqlがlocalhostと127.0.0.1しか許可していないので
自分のIPも含めて接続許可を追加する。

Master/Slaveともに(だけど、すでに冗長化されているのでSlaveの方は自動的に追加されるはず)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'WordPressのDBにアクセスするユーザー名'@'192.168.10.1' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'WordPressのDBにアクセスするユーザー名'@'192.168.10.2' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;

うまくいかない場合はphpMyAdminのユーザー管理画面から設定しほうがわかりやすいかも

WordPressの投稿を更新してみるなどして、同期がとれているかテスト
片側のサーバを停めてみるなどしてテスト

ファイルの同期化

データベースの同期ができたので、次はメディアファイルなどを同期するための設定
rsync + lsyncでApacheのDOCUMENT ROOTを同期させる

Slaveサーバ側の設定

rsyncはすでにインストールされていたのだけど
CentOSではxinetd経由で起動するのでxinetd をインストール

# yum -y install xinetd

rsyncd.confを設定

# vi /etc/rsyncd.conf
--------------------------
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

#任意の名前、Maseter側で使う
[wordpress]
#同期したいフォルダ
path = /var/www/html
#Master側のIP
hosts allow = 192.168.10.1
hosts deny = *
list = true
uid = root
gid = root
read only = false
-------------------------

xinetdスタート

# /etc/rc.d/init.d/xinetd start

自動起動にセット

# chkconfig xinetd on

Masterサーバ側の設定

lsyncをインストールするのにyumリポジトリにrpmforgeを追加

# rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

インストール

# yum install rsync lsyncd --enablerepo=rpmforge

lsyncd.conf設定

# vi /etc/lsyncd.conf
--------------------------
settings = {
        logfile    = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 1,
}

sync{
        default.rsync,
        source = "/var/www/html/",
        target = "192.168.10.2::wordpress",
        excludeFrom = "/etc/rsync_exclude.lst",
}
-------------------------

target = "192.168.10.2::homepage"
Slave側のIPと[ ] に書いた名称

excludeFromは除外したいファイルを設定する。

除外リストrsync_exclude.lstを作成
相対パスで、ファイル名またはフォルダ名を記入

# vi /etc/rsync_exclude.lst
--------------------------
/wordpress/wp-config.php
-------------------------

例でwp-config.phpを設定しているが今回の場合であればいらない。
自分の環境に合わせて同期させたくないファイル・フォルダを記入する。

lsyncdスタート

# /etc/rc.d/init.d/lsyncd start

自動起動設定

# chkconfig lsyncd on

tailコマンドでログを見ながらFTPでMaster側にファイルをアップロードしてみましょう。

初回起動時はSlave側に一気にファイルを送る場合があるのでサーバ負荷に注意しましょう。先にSlave側もFTPでファイルをアップロードしておいたほうがいいかも。

この設定のままだとSlave側はrootユーザーでファイルがアップロードされてしまうのでrsyncd.confのuid/gidをapacheユーザにするほうがいいかも。
ただしapacheユーザーでSlave側にSSH接続できないとダメ?(未確認)

参考サイト

株式会社ソニックムーブのスタッフブログ
http://lab.sonicmoov.com/development/database/wordpress-db-redundant/

dogmap.jp
http://dogmap.jp/2013/10/28/wordpress-with-hyperdb/

(っ´∀`)っ ゃー | nullpopopo
http://nullpopopo.blogcube.info/2012/08/%E3%81%9F%E3%81%A3%E3%81%9F30%E5%88%86%E3%81%A7wordpress%E3%82%92%E5%86%97%E9%95%B7%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html

レンタルサーバー・自宅サーバー設定・構築のヒント
http://server-setting.info/centos/lsyncd-rsync-realtime.html

システムエクスプレス株式会社
http://www.systemexpress.co.jp/centos/lsyncrsync.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした