MySQLでレプリケーションを設定する

レプリケーションMySQLで最も重要な機能の一つで、その用途は多岐に渡ります。それゆえ素早くセットアップできることが好ましいです。ここではその手順をまとめておきます。

方法はいくつかありますがここではマスターからmysqldumpでデータを取ってくる方法を使います。

1. マスターサーバーのコンフィギュレーション

マスターでは以下のようにオプションを設定します。

[mysqld]
bind-address = 10.132.0.2
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
sync_binlog = 1

server_idレプリケーションするグループ内で一意である必要があります。デフォルトが1なので他のインスタンスと衝突しないように違う値を割り当てるのが安全ですがここではデフォルトのままにしておきます。今回はローカルネットワーク内にマスター・レプリカを立てるのでbind-addressにはローカルIPを書いておきます。log_binにはバイナリログの位置を指定、sync_binlogフラグを立てることでトランザクション毎にバイナリログが同期することを保証します。

2. マスターにレプリケーションユーザーを作成する

レプリケーションではマスターがサーバーでレプリカがクライアントの役割を果たします。よってマスター側にレプリカがアクセスする用のユーザーを作成します。

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

ここではクライアントホストに%を指定することで複数のレプリカでユーザーを使い回す想定で作成します。

3. マスターのデータをmysqldumpで取得する

バックアップをとる方法でまとめたのと同様にmysqldumpコマンドによりデータの論理バックアップを取得します。

$ sudo mysqldump --all-databases --master-data=2 --single-transaction --flush-logs > backup/dumpfile.sql

--all-databasesにより全てのデータベースを対象にし、--master-data=2によりダンプデータにレプリケーションの開始位置を書き込ませます。--single-transactionは複数データベースのデータを取得する際の不整合を防ぐオプション(InnoDB専用)、--flush-logsによりバイナリログのローテートを指示します。

4. スレーブのコンフィギュレーション

スレーブのmysql.confファイルを以下のように設定します。

[mysqld]
bind-address = 10.132.0.3
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log

スレーブはserver-idに2を割り当て、ローカルIPの設定もします。マスターから取得するバイナリログはまずリレーログという領域に置かれます。その後マスター接続するのとは別のスレッドがリレーログの内容をデータに書き込みます。relay-logの値にリレーログを書き込む場所を指定しておきます。

5. ダンプしたデータのリストア

先ほどマスターから取得したダンプファイルをスレーブに適用します。

$ sudo mysql < dumpfile.sql

6. スレーブでレプリケーションの設定をする

スレーブでマスターとバイナリログ上のレプリケーションの開始位置を指定します。レプリケーションの開始位置は以下のようにダンプデータから取得できます。

$ cat dumpfile.sql | head -n30 | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154;

mysqlに以下のクエリを流します。

CHANGE MASTER TO
    MASTER_HOST='10.132.0.2',
    MASTER_USER='slave_user',
    MASTER_PASSWORD='password',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000002',
    MASTER_LOG_POS=154,
    MASTER_CONNECT_RETRY=10;

7. マスターに更新クエリをかける

レプリケーションがうまくいってることを確認するためにマスターのデータを更新してみましょう。

8. レプリケーションの開始

スレーブ側でレプリケーションを開始します。

START SLAVE;

9. レプリケーションの確認

スレーブ側では以下のように確認します。

SHOW SLAVE STATUS\G

またマスター側での確認は

SHOW MASTER STATUS;
SHOW SLAVE HOSTS;

です。

先ほどマスターで更新したデータがスレーブに書き込まれていること、マスターへの更新クエリがスレーブに反映されることも確認しましょう。

参考