RDS MySQL 5.7からAmazon Auroraにオンライン移行する方法
西澤です。RDS MySQL 5.7環境からAuroraへのレプリケーションを利用したデータ移行を行う機会がありましたので、手順をまとめておきたいと思います。
Auroraリードレプリカ
他のデータベースエンジンからの移行はまだ敷居が高いのですが、既にRDS MySQLを使っているユーザであれば、Amazon Auroraに乗り換えない手はありません。MySQL 5.6との互換性があるのでアプリケーション側の変更はほぼ不要、より高性能、より堅牢なストレージの自動拡張機能付き、参照用ノードをFailover先としても利用可能、と、もう良いことばかりです。
ただ、RDS MySQLからAuroraに乗り換えるには、データ移行を避けて通ることができません。可能であれば、DB移行に伴うシステムのダウンタイムは限りなく0に近い方が望ましいです。そこで、なんとも便利な機能がリリースされているではないですか。
- RDS MySQL DBインスタンスからAmazon Aurora Read Replicaを作成可能になりました | Amazon Web Services ブログ
-
MySQL DB インスタンスから Amazon Aurora DB クラスターへのデータ移行 (リードレプリカを使用) - Amazon Relational Database Service
RDS MySQLをマスタとして、Auroraリードレプリカが簡単に作成できるようになっています。公式ドキュメントの手順を見ると、レプリケーションの構成から昇格まで、GUIの簡単操作だけで実現できそうです。
MySQL5.7ではAuroraリードレプリカ機能そのままは使えなかった
早速試してみることにしたのですが、マスタがMySQL5.7の場合は、残念ながらエラーになってしまいました。
Cannot upgrade from mysql 5.7.11 to aurora 5.6.10a.Specify a current active database version, the latest active minor version for mysql 5.7 is 5.7.11. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
この機能はAuroraのベースがMySQL5.6.10ということなので、MySQL5.6でないと使えないようです。
MySQL5.7からAuroraへのレプリケーションを手動で試す
懲りずにまずMySQL5.7からAuroraへのレプリケーションを手動で構成してみることにしました。基本的な流れは下記公式ドキュメントが参考になりました。
わずかなダウンタイムでの Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート - Amazon Relational Database Service
- MySQL5.7からmysqldumpでエクスポート
- ダンプファイルをAuroraにインポート
- 確認済のマスターログファイル名とマスターログの場所を確認して、Auroraから
mysql.rds_set_external_master
でMySQL5.7をマスタに指定 - Auroraにて
mysql.rds_start_replication
でレプリケーションを開始
コマンドそのものは成功し、しばらくはこれで上手くいくかと思われたのですが、、、
2017-04-25 13:24:11 14117 [ERROR] Slave I/O: Found a Gtid_log_event or Previous_gtids_log_event when GTID_MODE = OFF. Error_code: 1784 2017-04-25 13:24:11 14117 [ERROR] Slave I/O: Relay log write failure: could not queue event from master, Error_code: 1595
上記エラーが出力され、レプリケーションが止まってしまいました。この原因についてなのですが、下記記事に書いてある"5.6.23"で修正されたバグなのではないかと判断しました。Auroraは"5.6.10"ベースということなので、そのままレプリケーションの構成を取ることはあきらめることにしました。(私の調査不足で、もしかすると回避策があるかもしれません)
- Planet MySQL :: Planet MySQL - Archives - Avoiding MySQL ERROR 1784 when replicating from 5.7 to 5.6
MySQL5.7からMySQL5.6を挟んでAuroraまでレプリケーションできた
結局、こんな構成にすることでAuroraまでのレプリケーションを構成することができました。結局手作業でMySQL on EC2を構築することになってしまいましたが、Auroraにシステム切替をするまでの一時的な構成なので、OKということにしました。
参考までに、間に構築したEC2環境についても記録とメモを残しておきたいと思います。
$ sudo cat /etc/os-release NAME="Amazon Linux AMI" VERSION="2016.09" ID="amzn" ID_LIKE="rhel fedora" VERSION_ID="2016.09" PRETTY_NAME="Amazon Linux AMI 2016.09" ANSI_COLOR="0;33" CPE_NAME="cpe:/o:amazon:linux:2016.09:ga" HOME_URL="http://aws.amazon.com/amazon-linux-ami/" $ rpm -q mysql56-server mysql56-server-5.6.35-1.23.amzn1.x86_64 $ sudo cat /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mysqld according to the # instructions in http://fedoraproject.org/wiki/Systemd # Slave log-bin server-id = 11 log-slave-updates replicate-ignore-db = mysql binlog_format = MIXED [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
- log-bin
- バイナリログを有効化
- server-id
- 任意の重複しないIDを指定
- log-slave-updates
- SLAVEからSLAVEを作る場合に指定
- replicate-ignore-db
- RDS特有のテーブル(
mysql.rds_heartbeat2
など)が無いとエラーになるようなので設定、replicate-do-dbで同期をとるDBを明示的に指定する方法でも良い - binlog_format
- RDSのデフォルトが
MIXED
になっていたのでそれに揃えた
AWSサポートにはDatabase Migration Service(DMS)も勧められました。継続的なレプリケーションが必要なら、その方が良かったと思うのですが、今回はマスタ側に手を入れずにデータ移行を行いたかったので、MySQL on EC2を使ってやってみました。
まとめ
実際にはDB移行もなかなかそう簡単には行かないことも多いのですが、一旦Auroraに乗り換えさえしてしまえば、DB運用はずっと楽になるはずです。Auroraは今後も機能改善、拡張のリリースが続いていくと思われますので、ぜひお早めにご検討いただければと思います。個人的には、まだプレビュー状態ながら注目度の高いPostgreSQL互換のAuroraも、どんどん試して行きたいと思います。
どこかの誰かのお役に立てば嬉しいです。