今回はレガシーインフラの改善として、EC2インスタンス上のMySQL5.5から
AWSサービスのAuroraへの移行を行いました。
全体作業の流れ
作業としては、以下の流れで作業を行いました。
- 旧MySQLからAuroraへレプリケーションを行う
- アプリ側を切り替える
以上。
という、とても簡単な手順で移行出来ました。
それでは、作業の詳細です。
1、旧MySQLからAuroraへレプリケーションを行う
1-1、EC2インスタンス上のMySQL5.5からデータをdumpする
$ mysqldump --master-data=2 --single-transaction --order-by-primary --databases hoge fuga > some.dump.txt
-
--master-data=2
マスタのポジションがコメントで出力されます -
--single-transaction
は運用中のサービスの場合、ロックしないようdumpします - ユーザデータも移行してください手順は割愛
- 旧MySQL側のマスタ設定は割愛します
1-2、Auroraの設定
基本的なところは、
http://dev.classmethod.jp/cloud/aws/try-aurora-replica-failover/
こちらなどを参考にしました。
Auroraは、time_zoneの設定が出来ないので、下記の記事を参考に init_connect
を設定しました。
参考
http://qiita.com/j3tm0t0/items/089ef96ba131df079ca4
init_connect SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;
と、思っていたらこんな記事も最近見つけました。
http://dev.classmethod.jp/cloud/aws/amazon-aurora-local-timezone/
他に、 character_set
の設定も行いました。
(Auroraは、パラメータグループがCluster用と2種類あるので注意!)
1-3、Auroraに、データを流し込む
$ mysql -h auroraクラスターエンドポイント.ap-northeast-1.rds.amazonaws.com -uユーザ -p < some.dump.txt
1-4、Auroraのレプリケーション設定(スレーブ)
$ mysql -h auroraクラスターエンドポイント.ap-northeast-1.rds.amazonaws.com -uユーザ -p
mysql> CALL mysql.rds_set_external_master(
'xxx.xxx.xxx.xxx', (マスターのIPアドレス)
3306, (ポート番号)
'replication_user', (接続するユーザー名)
'*********', (パスワード)
'mysql-bin.09999', (バイナリログのファイル名)
'123', (マスタのポジション)
0 (SSL接続を行わない)
);
1-5、Auroraのレプリケーション開始
mysql> CALL mysql.rds_start_replication;
それから
mysql> show slave status\G
とやってみて、
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
になっていれば、レプリケーション成功です。
さらに、 Seconds_Behind_Master: 0
になっていれば切り替え準備完了です。
2、アプリ側を切り替える
任意のタイミングで、アプリ側の接続先をAuroraに切り替えてください。
mysql> call mysql.rds_stop_replication;
これでレプリケーションは停止できます。
無事移行が完了したら、
mysql> call mysql.rds_reset_external_master;
レプリケーションの設定をリセットしておきましょう。(重要)
これをやっておかないと、Auroraを再起動などした時にレプリケーションが開始されてしまいます。
データの互換性について
今回は、小さめのデータベースだったので、確認も比較的簡単に出来ました。
カラムのデータ型としては以下のようなものがありましたでしたが、特に問題はありませんでした。
+------------------+------+-----+---------+----------------+
| Type | Null | Key | Default | Extra |
+------------------+------+-----+---------+----------------+
| int(10) unsigned | NO | PRI | NULL | auto_increment |
| int(10) unsigned | YES | MUL | 100 | |
| int(11) | YES | MUL | NULL | |
| int(11) | NO | | NULL | |
| text | NO | UNI | NULL | |
| text | YES | UNI | NULL | |
| text | YES | | NULL | |
| datetime | YES | | NULL | |
| varchar(255) | YES | | NULL | |
| tinyint(3) | NO | MUL | NULL | |
+------------------+------+-----+---------+----------------+
しかし、こういった報告もあります。
http://oranie.hatenablog.com/entry/20130402/1364906656
http://qiita.com/yng13/items/ddf755780315e029cc6e
でも、レプリケーションさえ出来てしまえば、検証もやりやすいですね。