MySQL 5.x レプリケーション設定

MySQLでレプリケーションを構成してみました。備忘録として記録しておきます。
環境としてはすでに稼動しているマスターに、新規でスレーブを追加することを想定しています。スレーブ側の初期データはマスターのコールドバックアップしたデータをスレーブでリストアします。マスターのコールドバックアップ以降のデータからレプリケーションでスレーブに反映させます。

■マスターの設定

1.設定ファイルにパラメータ追加
my.cnf にレプリケーションに必要なパラメータを追加します。

・server-id: インスタンスを一意に識別するIDでマスターとスレーブで重複しないようにする
・sync_binlog=1:トランザクションのコミットと同時にバイナリログにも書き込みを反映する
・log-bin:バイナリログを作成する。*1

*1 他のパラメータと異なりディレクトリ指定の後にバイナリログファイルの接頭辞を指定する必要がある。たとえばlog-bin=/var/lib/mysql/binary/binaryと指定すればbinaryディレクトリの下にbinary.000001といったファイル名が作成される。

2.インスタンス起動

3.スレーブからの接続用アカウントを作成
権限はREPLICATION SLAVEというグローバル権限を付与する

mysql>GRANT REPLICATION SLAVE ON *.* TO 'ユーザ名'@'FQDN' IDENTIFIED BY パスワード';

4.スレーブでリストアするためバックアップをする

・コールドバックアップの場合
①インスタンス停止
②データをtarなどで固めて、スレーブ側にコピーし展開
③現時点のバイナリログを確認する。インスタンス起動後に生成されるバイナリログからスレーブ側で反映させる。
たとえばbinary.000002まで作成されていれば、インスタンス起動後binary.000003が作成されるため、 スレーブではbinary.000003の先頭から適用することになる。
④ インスタンス起動

■スレーブの設定

1.設定ファイルにパラメータ追加
my.cnf にレプリケーションに必要なパラメータを追加します。

・server-id: インスタンスを一意に識別するIDでマスターとスレーブで重複しないようにする
・read_only:スレーブ特有のパラメータで、一般ユーザからの更新ができなくなる。

2.スレーブのデータ準備

①マスターでバックアップしたデータをスレーブでリストアする。
②インスタンス起動
③マスターへの接続設定をする

CHANGE MASTER TO 文でマスターへの接続アカウントとバイナリログの開始位置の指定を行う。

mysql>CHANGE MASTER TO MASTER_HOST='マスターのホスト名',MASTER_PORT=3306,MASTER_USER='REPLICATION SLAVEの権限を持ったユーザ',MASTER_PASSWORD='パスワード',MASTER_LOG_FILE='binary.000003';

「MASTER_LOG_FILE」はマスターでコールドバックアップ後、インスタンス起動で生成されたバイナリログを指定する。
今回は新しく生成されたバイナリログの先頭からレプリケーションを開始すればよいが、バイナリログ内の開始位置を指定する場合は「MASTER_LOG_POS」というパラメータで指定する。

※「MASTER_LOG_POS」パラメータ(2012/06/24追記)
指定しない場合のデフォルト値は4。
バイナリログの内容を確認する場合はmysqlbinlog <バイナリログファイル名>で確認できる。
デフォルトは「# at 4」とバイナリログに記載がある。これをCHANGE MASTER TO 文で指定する場合は以下のようになる。
MASTER_LOG_POS=4

CHANGE MASTER TO 文実行後MySQLのデータディレクトリに以下のファイルができる。

・master.info:マスターへの接続に必要な情報と読み取りを開始するバイナリログの位置情報
・relay-log.info:転送されたバイナリログがどこまで適用されたかの位置情報
・mysqld-relay-bin.index:リレーログのインデックスファイル
・mysqld-relay-bin.000001: リレーログ本体

※マスターでのバイナリログの指定はlog-binパラメータで行うが、スレーブのバイナリログにあたるリレーログファイルの配置先を指定する場合はrelay-logパラメータを指定するようです。(参考はこちら

④レプリケーションを開始

mysql>START SLAVE;

master.infoがある場合はインスタンス再起動でもマスターへ接続が行われる。またレプリケーションを停止したい場合は
mysql>STOP SLAVE;
で停止できる。

■レプリケーションの動作確認

①マスターでデータを更新し、スレーブに反映されていることを確認
②SHOW PROCESSLIST 文で確認する。

[マスター] Binlog Dumpスレッドが存在していることを確認する

mysql> show processlist\G
*************************** 1. row ***************************
Id: 4
User: ******
Host: ******.eastforest.jp:49341
db: NULL
Command: Binlog Dump
Time: 347006
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL

[スレーブ] I/OスレッドとSQLスレッドの2つのスレッドが存在していることを確認する

mysql> show processlist\G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 15663
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 347257
State: Waiting for master to send event
Info: NULL

参考:現場で使える MySQL (DB Magazine SELECTION)