2014年12月2日火曜日

MySQLとAmazon RDSのレプリケーションをする方法

https://www.flickr.com/photos/atomictaco/5095355117

オンプレミスやEC2その他のサーバで動かしているMySQLとAmazon RDSをレプリケーションさせる方法です。
昨年、以下の資料が発表されています。

オンプレミスのMySQLデータをAmazon RDSに移動する
https://aws.amazon.com/blogs/aws/migrate-mysql-data-to-amazon-rds-and-back/

ダウンタイム無しでAmazon RDS MySQLデータベースにデータをインポート
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html


ひじょうに簡単になっていたので纏めてみました。

MySQLマスターサーバは既に立ち上がっているとします。
IPアドレス: 100.100.100.100

コンソールからRDSを作成します。
ホスト名: rds.xxx.ap-northeast-1.rds.amazonaws.com
ユーザ: userrds
パスワード: passwordrds


MySQLマスターにスレーブ用のユーザを作成。
$ mysql -uroot -pxxxxxxxx
mysql> GRANT REPLICATION SLAVE ON *.* TO userrds@"%"IDENTIFIED BY "passwordrds";
mysql> FLUSH PRIVILEGES;

mysqldumpを使ってMySQLマスターのデータベースをバックアップ。
$ /usr/bin/ionice -c2 -n7 /bin/nice -n19 /usr/bin/mysqldump -uroot -pxxxxxxxx --master-data=2 --single-transaction --routines --triggers --databases  databasename > databasename.sql

binlog名とポジションを調べて、控えておく。
$ head -100 databasename.sql | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000855', MASTER_LOG_POS=846543983;

RDSにデータベースを作っておく。
$ mysql -uuserrds -ppasswordrds -hrds.xxx.ap-northeast-1.rds.amazonaws.com
mysql> CREATE DATABASE  databasename;

RDSにバックアップファイルをインポートする。
$ mysql -uuserrds -ppasswordrds -hrds.xxx.ap-northeast-1.rds.amazonaws.com databasename < databasename.sql

RDSにMySQLマスターの情報を登録する。
$ mysql -uuserrds -ppasswordrds -hrds.xxx.ap-northeast-1.rds.amazonaws.com
mysql> CALL mysql.rds_set_external_master('100.100.100.100',3306,'userrds','passwordrds','mysql-bin.000855',846543983,0);

レプリケーションをスタート。
mysql> CALL mysql.rds_start_replication;

レプリケーションの状態を確認。
mysql> SHOW SLAVE STATUS\G

※ read_onlyがOFFになっているので、書き込み可能な状態になっています。お好みによって、read_onlyをONにしてください。
mysql> SHOW GLOBAL VARIABLES like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

以下、その他のコマンドです。

レプリケーションをストップする。
mysql> CALL mysql.rds_stop_replication;

レプリケーションを解除する。
mysql> CALL mysql.rds_reset_external_master;

レプリケーションの状態を確認する。
mysql> SELECT * FROM mysql.rds_replication_status;

レプリケーション設定のログを表示する。
mysql> SELECT * FROM mysql.rds_history;


参考資料)

Importing Data to an Amazon RDS MySQL DB Instance with Reduced Downtime - Amazon Relational Database Service
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html

付録: MySQL Amazon RDS SQL リファレンス - Amazon Relational Database Service
http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.MySQL.SQLRef.html

既存のMySQLサーバからRDSインスタンスへの移行をテストする « サーバーワークス エンジニアブログ
http://blog.serverworks.co.jp/tech/2011/10/17/mysql-to-rds-test/

EC2・オンプレ環境のMySQLからRDSのマイグレーションがやりやすくなった - まめ畑
http://d.conma.me/entry/2013/09/06/133656