今回は、リージョン間でMySQLのレプリケーションを行います。
まずマスター用(Asia Pacific Tokyo)とスレーブ用(EU-West Ireland)、それぞれ1インスタンスずつ用意します。
ここでは、例として、
- マスターのIP:mmm.mmm.mmm.mmm
- スレーブのIP:sss.sss.sss.sss
- データベース:clouadpack
- レプリケーション用のユーザー:repl_user
- レプリケーション用のパスワード:repl_pass
ここでは各IPはElasticIPでパブリックなIPを適用しておきます。
まず、マスター、スレーブ、それぞれでデータベースを作成します。
$ mysql -u root mysql> create database cloudpack; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | cloudpack | | mysql | | performance_schema | | test | +--------------------+
次にマスターサーバーで、スレーブサーバーからのアクセスを許可し、バイナリログを生成するようにします。
$ myql -u root mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl_user@"sss.sss.sss.sss" IDENTIFIED BY 'repl_pass'; mysql> flush privileges;
# vi /etc/my.cnf ... log-bin = /var/db/repl/binary-log ... server-id = 1
スレーブサーバーでは、マスターサーバーの情報を登録します。
# vi /etc/my.cnf ... server-id = 2
$ mysql -u root mysql> CHANGE MASTER TO MASTER_HOST='mmm.mmm.mmm.mmm', MASTER_USER='repl_user', MASTER_PASSWORD='repl_pass', MASTER_PORT=3306;
それぞれのMySQLを起動するEC2のセキュリティグループに3306(MySQLポート。それ以外を使用する場合はそのポート番号)を互いのIPで許可します。
そして、マスターサーバー、スレーブサーバーの順で再起動します。
# /etc/init.d/mysqld restart
実際に、レプリケーションが動いているか確認します。
マスター
$ mysql -u root cloudpack; mysql> CREATE TABLE `hoge` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(256) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; mysql> mysql> mysql> insert into hoge (name) values('moge'); Query OK, 1 row affected (0.02 sec)
スレーブ
$ mysql -u root cloudpack; mysql> show tables; +---------------------+ | Tables_in_cloudpack | +---------------------+ | hoge | +---------------------+ 1 rows in set (0.00 sec) mysql> mysql> mysql> select * from hoge; +----+------+ | id | name | +----+------+ | 1 | moge | +----+------+ 1 row in set (0.00 sec)
スレーブにも反映されていることが確認できました。
リージョン間の接続はオーバーインターネットになるため、SSL接続を行いたい場合は、suz-labのエントリーが参考になります。
今日は夏ばてにつき、ここまで。