MySQL-5.5でレプリケーションの設定をする
2013年1月12日
5.5を明記した記事が思ったより少ないので、まとめてみることにしました
レプリケーションの種類は、非同期レプリケーション、つまり普通のやつです
レプリケーションの種類は、非同期レプリケーション、つまり普通のやつです
前提
マスタ側のホスト名を master.com
スレイブ側のホスト名を slave.com
として、別サーバで運用します
スレイブ側のホスト名を slave.com
として、別サーバで運用します
MySQL-5.5は、MySQL公式のRPMからインストール
OSは、両方共にCentOS-5.8(final)
マスタ側のmy.cnfを修正
sudo mkdir -m 0777 /var/log/mysql sudo vim /etc/my.cnf ================================= [mysqld] server-id = 101 log_bin = /var/lib/mysql/bin-log ================================= sudo /etc/init.d/mysql restart
- log_bin の場所と名前はテキトーに決めました
- /etc/init.d/mysql と mysql"d" がありませんが、RPMで入れたらそうなってました
- bind-access という値が有ったらコメントアウトして下さい、そのIPからしかアクセスできないようになる設定値らしいです
マスタ側のデータを保存してスレイブ側へ送る
mysql -uroot -ppassword -e 'FLUSH TABLES WITH READ LOCK;' mysqldump -uroot -ppassword --all-databases --master-data > /tmp/mysqlall.db mysql -uroot -ppassword -e 'SHOW MASTER STATUS;' ================================= +----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------+----------+--------------+------------------+ | bin-log.000007 | 107 | | | +----------------+----------+--------------+------------------+ (*これのFileの値である 'bin-log.000007' と、Positionの値である 107 をどこかにメモする) ================================= mysql -uroot -ppassword -e 'UNLOCK TABLES;' sudo scp /tmp/mysqlall.db user@slave.com:/path/to/dir mysql -uroot -ppassword -e 'GRANT REPLICATION SLAVE ON *.* TO slave_user@`%` IDENTIFIED BY "slave_password";'
- FLUSH TABLES WITH READ LOCK はデータの更新を一時止めます
- UNLOCK TABLES でそれを戻します
- slave_user は、スレイブがマスタにアクセスする際に必要なユーザです
マスタ側のMySQL用ポートを開ける
iptablesを修正して、MySQL用のポート(デフォルト 3306)を開けて下さい
設定方法は、ググれば山ほど出てくると思います、以下は一例
設定方法は、ググれば山ほど出てくると思います、以下は一例
sudo vim /etc/sysconfig/iptables ================================= # For MySQL -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT # 下記の行より前に上記を挿入 # -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited ================================= sudo service iptables restart
スレイブ側から接続確認
まずはポートが空いているか?
sudo nmap -p 3306 master.com (.. 略 ..) PORT STATE SERVICE 3306/tcp open mysql (.. 略 ..)
- STATE が open だったらOK
- nmap が無かったら、次でわかるので特にやらないでも良いです
- ちなみに、nmap で外部をスキャンする場合は、root権限での実行が必要でした
slave_user でアクセスできるか?
mysql -h master.com -uslave_user -pslave_password (ログインできたら成功)
スレイブ側のmy.cnfを修正
マスタ側と同じです
sudo mkdir -m 0777 /var/log/mysql sudo vim /etc/my.cnf ================================= [mysqld] server-id = 102 # マスタの値を超える違う値にする log_bin = /var/lib/mysql/bin-log =================================
スレイブ側でデータのリストア
mysql -uroot -ppassword < /path/to/dir/mysqlall.db mysql -uroot -ppassword mysql> CHANGE MASTER TO MASTER_HOST='master.com', MASTER_PORT=3306, MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='{先のFIleの値}', MASTER_LOG_POS={先のPositionの値};
同期開始
以下を、順番通りに実行して下さい
- 1. マスタ側を /etc/init.d/mysql restart で再起動
- 2. スレイブ側を /etc/init.d/mysql restart で再起動
レプリケーションの確認
何でもいいのですが、思いつかなければ
マスタ側でこれらを実行して、都度スレーブ側で確認してみましょう
マスタ側でこれらを実行して、都度スレーブ側で確認してみましょう
mysql> CREATE TABLE rep_checker (id int(11)); mysql> DROP TABLE rep_checker;
ちゃんと同期出来ていれば、完了です
動いていない場合は、MySQLエラーログを確認して修正しましょう
補足
レプリケーションを手動で停止したり再開したりするには
スレイブ側のMySQLサーバで、STOP SLAVE / START SLAVE というSQLを発行します
スレイブ側のMySQLサーバで、STOP SLAVE / START SLAVE というSQLを発行します
同期を止めた後に再開したい場合は、
今度はスレーブ側で SLAVE START するだけで開始できます
しかし、詳細不明ですが一度目の START SLAVE が warning 1 になって
失敗することがあります
その場合、再度 START SLAVE をしてみると、成功するかもしれません
手順はもしかしたら、無駄なものも多分に含まれている可能性があります
テーブルロックとか、運用中じゃなければいらないかも?
ご教授いただけたら幸いです
蛇足: mysqld_multiで済ます男の人って..
前回の記事をご覧になられた方はもしかしたらと感づいているかもしれませんが、
簡単に mysqld_multi で済まそうと思ったら(そんな簡単に終わらなかったんですが)
他に検証することもあって、結局はサーバを分けざるを得なくなりました
少し先を読めばわかったはずのことで、ダメダメです
簡単に mysqld_multi で済まそうと思ったら(そんな簡単に終わらなかったんですが)
他に検証することもあって、結局はサーバを分けざるを得なくなりました
少し先を読めばわかったはずのことで、ダメダメです
面倒だからひとつのサーバで済まそうと思っている方は、
「レプリケーションを組むようなアプリなのに、障害・復旧等の検証はしなくていいの?」
というのを先に考慮して置いた方がいいと思いました!