EC2にあるDBのRDS Aurora移行手順

概要

弊社のサービスの暮らしニスタはこれまでDBをEC2で運用していましたが、運用コスト削減の為、DBをRDS Auroraに移行しました。

今回は移行の流れとその際に注意すべき点を書いていきます。

RDS移行手順の概要

RDSでEC2のレプリカを作成

RDSでデータベースを作成する

以下の設定をしました。

機能 内容
エンジン Amazon Aurora
エディション Amazon Aurora MySQL 互換エディション
レプリケーション シングルマスター
バージョン Aurora (MySQL5.7).2.10.2

その他今回の変更点として暗号化をしました。

replユーザーをマスターに作成する

EC2がマスター、RDSがスレーブの関係でレプリケーションをするためのユーザーを作成します。

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

接続元ホスト名ですがRDSはプライベートDNS名で接続するので('%')にしました。

データダンプ

mysqldump -u ユーザー -p --single-transaction --set-gtid-purged=OFF --master-data=2

オンラインでレプリカを作成するために、バイナリログの開始点をコメントとして出力できるようにオプションを付けてデータをダンプしました。

head -n30 ダンプファイル | grep 'CHANGE MASTER'

のコマンドでバイナリログのファイル名と位置を取得できます。

リストア

ダンプしたデータをリストアします。

レプリケーション設定

ダンプしたデータのバイナリログのファイル名と位置を使用して

mysql> CALL mysql.rds_set_external_master(
'マスターのアドレス',
'ポート', 
'ユーザー名', 
'パスワード',
'バイナリログのファイル名',
'同期開始位置',
'SSL接続の有無'
);

でレプリケーションの設定をし

CALL mysql.rds_start_replication;

でレプリケーションを開始します。

バイナリログのファイル名と位置を利用すればメンテナンス要らずでレプリカできるので便利です。

RDSを複数台作成し本番公開の準備

レプリケーション設定ができてエラーがないことが確認できたらリーダーを追加します。

参照系を本番公開

本番稼働は既にしているサービスなので、追加したリーダーインスタンスを参照系として本番公開し、バランシングの荷重を調整し負荷を観察して徐々にRDSの方に参照を向けていき、最終的に参照系をEC2からRDSに切り替えました。

マスターを本番公開

参照系が問題なく切り替えられたので、メンテンナスを行い、マスターをEC2からRDSに切り替えました。

切り替え後

RDS(Aurora)に移行した後、若干CPUの負荷が高くなった以外は順調に稼働しているので、今回の移行は成功に終わりました。

その他

あまり機会はないと思いますが、RDS→EC2のレプリケーションの設定も行ったのでその時に詰まった点も書いておきます。

RDSのパラメータグループにて以下の設定をします。

  • RDSのクラスターパラメータグループでbinlog_checksumをnoneに変更
  • 同じくbinlog_formatをMIXEDにしておく(要RDS再起動)
  • RDSのbinlogの保持期間を設定しておく

binlogの保持期間の設定は以下のコマンドで行います。

call mysql.rds_set_configuration('binlog retention hours', 168);

保持期間の確認は以下のコマンドで行います。

call mysql.rds_show_configuration;

リーダーインスタンスからのデータダンプ時はRDS側のレプリカを手動で停止しなければダンプできないので以下のコマンドでレプリカを止めます。

CALL mysql.rds_stop_replication;

EC2のMySQLに以下を設定します。

replicate-ignore-db=mysql

以上の点に気をつけて設定しておけば、RDS→EC2へのレプリケーションはメンテナンスの必要なくオンラインで設定をしていくことができます。

まとめ

移行してからまだそれほど期間が経過していない為、今後の経過を見つつどれだけ運用コストが下がったかを観察して行きたいと思います。