OCIクラウド移行ガイドとは
オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア(@araidon,@kazunishi,@yama6)による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。
移行したいサンプルワークロード
日々の業務でよく目にするサービスを中心に、サンプルワークロードとしてまとめてみました。このシリーズでは、主にAWSからの移行を取り上げます。
このワークロードは、ユーザがログインして、Web上で写真を共有するWebサービスをイメージしています。
移行するサービス:Amazon Aurora for MySQL
今回、移行対象とするのはAmazon Aurora for MySQLです。
MySQL HeatWave Database ServiceのReplication Channel機能を利用した移行手順をガイドします。
移行のイメージ
今回は、AuroraとMDSとレプリケーションを貼り、Aurora側で行った変更が自動的にMDSに反映されるかの移行検証をしてみたいと思います。
移行にあたり、発生元のサーバー (ソース) でコミットされた各トランザクションに作成および関連付けられる一意の識別子であるGTID(グローバルトランザクション識別子)の設定、変更内容をバイナリログファイルに行形式で保存するbinlog_formatをAuroraのパラメータグループで設定します。
MySQL 8.0 リファレンスマニュアル 17.1.3.1 GTID 形式および格納
https://dev.mysql.com/doc/refman/8.0/ja/replication-gtids-concepts.html
MySQL 8.0 リファレンスマニュアル 5.4.4.2 バイナリログ形式の設定
https://dev.mysql.com/doc/refman/8.0/ja/binary-log-setting.html
移行の仕組については、下記の情報を参考にしました。
高可用性・性能がアップデート!MySQL HeatWave最新情報
https://www.mysql.com/jp/news-and-events/web-seminars/mysql-heatwave-tech-updates-enhancements-in-ha-and-performance/
今回行う移行方式は、本資料のInbound Replicationに該当します。
前提条件
AWSとOCIがVPN接続されていること、Aurora,MDSそれぞれに接続するための踏み台サーバがパブリックサブネット上に構築されていることが前提条件です。
(OCIとAWSのVPN接続手順については、後日、別の記事で解説します。)
接続手順は下記の記事を参考にしてください。
移行手順
- Auroraの作成
- MDSの作成
- Aurora--->MDS:レプリケーションの検証
1. Auroraの作成
AWS側でAuroraを作成します。
1-1. Aurora:パラメータグループの作成
まずはパラメータグループにて、行ベースのレプリケーションを有効化、GTIDの有効化していきます。
RDS>パラメータグループ から、パラメータグループを作成します。
今回は、移行元のAuroraのMySQLのメジャーバージョンは8.0とします。
DB Cluster Parameter Groupを設定すると、クラスタに紐づくDBすべてに同じパラメータが設定されます。
1-2. Aurora:パラメータグループの編集
作成後、編集ボタンから編集画面に遷移し、パラメータを変更します。
変更するパラメータは下記5つです。
パラメータ | 値 |
---|---|
binlog_format | ROW |
gtid-mode | ON |
enforce_gtid_consistency | ON |
character_set_database | utf8mb4 |
character_set_server | utf8mb4 |
MDSにおけるキャラクタセットのデフォルトはutf8mb4なので、こちらも変更します。
「パラメータをフィルタリング」の検索欄に上記パラメータ名を入れ、値を入力し、「変更を保存」を押下します。
1-3. Aurora:DBの作成
RDS>データベースから、「データベースの作成」ボタンを押下します。
必要な設定箇所は下記の通りです。
データベースの作成ボタンを押下し、ステータスが利用可能になるまで待ちます。
1-4. Aurora:DBへの接続
利用可能のステータスが確認できたら、ライターのエンドポイントをコピーします。
下記のコマンドで、エンドポイントに対して接続します。
今回は、mysql ClientをインストールしたEC2からmysql接続を行っています。
[ec2-user@ip-10-1-3-181 ~]$ mysql -u admin -p -h test-cluster-1-instance-1.cn07mhl9cm4v.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1900
Server version: 8.0.28 Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
1-5. Aurora:レプリケーションユーザの準備
このあと作成するMDSにて、チャネルを作成して、Auroraとレプリケーションを行います。その際にソースDB(今回は移行元のAurora)からレプリケーションユーザを提供する必要があります。ユーザを作成し、権限を設定します。
mysql> CREATE USER repluser@'%' IDENTIFIED BY '任意パスワード';
mysql> GRANT REPLICATION SLAVE on *.* to repluser@'%';
任意パスワードには、大文字小文字の英字、数字、記号を含めてください。
AWS側では怒られませんが、OCI側のパスワードポリシーが、8文字から32文字までの長さで、大文字、小文字、数字および特殊文字をそれぞれ1つ以上含める必要があるため、のちに怒られます。
1-6. Aurora:GTIDの確認
後に必要となる、GTIDを確認します。
mysql> show global variables like 'GTID%';
表示されたGTIDをコピーしてメモしておきます。
+----------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------------+
| gtid_executed | <<この部分をコピー>> |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | コピー部分と同値:X-XX |
+----------------------------------+--------------------------------------------+
5 rows in set (0.03 sec)
ここまでで、Aurora側の設定は一旦完了です。
2. MDSの作成
次にOCI側でMDS(MySQL HeatWave Database Service)を作成します。
2-1. MDS:DBの作成
データベース>MySQL HeatWave>DBシステムを選択し、DBシステム作成画面に遷移します。DBシステムの作成ボタンを押下します。
必要な設定箇所は下記の通りです。
*1:シェイプの選択>シェイプの変更ボタンから変更できます。
*2:拡張オプションの表示ボタンを押下してください。
設定項目が入力できたら、作成ボタンを押下してください。
2-2. MDS:DBへの接続
アクティブのステータスが確認できたら、エンドポイントをコピーします。
エンドポイントは、DBシステムの詳細画面から、リソース>エンドポイントのラベルを押下すると確認できます。
※ホスト名がエンドポイントになります。
下記のコマンドで、エンドポイントに対して接続します。
mysql ClientをインストールしたCompute VMからmysql接続を行っています。
[opc@test-instance ~]$ mysql --host testmds.testprisubnet.testvcn.oraclevcn.com -u admin -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 480
Server version: 8.0.34-u3-cloud MySQL Enterprise - Cloud
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2-3. GTIDの設定
まずはMDS側でGTIDを確認します。下記コマンドを実行してください。
mysql> show global variables like 'GTID%';
先ほどAurora側で確認できたgtid_executedの値が空になっていることが確認できます。
ここに、さきほどメモを残したAuroraのGTIDを設定します。
mysql> call sys.set_gtid_purged("<<コピーしたGTID>>");
再度、GTIDの確認コマンドを実行します。
mysql> show global variables like 'GTID%';
+----------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------------+
| gtid_executed | <<設定したGTID>> |
| gtid_executed_compression_period | 0 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | <<設定したGTID>> |
+----------------------------------+--------------------------------------------+
5 rows in set (0.00 sec)
先述した通り、このGTIDを両方のDBに持たせて、Aurora (ソース) でコミットされた各トランザクションをMDS(ターゲット)に反映し、レプリケーションを実現します。
2-4. MDS:Replication Channelの作成
Replication Channelは、DBシステムの詳細画面から、リソース>チャネルのラベルを押下して作成します。
ソース接続のフィールドに、「1-5. Aurora:レプリケーションユーザの準備」 で作成したレプリケーションユーザの情報を入力します。
設定項目 | 値 |
---|---|
ホスト名 | Auroraのライターエンドポイント名 |
ユーザ名 | レプリケーションユーザ名 |
パスワード | 設定した任意の値 |
SSLモード | 無効 |
レプリケーションのポジショニング | ソースで、GTID自動ポジショニングを使用できます(推奨) |
チャネルの作成ボタンを押下します。
※「注意が必要」となる場合は、作成に失敗しています。下記リファレンスを参照して、設定を確認してください。
3. Aurora--->MDS:レプリケーションの検証
AuroraでDBを構築し、それらがMDSで反映されるか確認します。
テストデータは、GitHubの下記データを利用します。
3-1. EC2:Gitのインストール
下記コマンドを実行します。
[ec2-user@ip-10-1-3-181 ~]$sudo yum install git-all
---略---
[ec2-user@ip-10-1-3-181 ~]$ git -v
git version 2.40.1
3-2. EC2:テストデータの準備
下記コマンドを実行し、test_dbディレクトリにテストデータを準備します。
[ec2-user@ip-10-1-3-181 ~]$git clone https://github.com/datacharmer/test_db
さらに、test_dbディレクトリに移動します。
[ec2-user@ip-10-1-3-181 ~]$ cd test_db
[ec2-user@ip-10-1-3-181 ~]$ cd test_db
[ec2-user@ip-10-1-3-181 test_db]$ ls
Changelog employees.sql employees_partitioned_5.1.sql load_departments.dump load_dept_manager.dump load_salaries1.dump load_salaries3.dump objects.sql show_elapsed.sql test_employees_md5.sql test_versions.sh
README.md employees_partitioned.sql images load_dept_emp.dump load_employees.dump load_salaries2.dump load_titles.dump sakila sql_test.sh test_employees_sha.sql
[ec2-user@ip-10-1-3-181 test_db]$
テストデータがクローンされたことが確認できました。
3-3. Aurora:テストデータの投入
まず、踏み台のEC2からAuroraに接続します。
[ec2-user@ip-10-1-3-181 test_db]$ mysql -u admin -p -h test-cluster-1.cluster-cn07mhl9cm4v.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3908
Server version: 8.0.28 Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
sourceコマンドを実行し、test_dbディレクトリにクローンした SQL スクリプトファイルを実行します。このコマンドにより、employeesというDBが構築されます。
その前に、Aurora、MDSでそれぞれの初期状態を確認しておきましょう。
Aurora
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_aurora |
+--------------------+
5 rows in set (0.00 sec)
MDS
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mysql_audit |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
当然ですが、それぞれのDBにて、employeesというDBは作られていません。
では、テストデータを投入します。Auroraにて、下記コマンドを実行してください。
Aurora
mysql> source employees.sql;
Query OK, 0 rows affected, 1 warning (0.01 sec)
Query OK, 1 row affected (0.01 sec)
Database changed
+-----------------------------+
| INFO |
+-----------------------------+
| CREATING DATABASE STRUCTURE |
+-----------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected, 6 warnings (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
+------------------------+
| INFO |
+------------------------+
| storage engine: InnoDB |
+------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.04 sec)
~略~
3-4. 実行結果の確認
MDS側に結果が反映されたか確認してみます。
MDS
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| employees |
| information_schema |
| mysql |
| mysql_audit |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
employeesというDatabaseが追加されたことが確認できました!
中身を見てみましょう。
MDS
mysql> use employees;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------------+
| Tables_in_employees |
+----------------------+
| current_dept_emp |
| departments |
| dept_emp |
| dept_emp_latest_date |
| dept_manager |
| employees |
| salaries |
| titles |
+----------------------+
8 rows in set (0.00 sec)
mysql> select * from employees limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-----------+--------+------------+
| 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
| 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 |
| 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 |
| 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 |
| 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 |
| 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 |
| 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 |
| 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
| 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 |
| 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)
Auroraでも同様にemployeesテーブル内のデータも確認します。
Aurora
mysql> use employees;
Database changed
mysql> show tables;
+----------------------+
| Tables_in_employees |
+----------------------+
| current_dept_emp |
| departments |
| dept_emp |
| dept_emp_latest_date |
| dept_manager |
| employees |
| salaries |
| titles |
+----------------------+
8 rows in set (0.00 sec)
mysql> select * from employees limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-----------+--------+------------+
| 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
| 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 |
| 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 |
| 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 |
| 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 |
| 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 |
| 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 |
| 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
| 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 |
| 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)
実行結果比較
Aurora | MDS |
---|---|
まとめ
このあと、試しにAurora側で作成したDBを削除したところ、MDS側でも即時に変更が反映されていました。
結果、AuroraからMDSの移行はReplication Channelで実現することができました。
次回は、Aurora Serverlessからの移行を試してみたいと思います。