DMS で AWS RDS へ継続的に移行してみた
こんにちは、森田です。
今回の記事では、DMSを試すべく自身が契約しているVPSのRDBをAWSのRDSへ移行を行います。
やりたいこと
別環境のVPSのRDBをAWSのRDSに継続的に移行させます。
また、VPSのRDBはWordPressのデータが入っていますので、RDSへ移行後EC2よりアクセスし、再現できているかの確認まで行います。
Database Migration Service(DMS)とは
AWS Database Migration Service を使用すると、データベースを短期間で安全に AWS に移行できます。移行中でもソースデータベースは完全に利用可能な状態に保たれ、データベースを利用するアプリケーションのダウンタイムを最小限に抑えられます。AWS Database Migration Service は、広く普及しているほとんどの商用データベースとオープンソースデータベース間のデータ移行でご利用いただけます。 https://aws.amazon.com/jp/dms/
DMSを使用することで、実際のサービスへの影響を抑えながらデータベースの移行が可能となります。
この影響を最小限に抑える仕組みに継続的レプリケーション(CDC)があります。CDCでは移行元の変更の度、移行先へその変更を反映させることができます。
前提
移行元(ソース) | |
---|---|
VPS | さくらのVPS (EC2でも代用可) |
RDB | MariaDB 10.2.27 |
移行先(ターゲット) | |
---|---|
RDB | MariaDB 10.4.13 |
【DMS】レプリケーションインスタンスの設定
このレプリケーションインスタンスが、移行元にアクセスし、データの取得を行います。
defalut VPC内にインスタンスを起動されます。
作成後、パブリックIPとセキュリティグループは後ほど使用しますのでメモしておきます。
RDS(移行先の設定)
セキュリティグループの設定
EC2用のセキュリティグループを作成します。
続いて、EC2とレプリケーションインスタンスのアクセスを許可するようなRDS用のセキュリティグループ(DMS-sg)を作成します。
RDSの作成
移行先のRDSの作成を行います。
今回は、MariaDBを移行させますので、MariaDB
の選択
開発/テスト
のテンプレート選択
認証情報の設定はマスターユーザー名:root, マスターパスワード:任意
セキュリティグループは先ほど作成したDMS-sg
を選択
このような設定で作成を行います。
VPS(移行元の設定)
ユーザの作成
DMSで移行するにあたってユーザの作成が必要となります。
mysqlにログイン後、下記コマンドを実行します。
CREATE USER 'user'@'%' IDENTIFIED BY 'XXXXXX'; GRANT ALL ON *.* TO 'user'@'%';
ポートの解放
レプリケーションインスタンスのアクセスのみを許可するようにパブリックIPを設定します。
firewall-cmd --zone=public --permanent \ --add-rich-rule="rule family=ipv4 source address=XXXXX port protocol=tcp port=3306 accept" firewall-cmd --reload
バイナリログの設定
上記ドキュメントのように継続的にレプリケーション(CDC)を行う場合、DBのバイナリログを有効化する必要があります。
したがって、/etc/my.cnf
に以下の内容を追加します。
[mysqld] server-id=1 log-bin=/var/log/mysql/bin_log/mysql-binarylog log_bin_index=/var/log/mysql/bin_log/mysql-bin.list expire_logs_days=1 binlog_format=ROW binlog_checksum=NONE
【DMS】エンドポイントの設定
ソース(移行元)
VPSに対してエンドポイントを作成します。
移行元の設定になりますのでソースエンドポイント
エンドポイント設定では、サーバ名:VPSのパブリックIP
, 先ほど作成したユーザ名とパスワード
, ポート番号:3306
このような設定で作成を行います。
ターゲット(移行先)
先ほど作成したRDSに対してエンドポイントを作成します。
移行先の設定になりますのでターゲットエンドポイント
RDS DB インスタンス
の選択で先ほどのRDSを選択すると、自動でサーバ名などが補完されます。
【DMS】データベース移行タスクの作成
最後に移行タスクの作成を行います。
先ほど作成したインスタンス、エンドポイントの選択を行います。
また、移行対象のテーブルを設定しますが、今回はwordpressのテーブル全て
としました。
作成後ステータスが実行中
となれば問題ありません。
進行状況が100%となるまで待ちましょう。
上手くいかないとき
データベース移行タスクが起動しない場合、エンドポイントへの接続がうまくできないことが考えられます。
エンドポイント接続テストにてステータスを確認しましょう。
動作検証
先ほど作成したセキュリティグループ(ec2-dms-demo)でインスタンスを立て、下記のユーザデータでWordPressのインストールまで行います。
#!/bin/bash yum update -y # amazon-linux-extrasを使用して Maria DB php をインストール amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2 # mariadb-server , Apacheのインストール yum install -y httpd mariadb-server systemctl start httpd systemctl enable httpd # ファイルの所有権、権限を変更 usermod -a -G apache ec2-user chown -R ec2-user:apache /var/www chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \; find /var/www -type f -exec sudo chmod 0664 {} \; # PHPの動作確認ファイル生成 echo "<!--?php phpinfo(); ?-->" > /var/www/html/phpinfo.php # 依存ライブラリインストール yum install php-mbstring php-xml -y # 各サービスの再起動 systemctl restart httpd systemctl restart php-fpm # WordPressのインストール wget http://ja.wordpress.org/latest-ja.tar.gz tar xvfz latest-ja.tar.gz cp wordpress/wp-config-sample.php wordpress/wp-config.php cp -r wordpress /var/www/html/ chown –R ec2-user:apache /var/www/html/wordpress
インストール後、/var/www/html/wordpress/wp-config.php
の中身をRDSの設定に書き換えます。
// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** // /** WordPress のためのデータベース名 */ define( 'DB_NAME', 'VPSのテーブル名' ); /** MySQL データベースのユーザー名 */ define( 'DB_USER', 'RDSユーザ名' ); /** MySQL データベースのパスワード */ define( 'DB_PASSWORD', 'RDSパスワード' ); /** MySQL のホスト名 */ define( 'DB_HOST', 'RDSエンドポイント' );
変更後EC2のパブリックIP/wordpress
に接続すると、VPSと同じ表示であることが確認できます。
また、CDCを行なっていますので、VPSのWordPressで記事を追加すると、
RDSでも追加されていることが確認できます。
これで、DMSにて継続的レプリケーション(CDC)が行えていることが確認されました。
補足
今回は、同エンジンにて移行を行いましたが、異なるエンジンにも適用できます。
(ただし、ソースごとに制約がありますので確認する必要はあります)