[アップデート] Azure Database for MySQL でユニバーサルリージョンへのリードレプリカ追加がサポートされたので試してみた

2023.10.14

いわさです。

Microsoft Azure のマネージドな MySQL サービスに Azure Database for MySQL があります。
この Azure Database for MySQL にはリードレプリカを追加することが出来るのですが、別リージョンへリードレプリカを追加することが出来ます。

これまでは同一リージョンあるいはペアリージョンにリードレプリカを追加することが出来たのですが、先日のアップデートでユニバーサルリージョンへリードレプリカを追加することが出来るようになりました。

ユニバーサルリージョン

Azure にはペアリージョンという概念があります。

リージョン間の距離や、その他の要因に基づいて、リージョン間レプリケーションなどのためにペアリングされたリージョンです。東日本リージョンの場合はペアリージョンは西日本リージョンとなります。

それに対して、ペアリージョン以外の任意の関係性のリージョンをユニバーサルリージョンと呼んでいるようです。

ちなみに過去のリードレプリカのアップデートとして、同一リージョンへのレプリケーションは 2022 年 9 月に、ペアリージョンへのレプリケーションは 2023 年 6 月に GA となっています。

リードレプリカの追加方法

リードレプリカ機能を使うための前提条件がいくつかあって、廃止予定のシングルサーバーでは使えないのと、Compute が Burstable 以外である必要があります。

The read replica feature is only available for Azure Database for MySQL - Flexible servers in the General Purpose or Business Critical pricing tiers. Ensure the source server is in one of these pricing tiers.

参考:Read replicas - Azure Database for MySQL - Flexible Server | Microsoft Learn

Burstable プランの場合は次のようにスケールアップを求めるメッセージが表示されます。

前提条件が満たされていれば、Replication メニューからリードレプリカの追加が可能です。

作成するリードレプリカのリージョンなどを指定します。
次のように同一リージョン(ソースリージョン)、ペアリージョン(今回は East US だったので West US)、それ以外のリージョンから選択が可能です。

なお、リードレプリカは同一サブスクリプションの同一リソースグループに作成され、多くのパラメータはプライマリサーバーを踏襲し変更出来ない状態で構築されます。
次のようにサーバー名やリージョンなどいくつかのパラメータが変更可能でした。

追加されました。
今回は East Asia リージョンと West Europe リージョンへリードレプリカを追加してみました。
次のように Role でプライマリとレプリカを確認することが出来ます。

なお、ドキュメントを読んでいて気がついたのですが、フェイルオーバー機能は存在しないようです。
手動で昇格することでクラスターからの切り離しは可能なのですがプライマリをレプリカに降格させることは出来ないようです。昇格については今回試していますので後述します。

書き込みワークロードのグローバルレベルでの高可用性を得るためのものではなくて、読み取り専用ワークロードの高可用性を得る、あるいは読み取りクエリのレイテンシ削減の用途で使うことになりそうです。

ちなみに作成されたリードレプリカはリソースグループでも通常の Azure Database for MySQL リソースとして認識されています。

レプリカごとのエンドポイント

接続エンドポイントについてもそれぞれのレプリカに対してのエンドポイントを指定して接続する形となります。
リーダーエンドポイントなどが用意されていて負荷分散されている形ではありません。クライアント側で接続先を管理する必要がありますのでご注意ください。

リードレプリカに接続してみました。
プライマリサーバーのデータがレプリケーションされていることを確認出来ました。

% mysql -h fuga1014mysql2.mysql.database.azure.com -u hoge -D hogedb -p 
Enter password: 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 8.0.32 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> select * from fuga;
+------+------+
| val1 | val2 |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
+------+------+
3 rows in set (0.12 sec)

書き込みが出来ないことも確認しました。

mysql> insert into fuga values (4, 'ddd');
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

昇格(Promote)

レプリケーションメニューで、サーバーを指定した昇格(Promote)が行えるので試してみました。

注意書きを確認し、Promote ボタンを押します。
ここでいう昇格はレプリカをプライマリに昇格させて、プライマリをレプリカに下げるようなイメージではなく、昇格指定したリードレプリカへのソースサーバーからのレプリケーションを停止し、書き込み可能にするというものです。

昇格後、ソースサーバーのレプリケーションメニューを見てみると昇格したサーバーが表示されなくなっており、切り離されたことがわかります。既存サーバーを別のソースサーバーのレプリカにすることは現状出来ないようなので、リードレプリカが必要な場合はまた追加が必要となりますね。

先程の接続を使って、昇格後に書き込みが出来るようになっていることを確認しました。

mysql> insert into fuga values (4, 'ddd');
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

mysql> insert into fuga values (4, 'ddd');
Query OK, 1 row affected (0.09 sec)

mysql> select * from fuga;
+------+------+
| val1 | val2 |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    4 | ddd  |
+------+------+
4 rows in set (0.08 sec)

削除操作はサーバー自体が削除される

昇格(Promote)以外に、削除(Delete)メニューも存在しています。

こちらを対象のレプリカのリソース自体を削除するものです。
レプリケーションメニューから削除操作を行ったのち、リソースが削除されていることを確認しました。

こちらで操作を行う際は、対象リードレプリカのエンドポイントが使用されていないことを確認出来たのちに実施するようにしましょう。

さいごに

本日は Azure Database for MySQL でユニバーサルリージョンへのリードレプリカ追加がサポートされたので試してみました。

自動フェイルオーバーやリーダーエンドポイントなどのマネージドな機能が無いので、利用方法に気をつける必要はありますが、分析ワークロードが別リージョンにある場合にリードレプリカへ読み取り負荷をオフロードしつつ、低遅延で接続したい場合などに活用出来そうですかね。