目次

Replication

標準Replication

SlaveがMasterからバイナリLOGを取得し、更新を実行することで同期する。

よって非同期なので、タイミングによってデータに不整合が起きる可能性がある。

Master側の設定

やること

  1. 使用するポートを開ける
  2. SQL実行時にクエリのバイナリログを出力する
  3. どのサーバか識別するためサーバIDを付与する
  4. レプリケーション用のアカウントを作成
  5. 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<passw0rd> --all-databases --flush-logs --single-transaction --master-data=2 > master.db

ロック解除

mysql> UNLOCK TABLES;

Slave側の設定

  1. どのサーバか識別するためサーバIDを付与する
  2. Masterに接続するための設定を行う
  3. レプリケーションの開始

サーバ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から何秒遅れたかを表示
            <省略>

参照