Facebook Twitter
お問い合わせ
TOPICS
更新情報
ホーム > ブログ > Oracle Cloud > OCI MySQL Database Service(MDS)でリージョン間レプリケーションを構成する

OCI MySQL Database Service(MDS)でリージョン間レプリケーションを構成する

ブログ
Oracle Cloud
2023.12.04

本記事は、Oracle Cloud Infrastructure Advent Calendar 2023のDay4として書いています。
(Day8まで弊社メンバーが続きます。きっと有意義な記事が控えてますのでご期待ください!)

こんにちは。g.saitoです。

今回はOCI MySQL Database Service(以下、MDS)から別リージョンに作成したMDSへレプリケーションを構成する方法についてご紹介します。


レプリケーションについて

今回記載するレプリケーション(replication)とは、データベースにおけるレプリケーションで「複製」と訳され、あるデータベースから別のデータベースへとデータを複製/同期することです。多くのリレーショナルデータベース管理システムにはレプリケーション、つまりデータベースを複製する機能があります。

レプリケーションの主な使用用途として可用性の向上負荷分散がありますが、本記事では前者の目的で利用しています。データベースを複製しておくことで、何らかの理由で複製元データベースへ接続ができなくなっても、アクセス先を複製先データベースへ変更することで引き続きデータベースを利用することができます。

このとき、複製元は「マスタ」や「プライマリ」と呼ばれ、複製先は「レプリカ」や「セカンダリ」、「スタンバイ」などと呼ばれます。複製先サーバの構成や稼働状態によって「ホットスタンバイ」「ウォームスタンバイ」「コールドスタンバイ」と区別されることもあります。ここでは、それぞれの特徴やメリット/デメリットについては説明しませんが、気になる方は調べてみてください。

また、レプリケーションには複製データをレプリカ側へ転送するタイミングによって、「同期レプリケーション」と「非同期レプリケーション」に分けられます。

「同期レプリケーション」がレプリカの応答を待ってからマスタの処理を完了するのに対し、「非同期レプリケーション」はレプリカの応答を待たずに処理を完了し、任意のタイミングまたは一定間隔でデータを転送し複製します。
これにより「同期レプリケーション」は処理速度は遅いがデータが常に同一に保たれ、「非同期レプリケーション」は処理速度は速いがフェイルオーバーのタイミング次第でデータを損失しないとも限らないという特徴があります。
MDSの提供するレプリケーションは後者の「非同期レプリケーション」となります。


本記事の構成図

本記事で構成する環境は以下のとおりです。


レプリケーションの構成

事前準備

リモートVCNピアリングの構成

本記事の構成ではマスタMDSを東京リージョン、レプリカMDSを大阪リージョンへ配置します。
したがってレプリケーション時にリージョン間通信が必要になるため、リモートVCNピアリングを構成します。
ここでは手順を割愛しますので、過去の記事等を参考に構成してください。

レプリケーション構成用インスタンスの準備

