Amazon Aurora から MDS(HeatWave) へのレプリケーション

こんにちは。Oracle Cloud Infrastructure(OCI)特集 編集部です。

前回は MySQL Database Service (MDS)のHeatWave機能を使用したブログを記載しました。
MDSのHeatWave機能を使ってみた

今回は「Amazon Aurora を本番運用DB、MDS(HeatWave)をデータ分析用DB」という環境の構築を想定し、
Aurora⇒MDSへのレプリケーションを行ってみます。

AuroraとのレプリケーションはOCIマニュアルに記載されていないため、サポートされた構成ではありません。あくまでも弊社環境における検証結果とご認識ください。

 

■構成図

■前準備

構成図のようにAWS・OCIのネットワーク環境(VPNを除く)が構築され、
Aurora・MDSを操作するための検証サーバ(Linux)では mysqlコマンドが
使用可能な状態になっているものとします。

■作業の流れ

1.Aurora作成
2.OCI HeatWave作成
3.AWS ⇔ OCI VPN接続設定
4.レプリケーション設定
5.検証

■参考

・MDS Replication のOCIマニュアル(英語)
https://docs.oracle.com/en-us/iaas/mysql-database/doc/replication.html

・[Oracle Cloud] Amazon Aurora から MDS へ Inbound Replication してみた
https://qiita.com/sugimount/items/d24ee900de1001337b87

 

1.Aurora作成

まずはAWS側にてAuroraを作成するのですが、
MDS側のレプリケーションの制限事項は下記の通りです。

※マニュアル抜粋
・行ベースのレプリケーションのみサポート
・GTIDベースのレプリケーションのみサポート
・マルチソースレプリケーションはサポート対象外
・レプリケーションフィルターはサポート対象外
・mysqlスキーマへの変更は複製されず、複製が停止する
・ソースはlower_case_table_names、DBシステムと同じ値で実行する必要がある。
 この値は0で現在、変更することはできない。
・インバウンドアプライヤーは、DBシステムの管理者ユーザーの権限で実行される。

上記の制限事項より、Auroraのデフォルト設定ではGTIDが無効になっていたりしますので、
パラメータグループを作成し、次の設定を行います。

enforce_gtid_consistencyON に設定
gtid-modeON に設定
binlog_formatROW に変更


また、Auroraは MySQL5.7ベースでキャラクタセットのデフォルトで latin1 だったりしますので、
予め下記も設定しておきます。
※MDSの MySQL8.0 のデフォルトは utf8mb4 です。
character_set_databaseutf8mb4 に変更
character_set_serverutf8mb4 に変更


それでは実際にAuroraを作成します。
赤枠で囲った部分を環境に合わせて設定しますが、
パラメータグループは前の手順で作成したものを設定します。










作成後、「種類」が「書き込み」のエンドポイント名を確認します。
※ここでは「mds-heatwave-demo-aurora-cluster1.cluster-c4naunmu7bjw.ap-northeast-1.rds.amazonaws.com」でした。

作成したAuroraへ接続するにあたり、
検証サーバ(linux)からmysqlコマンドを実行して接続します。

$ mysql -u admin -p -h mds-heatwave-demo-aurora-cluster1.cluster-c4naunmu7bjw.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, 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>


MDS⇒Auroraへ接続してレプリケーションを行うためのユーザーを作成するにあたり、
下記を実行します。
※ここではユーザ名を「repluser」、パスワードを「[任意のパスワード]」と記載していますが、
 これらは後程、MDSのチャネル作成時に使用するためメモしておきます。

mysql> CREATE USER repluser@'%' IDENTIFIED BY '[任意のパスワード]';
Query OK, 0 rows affected (0.01 sec)

mysql>

レプリケーション用ユーザへの権限設定を行います。
mysql> GRANT REPLICATION SLAVE on *.* to repluser@'%';
Query OK, 0 rows affected (0.01 sec)

mysql>

 

2.OCI HeatWave作成

OCI側にてMDS(HeatWave)を作成します。
こちらの手順は以前のブログをご参照ください。
MySQL Database Service (MDS)を使ってみた
MDSのHeatWave機能を使ってみた

 

3.AWS ⇔ OCI VPN接続設定

続いてレプリケーションを行うにあたり AWS ⇔ OCI 間でのVPN接続を行うのですが、
こちらの手順は前々回のブログをご参照ください。
OCIとAWSでVPN接続をしてみた(マネージドサービス同士で接続)

 

4.レプリケーション設定

Aurora側にて下記のように実行します。
このうち、「gtid_executed」と表示された箇所をメモしておきます。
※ここでは c1723852-f03f-3146-b44e-daa18a5bb569:1-209 ですね。

mysql> show global variables like 'GTID%';
+----------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------------+
| gtid_executed | c1723852-f03f-3146-b44e-daa18a5bb569:1-209 |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | c1723852-f03f-3146-b44e-daa18a5bb569:1-10 |
+----------------------------------+--------------------------------------------+
5 rows in set (0.03 sec)

mysql>


MDSに接続し、下記を実行してGTIDを確認します。
まだGTIDが設定されていない状態です。

mysql> show global variables like 'GTID%';
+----------------------------------+-------+
| Variable_name | Value |
+----------------------------------+-------+
| gtid_executed | |
| gtid_executed_compression_period | 0 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | |
+----------------------------------+-------+
5 rows in set (0.00 sec)
[2021-03-12 16:29:50.587]
mysql>

