MySQL

2015-03-25, mysql

レプリケーション

host1(192.168.0.1)をマスタ、host2(192.168.0.2)をスレーブとしてレプリケーションを開始する手順です。お互いのホスト間で、ssh及びmysql接続が可能な状態になっていることを前提としています。

まずレプリケーション用のユーザを作成します。

on host1
mysql> GRANT REPLICATION SLAVE ON *.* TO 'host2'@'192.168.250.2' IDENTIFIED BY 'secret';

ここではデータベースやテーブル単位の指定はできないようです。そもそもレプリケーション自体をデータベースやテーブル単位で実行すること自体が難しい(不可能ではないが落とし穴があります)ため、あまり気にせず「*.*」指定で行きましょう。

それぞれのホストの設定を変更します。server_idが一意になるように注意してください。スレーブ側にのみ「log_slave_updates」指定が必要です。

/etc/my.cnf on host1
log_bin=mysql-bin
server_id=1001
/etc/my.cnf on host 2
log_bin=mysql-bin
log_slave_updates
server_id=1002

設定を変更したらMySQLデーモンを再起動します。

on host1, host2
# service mysqld start

スレーブ側のホストにマスタ側のデータの内容を同期します。データベースが大きい場合はnohupなどをつけて、セッションが切れても作業が中断しないようにした方がベターかもしれません。また、このコマンドを実行中はテーブルがロックされ更新などの処理が待たされることがあるので注意してください(--single-transactionオプションをつけることでロックを回避できますが、低速です)。

on host2
$ ssh host1 mysqldump -uroot --databases t --master-data | mysql -root

スレーブ側のデータベースにマスタのIPを設定します。

on host2
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.1';

以上で準備完了です。スレーブの同期を開始します。

on host2
mysql> START SLAVE USER='host2' PASSWORD='secret';

host1側の変更がhost2に反映されるようになっていることを確認してください。マスタ側で大量の追加や更新を走らせる場合など、同期を一旦停止したい場合は、以下のコマンドを利用します。

on host2
mysql> STOP SLAVE;

再び、START SLAVEを実行すると同期を開始し、同じ状態に戻ります。動作がおかしい場合は、以下のコマンドで状態(エラーメッセージ)を確認することができます。

on host2
mysql> SHOW SLAVE STATUS;

スレーブとしての設定を消去したい場合は、以下のコマンドを利用できます。

mysql> RESET SLAVE;

参考URL

この記事は役に立ちましたか?