レプリケーションを構成する際にMDSへの接続が必要になるため、専用のインスタンスを1台立ち上げ、MySQL コマンドラインクライアント及びMySQL Shellをインストールしておきます。
(参考:MySQL のインストールMySQL Shell のインストール
本記事でのコマンドライン操作はすべてこのレプリケーション構成用インスタンスから行います。

MDSの作成

先程ピアリングした東京リージョンのVCN、大阪リージョンのVCNそれぞれへMDSを作成します。
本環境では東京リージョン側をマスタ、大阪リージョン側をレプリカとします。
ここの手順についても割愛しますので、OCIチュートリアル等を参考に作成してください。

また、レプリケーション構成後のデータ確認用に、マスタMDSにのみテストデータを作成しておきます。
今回は"food"DB、"ramen"テーブルを作成し、以下の通りテストデータを作成しました。

idnameprice
1Shoyu700
2Shio750
3Miso800
テストデータ(ramenテーブル)

レプリケーションの構成

上記の事前準備が終わったら、いよいよレプリケーションを構成していきます。

①レプリケーション用ユーザの作成と権限の付与(マスタMDS)

レプリカMDSはMySQLのユーザ名とパスワードを使用してマスタMDSに接続するため、レプリカMDSが接続に使用できるユーザーアカウントがマスタに存在し、且つレプリケーションに必要な権限を持っている必要があります。

・マスタMDSへ接続
 ※マスタMDSの管理者ユーザを"root"、接続先を10.0.1.120とします。

[opc@client ~]$ mysql -u root -p -h 10.0.1.120
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78
Server version: 8.0.35-u1-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>

・レプリケーション用ユーザの作成
 今回はレプリケーション用ユーザを"replication_user"、パスワードを"!Password123"に設定します。

mysql> CREATE USER 'replication_user'@'%' IDENTIFIED BY '!Password123' REQUIRE SSL;
Query OK, 0 rows affected (0.00 sec)

mysql>

・レプリケーションに必要なREPLICATION SLAVE権限の付与

mysql> GRANT REPLICATION SLAVE on *.* to 'replication_user'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql>

・マスタMDSの接続を終了

mysql> exit
Bye
[opc@client ~]$ 

②マスタMDSからダンプをエクスポート

マスタMDSに既存データが含まれている場合、レプリケーション構成前にレプリカMDSへコピーしておく必要があります。(今回は事前準備にてテストデータを作成済み)
本記事ではインスタンスダンプユーティリティを使用してマスタMDSからダンプを取得します。

・MySQL ShellでマスタMDSへ接続
 ※パスワード入力後、パスワードを保存するかどうか聞かれるので、[Y]es/[N]o/Ne[v]erのいずれかを選択します。Yesを選択すると、linuxの場合ホームディレクトリ配下の.mylogin.cnfに保存され、次回以降パスワード入力なしでMySQL Shellへログインすることができます。

[opc@client ~]$ mysqlsh -u root -p -h 10.0.1.120
Please provide the password for 'root@10.0.1.120': *********
Save password for 'root@10.0.1.120'? [Y]es/[N]o/Ne[v]er (default No): n
MySQL Shell 8.0.35

Copyright (c) 2016, 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 '\?' for help; '\quit' to exit.
Creating a session to 'root@10.0.1.120'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 89 (X protocol)
Server version: 8.0.35-u1-cloud MySQL Enterprise - Cloud
No default schema selected; type \use <schema> to set one.
 MySQL  10.0.1.120:33060+ ssl  JS >  

・インスタンスダンプユーティリティを使用してデータをダンプ
 ※本記事ではダンプファイルの保存場所を/home/opc/mds配下としますが、オブジェクト・ストレージも指定可能です。また、dry run等のオプションも指定できますので状況に応じてオプションを変更してください。(ドキュメントはこちら

 MySQL  10.0.1.120:33060+ ssl  JS > util.dumpInstance("/home/opc/mds", {ocimds: true, compatibility: ["strip_restricted_grants"]})
Acquiring global read lock
Global read lock acquired
Initializing - done 
1 out of 6 schemas will be dumped and within them 1 table, 0 views.
6 out of 9 users will be dumped.
Gathering information - done 
All transactions have been started
Locking instance for backup
Global read lock has been released
NOTE: When migrating to MySQL HeatWave Service, please always use the latest available version of MySQL Shell.
Checking for compatibility with MySQL HeatWave Service 8.0.35
WARNING: User 'administrator'@'%' has a grant statement on an object which is not included in the dump (REVOKE INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql`.* FROM `administrator`@`%`)
WARNING: User 'administrator'@'%' has a grant statement on an object which is not included in the dump (REVOKE CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_audit`.* FROM `administrator`@`%`)
WARNING: User 'administrator'@'%' has a grant statement on an object which is not included in the dump (REVOKE CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `sys`.* FROM `administrator`@`%`)
NOTE: User 'administrator'@'%' had restricted privilege (SHOW_ROUTINE) removed
NOTE: User 'ociadmin'@'127.0.0.1' had restricted privileges (AUDIT_ABORT_EXEMPT, AUTHENTICATION_POLICY_ADMIN, BINLOG_ADMIN, BINLOG_ENCRYPTION_ADMIN, CLONE_ADMIN, CREATE TABLESPACE, ENCRYPTION_KEY_ADMIN, FILE, FIREWALL_EXEMPT, GROUP_REPLICATION_ADMIN, GROUP_REPLICATION_STREAM, INNODB_REDO_LOG_ARCHIVE, INNODB_REDO_LOG_ENABLE, PASSWORDLESS_USER_ADMIN, PERSIST_RO_VARIABLES_ADMIN, PROXY, RELOAD, REPLICATION_SLAVE_ADMIN, RESOURCE_GROUP_ADMIN, RESOURCE_GROUP_USER, SENSITIVE_VARIABLES_OBSERVER, SERVICE_CONNECTION_ADMIN, SESSION_VARIABLES_ADMIN, SET_USER_ID, SHOW_ROUTINE, SHUTDOWN, SUPER, SYSTEM_USER, SYSTEM_VARIABLES_ADMIN, TABLE_ENCRYPTION_ADMIN, TELEMETRY_LOG_ADMIN) removed
NOTE: User 'ocidbm'@'127.0.0.1' had restricted privileges (SERVICE_CONNECTION_ADMIN, SYSTEM_USER) removed
NOTE: User 'ocirpl'@'%' had restricted privileges (GROUP_REPLICATION_STREAM, SERVICE_CONNECTION_ADMIN, SYSTEM_USER) removed
WARNING: User 'root'@'%' has a grant statement on an object which is not included in the dump (REVOKE INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql`.* FROM `root`@`%`)
WARNING: User 'root'@'%' has a grant statement on an object which is not included in the dump (REVOKE CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_audit`.* FROM `root`@`%`)
WARNING: User 'root'@'%' has a grant statement on an object which is not included in the dump (REVOKE CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `sys`.* FROM `root`@`%`)
NOTE: User 'root'@'%' had restricted privileges (PROXY, SHOW_ROUTINE) removed
NOTE: Database `food` had unsupported ENCRYPTION option commented out
Compatibility issues with MySQL HeatWave Service 8.0.35 were found and repaired. Please review the changes made before loading them.
Validating MySQL HeatWave Service compatibility - done       
Writing global DDL files
Writing users DDL
Running data dump using 4 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done       
Writing DDL - done       
Writing table metadata - done       
Starting data dump
100% (3 rows / ~3 rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
Dump duration: 00:00:00s                                                        
Total duration: 00:00:00s                                                       
Schemas dumped: 1                                                               
Tables dumped: 1                                                                
Uncompressed data size: 34 bytes                                                
Compressed data size: 43 bytes                                                  
Compression ratio: 0.8                                                          
Rows written: 3                                                                 
Bytes written: 43 bytes                                                         
Average uncompressed throughput: 34.00 B/s                                      
Average compressed throughput: 43.00 B/s                                        
 MySQL  10.0.1.120:33060+ ssl  JS > 

・MySQL Shellを終了する

 MySQL  10.0.1.120:33060+ ssl  JS > \quit
Bye!
[opc@client ~]$

・保存場所に指定した/home/opc/mds配下にファイルが出力されていることを確認する
 以下のようなファイル群が作成されていればOK

[opc@client ~]$ ll /home/opc/mds/
total 48
-rw-r----- 1 opc opc  207 Nov 29 06:45 @.done.json
-rw-r----- 1 opc opc  278 Nov 29 06:45 food.json
-rw-r----- 1 opc opc   43 Nov 29 06:45 food@ramen@@0.tsv.zst
-rw-r----- 1 opc opc    8 Nov 29 06:45 food@ramen@@0.tsv.zst.idx
-rw-r----- 1 opc opc  621 Nov 29 06:45 food@ramen.json
-rw-r----- 1 opc opc  698 Nov 29 06:45 food@ramen.sql
-rw-r----- 1 opc opc  556 Nov 29 06:45 food.sql
-rw-r----- 1 opc opc 1196 Nov 29 06:45 @.json
-rw-r----- 1 opc opc  241 Nov 29 06:45 @.post.sql
-rw-r----- 1 opc opc  241 Nov 29 06:45 @.sql
-rw-r----- 1 opc opc 6693 Nov 29 06:45 @.users.sql
[opc@client ~]$

③レプリカMDSへダンプをインポート

②のエクスポートが完了したら、ダンプロードーティリティを使用してレプリカMDSへデータをロードします。

・MySQL ShellでレプリカMDSへ接続
 ※レプリカMDSの管理者ユーザを"root"、接続先を10.1.1.87とします。

[opc@client ~]$ mysqlsh -u root -p -h 10.1.1.87
Please provide the password for 'root@10.1.1.87': *********
Save password for 'root@10.1.1.87'? [Y]es/[N]o/Ne[v]er (default No): n
MySQL Shell 8.0.35

Copyright (c) 2016, 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 '\?' for help; '\quit' to exit.
Creating a session to 'root@10.1.1.87'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 33 (X protocol)
Server version: 8.0.35-u1-cloud MySQL Enterprise - Cloud
No default schema selected; type \use <schema> to set one.
 MySQL  10.1.1.87:33060+ ssl  JS > 

・ダンプロードユーティリティを使用してデータをロード
 こちらも必要に応じてオプションを書き換えてください。(ドキュメントはこちら

  MySQL  10.1.1.87:33060+ ssl  JS > util.loadDump("/home/opc/mds", {loadUsers: false, updateGtidSet: "append"});
Loading DDL and Data from '/home/opc/mds' using 4 threads.
Opening dump...
Target is MySQL 8.0.35-u1-cloud (MySQL HeatWave Service). Dump was produced from MySQL 8.0.35-u1-cloud
Scanning metadata - done       
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done       
Executing view DDL - done       
Starting data load
Executing common postamble SQL                      
Appending dumped gtid set to GTID_PURGED            
100% (34 bytes / 34 bytes), 0.00 B/s, 1 / 1 tables done
Recreating indexes - done 
1 chunks (3 rows, 34 bytes) for 1 tables in 1 schemas were loaded in 0 sec (avg throughput 34.00 B/s)
0 warnings were reported during the load.              
 MySQL  10.1.1.87:33060+ ssl  JS > 

・MySQL Shellの実行モードをSQLモードへ切り替え

 MySQL  10.1.1.87:33060+ ssl  JS > \sql
Switching to SQL mode... Commands end with ;
Fetching global names for auto-completion... Press ^C to stop.
 MySQL  10.1.1.87:33060+ ssl  SQL > 

・レプリカMDSへデータがインポートされたことを確認

  MySQL  10.1.1.87:33060+ ssl  SQL > select * from food.ramen;
+----+-------+-------+
| id | name  | price |
+----+-------+-------+
|  1 | Shoyu |   700 |
|  2 | Shio  |   750 |
|  3 | Miso  |   800 |
+----+-------+-------+
3 rows in set (0.0084 sec)
 MySQL  10.1.1.87:33060+ ssl  SQL > 

④レプリケーション・チャネルの作成

データがインポートされたことが確認できたら、最後にレプリケーション・チャネルを作成します。

・OCIコンソールでレプリカMDSの詳細画面まで遷移し、[リソース]>[チャネル]>[チャネルの作成]を押下

・チャネル作成画面が展開するので、環境に合わせて設定値を入力し[チャネルの作成]を押下
 本環境での設定値は以下の通りです。
 ※各項目の詳細について知りたい場合はOCIのドキュメントを参照してください。

大項目項目設定値
コンパートメントルート/g.saito
名前channel1
説明replication channel to tokyo
ソース接続
ホスト名10.0.1.120
MySQLポート3306
ユーザー名replication_user
パスワード!Password123
SSLモード必須(REQUIRED)
レプリケーションのポジショニングソースで、GTID自動ポジショニングを使用できます(推奨)
ターゲットDBシステム
Applierユーザー名-
チャネル名replication_chennel
主キーのない表許可(ALLOW)
レプリケーション遅延-

・数分待って、チャネルが「アクティブ」になれば作成完了
 ※チャネルのステータスが「注意が必要」になる場合、何らかのエラーによりチャネルが構成できていない状態を表します。マスタ-レプリカ間の疎通やMDSの状態に問題がないか確認してみてください。

レプリケーションデータの確認

レプリケーション・チャネルがアクティブになったら、動作確認としてマスタMDSへの更新がレプリカMDSへ伝搬することを確認していきます。

・マスタMDSへ接続

[opc@client ~]$ mysql -u root -p -h 10.0.1.120
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1858
Server version: 8.0.35-u1-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>

・事前作成したテストテーブルへ適当なレコードをインサート

mysql> select * from food.ramen;
+----+-------+-------+
| id | name  | price |
+----+-------+-------+
|  1 | Shoyu |   700 |
|  2 | Shio  |   750 |
|  3 | Miso  |   800 |
+----+-------+-------+
3 rows in set (0.00 sec)

mysql> insert into food.ramen values(4,'Tonkotsu',850);
Query OK, 1 row affected (0.01 sec)

mysql> select * from food.ramen;
+----+----------+-------+
| id | name     | price |
+----+----------+-------+
|  1 | Shoyu    |   700 |
|  2 | Shio     |   750 |
|  3 | Miso     |   800 |
|  4 | Tonkotsu |   850 |
+----+----------+-------+
4 rows in set (0.01 sec)

mysql> exit
Bye
[opc@client ~]$ 

・レプリカMDSへ接続

[opc@client ~]$ mysql -u root -p -h 10.1.1.87
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1675
Server version: 8.0.35-u1-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>

・マスタMDSへの更新内容がレプリカMDSへ伝搬していることを確認

mysql> select * from food.ramen;
+----+----------+-------+
| id | name     | price |
+----+----------+-------+
|  1 | Shoyu    |   700 |
|  2 | Shio     |   750 |
|  3 | Miso     |   800 |
|  4 | Tonkotsu |   850 |     ←マスタMDSへインサートしたレコードが入っているのでOK
+----+----------+-------+
4 rows in set (0.00 sec)

mysql>

まとめ

いかがでしたでしょうか。
本記事ではMDSから別リージョンのMDSへレプリケーションを構成する方法について紹介しました。
可用性の向上という面でレプリケーションはバックアップと比較されることがありますが、目標復旧時間/コスト/リカバリポイント等でそれぞれメリット/デメリットがあるので、要件に応じて適切な手法を選べるようになるといいですね。

また、本記事では紹介しきれなかったですが、レプリケーション・チャネルのチャネル・フィルタという機能を使用すれば特定のデータベースやテーブルのみレプリケーションするといったことも可能です。こちらはまたの機会にご紹介できればと思います。


この記事が気に入ったら
「いいね!」

この記事を書いた人


関連コンテンツ

CONTACT お問い合わせ

Cloudiiのサービスやプロダクトについて
興味をお持ちの方は、
お気軽にお問い合わせください。