1.レプリケーションの設定と管理
メリット
①MasterがダウンしたときにSlaveを利用することでダウン時間を短くできる。
②負荷分散
③SlaveサーバでのDBバックアップ
(Slaveでバックアップをとることで、Masterで書き込みロックする必要がなくなる)
■レプリケーションのプロセス
①最初にDBの内容を同期
②Masterサーバで実行された更新系のクエリをSlaveに渡す
③Slaveで同じクエリを実行させ、DBを同期させる。
■Master側
Master側で実行された更新系クエリ
→バイナリログに蓄えられている
→Slave側が接続してきたら、前回の接続からの変更分をSlave側に送信する。
■Slave側
→受け取ったクエリを一旦リレーログに蓄える
→順次クエリを実行してDBを同期
※レプリケーション動作にはBinlogDump, I/O, SQLの3つのスレッドが連動して動作する。
----
Slaveサーバ、レプリケーション開始時、
→Masterに接続して前回レプリケーションが完了時以降の変更クエリをMasterから受け取る
→DBに反映
※このため、Slaveは常時Masterに接続しておかなくてもよい。
Slaveを再起動させたとしてもMasterに再接続すれば自動でDBが同期される。
ただし、変更分が大きくなると同期が完了するのに時間がかかる可能性がある。
ただし、変更分が大きくなると同期が完了するのに時間がかかる可能性がある。
■設定手順(Master-Slave構成)
①Master側の設定の確認
※バイナリログを採取しておく必要がある。
1.my.cnf log-bin確認
[mysqld]
log-bin (binlog採取指定)
server-id=1 (識別ID、任意、ユニーク)
②アカウントの作成
1.Slave→Master接続するアカウントの権限(REPLICATION SLAVE権限保持)
(Master側で)
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.0.0.2 IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.0.0.2 IDENTIFIED BY 'password';
③DBのバックアップ
1.MasterデータをSlaveにコピー(DB書き込みロック)
(Master側で) mysql> FLUSH TABLES WITH READ LOCK;
2.現在のbinlogの状態確認(ロック中に)
(Master側で) mysql> SHOW MASTER STATUS; +-----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-----------------+----------+--------------+------------------+ | tank-bin.000001 | 79 | | | +-----------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
3.現在のbinlogのファイル名とlog内の現在位置が表示されるので、記録しておく。
(slaveを起動するとき必要)
4.Master側のDBバックアップ
(DBはロック中なのでtarで固める。)
(Master側で) # cd /var/lib/mysql/ <== MySQLのデータディレクトリへ移動 # tar cvf ~/friendDB.tar friendDB <== データベースをバックアップ
5.DBバックアップ完了後、ロック解除
(Master側で) mysql> UNLOCK TABLES;
④DBのコピー
1.③のバックアップをSlaveに持っていく。
2.tarなどで持っていき展開
(Slave側で)
# cd /var/lib/mysql/
# tar xvf ~tomita/friendDB.tar
パーミッションを確認しておくこと。
⑤Slave側の設定
1.Slave側のmy.cnfにserver-id設定
[mysqld] server-id=2 <== 識別用ID。任意の値。他のサーバーと重複しないようにする。
2.slave mysqld再起動
⑥レプリケーションの開始
1.Slave側の設定(Masterへ接続するためのパラメータ設定:host名, user名)
(Slave側で) mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.1', <== Masterのホスト名/IPアドレス MASTER_USER='repl', <== Master接続に使用するユーザー名 MASTER_PASSWORD='password', <== パスワード MASTER_LOG_FILE='tank-bin.000001', <==2.3で確認したFile MASTER_LOG_POS=79; <== 2.3 で確認したPosition
2.レプリケーション開始
(Slave側で) mysql> START SLAVE;
※MasterとSlaveで文字コードの設定などが違っていたりすると、Masterに接続できなかったりするので注意。
060612 15:36:17 [ERROR] The slave I/O thread stops because master and slave have different values for the COLLATION_SERVER global variable. The values must be equal for replication to work
060612 15:36:17 [ERROR] Slave I/O thread exiting, read up to log 'tank-bin.000001', position 79
060612 15:36:17 [ERROR] Slave I/O thread exiting, read up to log 'tank-bin.000001', position 79
■関連コマンド
①start slave/stop slave (slave用)
start slave でレプリケーションを開始し、stop slaveで停止
バイナリログの状態表示
③show binlog events (Master用)
バイナリログの中身表示
④show slave status (slave用)
Slave情報表示