旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

MySQL-5.5でレプリケーションの設定をする

2013年1月12日

5.5を明記した記事が思ったより少ないので、まとめてみることにしました
レプリケーションの種類は、非同期レプリケーション、つまり普通のやつです

前提

マスタ側のホスト名を master.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を発行します

同期を止めた後に再開したい場合は、
今度はスレーブ側で SLAVE START するだけで開始できます
しかし、詳細不明ですが一度目の START SLAVE が warning 1 になって
失敗することがあります
その場合、再度 START SLAVE をしてみると、成功するかもしれません

手順はもしかしたら、無駄なものも多分に含まれている可能性があります
テーブルロックとか、運用中じゃなければいらないかも?
ご教授いただけたら幸いです

蛇足: mysqld_multiで済ます男の人って..

前回の記事をご覧になられた方はもしかしたらと感づいているかもしれませんが、
簡単に mysqld_multi で済まそうと思ったら(そんな簡単に終わらなかったんですが)
他に検証することもあって、結局はサーバを分けざるを得なくなりました
少し先を読めばわかったはずのことで、ダメダメです

面倒だからひとつのサーバで済まそうと思っている方は、
「レプリケーションを組むようなアプリなのに、障害・復旧等の検証はしなくていいの?」
というのを先に考慮して置いた方がいいと思いました!