os:centos:mysql:replication
目次
Replication
標準Replication
SlaveがMasterからバイナリLOGを取得し、更新を実行することで同期する。
よって非同期なので、タイミングによってデータに不整合が起きる可能性がある。
Master側の設定
やること
- 使用するポートを開ける
- SQL実行時にクエリのバイナリログを出力する
- どのサーバか識別するためサーバIDを付与する
- レプリケーション用のアカウントを作成
- DBバックアップ
- DBロック
- LOGファイル名を確認
- バックアップ
- ロック解除
ポートを開ける
/etc/sysconfig/iptables に下記を追加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
再起動
/etc/init.d/iptables restart
バイナリログとサーバID
/etc/my.cnf で [mysqld] の中に下記を追加
[mysqld] log-bin <== バイナリログを出力 server-id=101 <== サーバID。任意の値。他のサーバーと重複しないようにする。
レプリケーション用のアカウントを作成
mysql -u root -p
mysql> CREATE USER 'repl'@'SraveIP' IDENTIFIED BY '**********';
^↑^ ^^^^^^^スレーブのIP ^^^^^^^^^^パスワード
レプリケーション用のアカウント名
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@SraveIP
^↑^ ^^^^^^^スレーブのIP
レプリケーション用のアカウント名
バックアップ
DBロック
mysql> FLUSH TABLES WITH READ LOCK;
LOGファイル名とポジションを確認
mysql> SHOW MASTER STATUS; +-----------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-----------------+----------+--------------+------------------+ | host-bin.000001 | 79 | | | +-----------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
バックアップ
# cd /var/lib/mysql/ <== MySQLのデータディレクトリへ移動 # tar cvf ~/xxxxxDB.tar xxxxxDB <== データベースをバックアップ
または
# mysqldump -u root -p<passw0rd> --all-databases --flush-logs --single-transaction --master-data=2 > master.db
ロック解除
mysql> UNLOCK TABLES;
Slave側の設定
- どのサーバか識別するためサーバIDを付与する
- Masterに接続するための設定を行う
- レプリケーションの開始
サーバID
/etc/my.cnf で [mysqld] の中に下記を追加
[mysqld] log-bin <== バイナリログを出力 server-id=102 <== サーバID。任意の値。他のサーバーと重複しないようにする。 read_only <== 誤動作防止用にReadOnlyとする
リストア
# mysql -u root -p<Passw0rd> < xxxxxDB
Masterに接続するための設定
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.yyy.zzz', <== Masterのホスト名/IPアドレス
MASTER_USER='repl', <== Master接続に使用するユーザー名
MASTER_PASSWORD='**********', <== パスワード
MASTER_LOG_FILE='host-bin.000001', <== Masterで確認したLOGファイル
MASTER_LOG_POS=79; <== Masterで確認したLOGファイルPosition
レプリケーションの開始
mysql> START SLAVE;
uuidの変更
5.6でuuidを独自に保持するようになった。
データディレクトリをコピーしてクローンを作ったりVMのスナップショットからサーバを作成すると、この値が同じになっていてレプリケーションが動かない。
以下のようなerrorを吐いてる。
mysql> SHOW SLAVE STATUS\G ......... Last_IO_Error: 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.
この値はデータディレクトリ/auto.cnfに書き込まれている。
# cat datadirectory/auto.cnf [auto] server-uuid=11fcxx99-xxxx-XXXXXXXXXXXXXXXXXXXXXXXXX
これを削除してmySQLを再起動すれば新しく作り直される。
関連コマンド
START SLAVE/STOP SLAVE (Slave用)
開始と停止。
SHOW MASTER STATUS (Master用)
バイナリLOGのStatus
SHOW BINLOG EVENTS (Master用)
バイナリLOGの中身
SHOW SLAVE STATUS (Slave用)
SlaveのStatus
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: masterIP or host name
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: host-bin.000001
Read_Master_Log_Pos: 79
Relay_Log_File: host2-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: host-bin.000001
Slave_IO_Running: Yes <= YesならSlaveのスレッドは起動しており、レプリケーションは動作している
Slave_SQL_Running: Yes <= YesならSlaveのスレッドは起動しており、レプリケーションは動作している
<省略>
Seconds_Behind_Master: 0 <= SlaveのクエリがMasterから何秒遅れたかを表示
<省略>
参照
os/centos/mysql/replication.txt · 最終更新: by admin
