====== 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> GRANT REPLICATION SLAVE ON *.* TO repl@SraveIP IDENTIFIED BY '**********'; ^↑^ ^^^^^^^スレーブの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 --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 < 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から何秒遅れたかを表示 <省略> ===== 参照 =====