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