end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

mysqlで双方向(マルチマスタ)レプリケーション

前回までに1台の複数mysqlを起動する方法を紹介しましたが、今回は、それらで双方向(マルチマスタ)レプリケーションを行う方法を紹介します。

my.cnf と my2.cnf

私のcolinux環境ではオプションファイルを切り替えることで、複数mysqlを起動していますが、以降では次のように表記します。

オプションファイル ここでの表記
/etc/my.cnf my.cnf
/etc/my2.cnf my2.cnf

レプリケーション用ユーザの追加

mysqlではslaveからmasterを参照する際、レプリケーション用のユーザを使用するようです。そこで、my.cnf, my2.cnf のそれぞれに「GRANT REPLICATION SLAVE」を実行して下さい。

my.cnf> GRANT REPLICATION SLAVE ON *.* TO repl@localhost IDENTIFIED BY '内緒';
my2.cnf> GRANT REPLICATION SLAVE ON *.* TO repl@localhost IDENTIFIED BY '内緒';

mysqldを一旦停止

この後の作業で、オプションファイルの変更やコールドバックアップを取得する為、my.cnfとmy2.cnfのmysqldを一旦停止して下さい。

$ /usr/local/mysql/bin/mysqladmin --defaults-file=/etc/my.cnf \
                                  --user=root shutdown
$ /usr/local/mysql/bin/mysqladmin --defaults-file=/etc/my2.cnf \
                                  --user=root shutdown

オプションファイルの変更

前回までのオプションファイル(my.cnf,my2.cnf)に対し、レプリケーションに関する記述を追記して下さい。

my2.cnf(port:3307)の抜粋
[mysqld]
default-storage-engine = INNODB
basedir = /usr/local/mysql
datadir = /data/mysql2
port		= 3307
socket		= /tmp/mysql2.sock
<略>
server-id	= 2           #ココ
master-host     =   localhost #ココ
master-user     =   repl      #ココ
master-password =   内緒      #ココ
master-port     =   3306      #ココ
my.cnf(port:3306)の抜粋
[mysqld]
default-storage-engine = INNODB
basedir = /usr/local/mysql
datadir = /data/mysql
port		= 3306
socket		= /tmp/mysql.sock
<略>
server-id	= 1           #ココ
master-host     =   localhost #ココ
master-user     =   repl      #ココ
master-password =   内緒      #ココ
master-port     =   3307      #ココ

データのバックアップとコピー

私の場合、以前からある/data/mysql2を一旦、避け my.cnfのデータ(/data/mysql)をmy2.cnf(/data/mysql2)にコピーしました。

# mv /data/mysql2 /data/mysql2.bak
# cp -r /data/mysql /data/mysql2
# chown -R mysql:mysql /data/mysql2

mysqldの起動

$ /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
$ /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my2.cnf --user=mysql &

レプリケーションの開始(slaveの起動)

まず、my.cnfとmy2.cnfのそれぞれで SHOW MASTER STATUS を実行し、log-binのファイル名を確認してください。

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000014 |      941 |              |                  | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql2> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000022 |     1164 |              |                  | 
+------------------+----------+--------------+------------------+

最後に「CHANGE MASTER TO」と「START SLAVE」を実行すれば、作業完了ですので、my.cnfとmy2.cnfのそれぞれに接続して動作確認を行って下さい。

mysql2> CHANGE MASTER TO
          MASTER_HOST='localhost',
          MASTER_USER='repl',
          MASTER_PASSWORD='内緒',
          MASTER_LOG_FILE='mysql-bin.000014';
mysql2> start slave;
mysql> CHANGE MASTER TO
         MASTER_HOST='localhost',
         MASTER_USER='repl',
         MASTER_PASSWORD='内緒',
         MASTER_LOG_FILE='mysql-bin.000012';
mysql> start slave;