こんにちは。SREチーム インフラエンジニアの綿引です。
既存のシステムを刷新する際やリニューアルなどを行う時など
インフラ構成をいろいろ考えるかと思いますが、
DB のクラウド化を検討された方も中にはいらっしゃるのではないでしょうか。
メリット・デメリットはあるかとは思いますが、まずは現状のシステムから
移行可能かという点が気になるかと思います。
そこで本日はオンプレや EC2 インスタンスにインストールした MySQL から、
AWS の RDS の MySQL に移行する方法を試してみたので書いていきたいと思います。
またせっかくなのでRDSの暗号化も一緒にやってみたいと思います。
手順
今回は EC2 にインストールした MySQL から RDS に移行したいと思います。
実施した手順としては以下です。
1. RDS パラメータグループ作成
2. RDS インスタンス作成
3. EC2 レプリケーション事前準備
4. EC2 mysqldump エクスポート
5. RDS mysqldump インポート
6. EC2 → RDS レプリケーション構築
7. アプリケーション向き先変更
8. EC2 → RDS レプリケーション解除
では早速構築していきます。
1. RDSパラメータグループ作成
まずは RDS のパラメータグループの作成です。
パラメータグループとは MySQL の my.cnf のようなものです。
パラメータグループ自体はデフォルトのグループが存在するので
最初に作成しなくても RDS インスタンスを作成することができるのですが、
my.cnf に動的と静的なパラメータがあったように
中にはパラメータ変更後に再起動が必要なケースがあるため、
インスタンス作成時に適用しておくといいと思います。
パラメータグループの作成方法としては AWS コンソールにログインし、
以下の操作を行います。
「Amazon RDS」
→ 「パラメータグループ」
→ 「パラメータグループの作成」
作成が完了したら「パラメータの編集」ボタンから値を編集します。
尚、私が設定したパラメータとしては以下です。
パラメータ | 設定値 |
---|---|
time_zone | Asia/Tokyo |
sql_mode | NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES |
character_set_client | utf8 |
character_set_connection | utf8 |
character_set_database | utf8 |
character_set_results | utf8 |
character_set_server | utf8 |
skip-character-set-client-handshake | 1 |
基本的には文字コードとtime_zone関連です。
RDS はインスタンスサイズによって、自動でパラメータを変更してくれるようなので
上記だけ設定して様子を見つつリソースが足りないなどあれば拡張していこうと思います。
2. RDS インスタンス作成
次にインスタンスの作成です。
設定やバージョン、スペックとしては以下のようにしました。
テストなのでスペックは低めにしています。
項目 | 設定値 |
---|---|
エンジン | MySQL |
本番の予定 | 開発/テスト用 |
DBエンジンのバージョン | MySQL 5.7.17 |
DBインスタンスのクラス | db.m3.medium |
ストレージタイプ | マグネティック |
ストレージ割り当て | 5GB |
DBパラメータグループ | ※ 先ほど作成したパラメータグループ |
暗号化を有効 | はい |
DBインスタンスのクラスとを赤字にしておりますが、RDS の暗号化を行うにあたって
暗号化が可能なインスタンスクラスと、そうでないインスタンスクラスが存在します。
ここを間違えてしまうと暗号化ができないのでご注意ください。
また暗号化には上記のような注意すべきポイントが幾つかあります。
例えば、暗号化は DB インスタンスの作成時のみしか有効にできないなどです。
詳細は以下の公式ページをご覧ください。
3. EC2 レプリケーション事前準備
ではレプリケーションを行うための事前準備をしていきましょう。
ここは単純に MySQL のレプリケーションを構築する方法と一緒です。
まずはレプリケーション用のユーザを作成します。
mysql> SHOW GRANTS for test@'%'; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO test@`%` IDENTIFIED BY 'XXXXXXXX'; mysql> SHOW GRANTS for test@'%'; ・ユーザ +----------+----------------+ | User | Host | +----------+----------------+ | test | % | +----------+----------------+ ・権限 +------------------------------------------------------------------+ | Grants for test@% | +------------------------------------------------------------------+ | GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test'@'%' | +------------------------------------------------------------------+
次にレプリケーションの設定のため my.cnf に以下を追加します。
server-id = 100 log-bin=mysql-bin
設定反映のため MySQL を再起動します。
$ sudo /etc/init.d/mysqld restart $ mysql -uroot -p
マスタ側の設定ができているか、以下のコマンドで確認します。
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.XXXXXX | XXX | | | | +------------------+----------+--------------+------------------+-------------------+
4. EC2 mysqldump エクスポート
レプリケーションの事前設定が終わったら mysqldump でエクスポートを行います。
$ sudo mysqldump -u root -p --single-transaction --routines test > mysqldump-test.sql
5. RDS mysqldump インポート
次は RDS に今取得した dump ファイルをインポートします。
RDS の接続先に関しては AWS コンソールからエンドポイントと記載のある部分をご確認ください。
※ source でファイルを読み込む際は対象ファイルが、
OS側のカレントディレクトリに存在しなければならないのでご注意ください。
$ mysql -h test.ckipnlucwhuv.ap-northeast-1.rds.amazonaws.com -P 3306 -u root -p mysql> use test; mysql> source mysqldump-test.sql
これでインポートは完了です。
6. EC2 → RDS レプリケーション構築
次に EC2 から RDS へのレプリケーションの構築を行います。
mysql> show slave status \G mysql> CALL mysql.rds_set_external_master ('EC2のMySQLのIP',3306,'ユーザ名','パスワード','show master statusで確認した **File**',show master statusで確認した **Position**,0); mysql> CALL mysql.rds_start_replication; mysql> show slave status \G 以下の項目がどちらも**Yes**であればレプリケーション構築完了です。 ・Slave_IO_Running: Yes ・Slave_SQL_Running: Yes
7. アプリケーション向き先変更
アプリケーション側で EC2 の MySQL に接続しているものがあれば変更します。
アプリケーション以外にもツール系(phpMyadminなど)も注意ですね。
8. EC2 → RDS レプリケーション解除
アプリケーション側の向き先を変更したら、最後に EC2 → RDS 間の
レプリケーションを解除して移行完了です。
mysql> CALL mysql.rds_reset_external_master; ※ reset slave はこれ 因みに、、 mysql> call mysql.rds_stop_replication; ※ stopはこれ mysql> CALL mysql.rds_skip_repl_error; ※ skipはこれ
これで移行は完了です。
作業自体は簡単ですが移行元のデータベースが巨大だったりすると結構時間がかかります。
もしサービス側で検討されている方はタイミングが重要ですね。
まとめ
今回は オンプレ・EC2 の MySQL から AWS RDS への移行を実施しました。
現在、クラウド移行を進めている方など参考にして頂ければ幸いです。
ご清覧頂きありがとうございました。
Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。