続いて、下記を実行してGTIDを設定します。

mysql> call sys.set_gtid_purged("c1723852-f03f-3146-b44e-daa18a5bb569:1-209");
Query OK, 0 rows affected (0.01 sec)

mysql>

下記を実行し、GTIDが設定されたことを確認します。
mysql> show global variables like 'GTID%';
+----------------------------------+--------------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------------+
| gtid_executed | c1723852-f03f-3146-b44e-daa18a5bb569:1-209 |
| gtid_executed_compression_period | 0 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | c1723852-f03f-3146-b44e-daa18a5bb569:1-209 |
+----------------------------------+--------------------------------------------+
5 rows in set (0.00 sec)

mysql>

続いてMDSにてチャネルを作成するにあたり、
OCI Webコンソールにて該当のMDSの画面へ移動します。

画面の左下の「チャネル」をクリックし、「チャネルの作成」を押下します。

名前には任意の名前を入力し、
「ソース接続」の箇所にてAuroraの情報を入力します。
ホスト名:mds-heatwave-demo-aurora-cluster1.cluster-ro-c4naunmu7bjw.ap-northeast-1.rds.amazonaws.com  ※Auroraのエンドポイント名
ポート名:3306
ユーザー名:repluser  ※「1.Aurora作成」の中で設定したユーザ名
パスワード:※「1.Aurora作成」の中で設定したパスワード
パスワードの確認:※「1.Aurora作成」の中で設定したパスワードを再入力



 

5.検証

実際に、Aurora側にデータを入れ込んでみます。
検証にあたり、データはMySQLのサイトの「employee data」を使ってみます。
https://dev.mysql.com/doc/index-other.html

AWS側の検証サーバにて下記を行います。
※gitも予めインストールしておきます。
$ git clone https://github.com/datacharmer/test_db
$ cd test_db
$ mysql -u admin -p -h mds-heatwave-demo-aurora-cluster1.cluster-c4 naunmu7bjw.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.7.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, 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>
mysql>
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.07 sec)

~~ 中略 ~~

Query OK, 0 rows affected (0.08 sec)

+---------------------+
| INFO |
+---------------------+
| LOADING departments |
+---------------------+
1 row in set (0.00 sec)

Query OK, 9 rows affected (0.01 sec)
Records: 9 Duplicates: 0 Warnings: 0

+-------------------+
| INFO |
+-------------------+
| LOADING employees |
+-------------------+
1 row in set (0.00 sec)

Query OK, 17944 rows affected (0.32 sec)
Records: 17944 Duplicates: 0 Warnings: 0

~~ 中略 ~~

Query OK, 16209 rows affected (0.29 sec)
Records: 16209 Duplicates: 0 Warnings: 0

+------------------+
| INFO |
+------------------+
| LOADING dept_emp |
+------------------+
1 row in set (0.00 sec)

Query OK, 24940 rows affected (0.64 sec)
Records: 24940 Duplicates: 0 Warnings: 0

~~ 中略 ~~

Query OK, 12609 rows affected (0.34 sec)
Records: 12609 Duplicates: 0 Warnings: 0

+----------------------+
| INFO |
+----------------------+
| LOADING dept_manager |
+----------------------+
1 row in set (0.00 sec)

Query OK, 24 rows affected (0.00 sec)
Records: 24 Duplicates: 0 Warnings: 0

+----------------+
| INFO |
+----------------+
| LOADING titles |
+----------------+
1 row in set (0.01 sec)

Query OK, 21707 rows affected (0.38 sec)
Records: 21707 Duplicates: 0 Warnings: 0

~~ 中略 ~~

Query OK, 15401 rows affected (0.26 sec)
Records: 15401 Duplicates: 0 Warnings: 0

+------------------+
| INFO |
+------------------+
| LOADING salaries |
+------------------+
1 row in set (0.00 sec)

Query OK, 25526 rows affected (0.42 sec)
Records: 25526 Duplicates: 0 Warnings: 0

~~ 中略 ~~

Query OK, 7671 rows affected (0.12 sec)
Records: 7671 Duplicates: 0 Warnings: 0

+---------------------+
| data_load_time_diff |
+---------------------+
| NULL |
+---------------------+
1 row in set (0.00 sec)

mysql>

MDS側でデータベースが作成されていることを確認します。

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| employees |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)

mysql>

テーブルが作成されていることも確認します。
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>
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>

※検証中にレプリケーションで不整合が発生し、
 データをインポートし直して
 call sys.set_gtid_purged(“+gtidSet”)
 を実行したのですがエラーとなり、”reset master”も権限不足で実行できないようです。
 残念ながらこの場合はMDSを再構築する必要があるみたいですが、
 今後の改善に期待してます!

まとめ

わりと簡単にAurora ⇒ MDSのレプリケーション設定を行うことができました。
他のMySQLベースのサービスについても別の機会にやってみようと思います。

<免責事項>
 情報の掲載には注意を払っておりますが、掲載された情報の内容の正確性については一切保証しません。また、当サイトに掲載された情報を利用・使用(閲覧、投稿、外部での再利用など全てを含む)するなどの行為に関連して生じたあらゆる損害等につきましても、理由の如何に関わらず自己責任で行う必要があります。