EC2インスタンス上のMySQL5.5からAuroraへの移行

  • 7
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

今回はレガシーインフラの改善として、EC2インスタンス上のMySQL5.5から
AWSサービスのAuroraへの移行を行いました。

全体作業の流れ

作業としては、以下の流れで作業を行いました。
1. 旧MySQLからAuroraへレプリケーションを行う
2. アプリ側を切り替える
以上。

という、とても簡単な手順で移行出来ました。
それでは、作業の詳細です。

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

でも、レプリケーションさえ出来てしまえば、検証もやりやすいですね。