はじめに
先日、運用中のサービスで利用していたAmazon RDS for MySQLを
Amazon RDS for Auroraへ移行しました。
その際の移行手順を記録しておきます。
前提
MySQLからAuroraへ単純に移行だけ行うのであれば、
MySQLインスタンスからスナップショットを取り、スナップショットからAuroraを立ち上げるという手順で可能です。
ただし、今回は運用中のサービスで利用しているMySQLを移行するケースだったので、
メンテナンス期間を最小限に抑えることが必要でした。
そのため、
わずかなダウンタイムでの Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート
を参考に、レプリケーションを利用して移行作業を行いました。
作業手順
1, MySQLにレプリケーション用のユーザを作成する
MySQLに接続し、レプリケーション用ユーザを作成します。
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl_user@'.' IDENTIFIED BY 'repl_password';
2, AWSコンソール上でMySQLにリードレプリカを作成
AWS RDSコンソール上で、MySQLインスタンスを選択し
インスタンスの操作>リードレプリカの作成 からリードレプリカを作成します。
3, レプリケーションの停止
手順2で作成したMySQLリードレプリカに接続し、レプリケーションを止めます。
またこの時にバイナリログファイル名、バイナリログポジションを記録しておきます。
mysql> call mysql.rds_stop_replication;
mysql> show slave status\G
show slave status
を実行した後に表示される
Master_Log_Fileがバイナリログファイル名、Read_Master_Log_Posがバイナリログポジションです。
※これらの情報は、後の手順でAuroraにレプリケーションを設定するときに使います。
4, AWSコンソール上でMySQLリードレプリカからスナップショットを取得する
AWS RDSコンソール上で、MySQLリードレプリカを選択し
インスタンスの操作>スナップショットの取得 からスナップショットを作成します。
5, AWSコンソール上でAuroraインスタンスを作成する
AWSコンソールのスナップショット一覧から、手順4で作成したスナップショットを選択し
「スナップショットの移行」からAuroraインスタンスを作成します。
6, AWSコンソール上でパラメータグループを作成
AWSコンソール上でパラメータグループ>パラメータグループの作成 からパラメータグループを作成します。
Auroraではパラメータグループが
「パラメータグループ」「DBクラスターのパラメータグループ(Auroraのクラスタ全体に設定するパラメータグループ)」
の二タイプとなったので、それぞれのタイプについて作成します。
各々のパラメータについては適宜設定します。
今回は文字コードやスロークエリログなど、MySQLのパラメータグループと合わせた形で設定しました。
7, AWSコンソール上でAuroraインスタンスの設定を変更
AWS RDSコンソール上で、Auroraインスタンスを選択し
インスタンスの操作>変更 からAuroraインスタンス設定を変更します。
今回は、
・パラメータグループ(手順6で設定したものにする)
・セキュリティグループ
・バックアップ
・メンテナンスウィンドウ
を変更しました。
変更の保存後、AuroraインスタンスをAWS上で再起動し、パラメータグループの変更を適用します。
8, MySQL->Auroraのレプリケーションを開始する
Auroraにマスターユーザで接続し、レプリケーションの設定を行います。
mysql> call mysql.rds_set_external_master (
"MySQLのエンドポイント"
, "ポート(通常3306)"
, "1で作成したユーザ名"
, "1で作成したユーザパスワード"
, "手順3で取得したバイナリログファイル名"
, 手順3で取得したバイナリログポジション
, 0
);
設定が終わったら、↓のコマンドでレプリケーションを開始します。
mysql> call mysql.rds_start_replication;
レプリケーション開始後、show slave status\G
で確認できるSeconds_behind_masterを見て、ラグ状況を確認します。
9, アプリケーションの参照系をAuroraに切り替え
アプリケーション側の参照系をAuroraに切り替えます。
問題ないようなら、AWSコンソール上でMySQLのリードレプリカを削除します。
ここからメンテナンス期間に入ります。
10, AWSコンソール上でMySQLのパラメータグループのread_onlyを1に変更
AWSコンソール上で、パラメータグループ一覧からMySQLに設定しているパラメータグループを編集し、read_onlyパラメータを1に変更します。
read_onlyパラメータは即時適用なので、
この時点からMySQLは参照はできますが更新ができなくなります。
11, Auroraに接続し、MySQL->Auroraのレプリケーションを停止
Auroraにマスターユーザで接続し、以下のコマンドでレプリケーションを停止します。
mysql> call mysql.rds_stop_replication;
※停止前に、show slave status\G
を確認しレプリケーションラグが無いことを確認します
12, アプリケーションの更新系をAuroraに切り替え
アプリケーション側の更新系をAuroraに切り替えます。
切り替えが終われば、アプリケーションでのデータベース参照・更新ともに可能になります。
ここまででメンテナンス期間が終了です。
13, MySQLインスタンスの削除
しばらくサービスの監視を行い、問題ないようならMySQLインスタンスを削除します。
MySQLに接続し、レプリケーションを停止してからAWSコンソール上でインスタンス削除を行います。
補足
今回の切り替えは以上の手順で行いました。
他に移行手順の例や、うちではこうやった! というような事例などありましたら教えて下さい。
#参考リンク
移行作業にあたって参考にさせていただいたページです。
わずかなダウンタイムでの Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート
Amazon Auroraとのレプリケーション
実録!サービスを止めずに Amazon Aurora へ移行した話
RDS for MySQLからAuroraへ移行しました