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

#今回の設定条件
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