[アップデート] Amazon Aurora MySQL でリードレプリカの書き込み転送機能がサポートされたので使ってみた

2023.08.02

いわさです。

Aurora グローバルデータベースでは書き込み転送機能があります。
リーダーエンドポイントのみのセカンダリリージョンで書き込み操作を行うと、プライマリリージョンへ書き込みを転送してくれる機能です。

このグローバルデータベースでサポートされていた機能が単一リージョンの Aurora クラスターでも利用できるようになりました。
この機能を有効化することで、クライアントからリードレプリカに対して書き込み操作を行った場合に、リーダーインスタンスがライターインスタンスに書き込み操作を転送してくれます。

従来リードレプリカを導入する場合はクライアントアプリケーション側でライターエンドポイントとリーダーエンドポイントを管理しなければいけませんでした。
いくつか制限事項や注意点はありますが、この機能をうまく活用できると、アプリケーション側からはリーダーエンドポイントに対して接続して書き込みも読み込みも行うことが出来るようになります。顧客が本当に必要だったものというやつか?

またアプリケーション側の複雑な実装を回避できるだけでなく、従来は書き込み後の更新内容を読み込む場合もライターから読み込みを行う必要がありましたが、その際の読み込み処理をリーダーにオフロードすることでライターインスタンスのリソースを効率的に使用出来る効果があるようです。なるほど。

クラスター構成で「ローカル書き込み転送」を有効化する必要がある

まず、本機能は Aurora MySQL の 3.04.0 (compatible with MySQL 8.0.28) 以上で利用が可能です。

対象バージョンで次の構成を有効化することがまず前提となります。

リーダーで書き込んで見る

もうひとつ前提があるのですが、この時点でライターとリーダーの挙動を確認してみましょう。
次のようにリードレプリカ有りのクラスターを作成済みです。

ライターインスタンスでテーブル作成

まずはライターインスタンスでテーブルと適当なレコードを作成しておきます。

% mysql -h hoge0802aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -u admin -D hogedb -p   
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 104
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> create table fugatbl (hoge1 int, hoge2 varchar(40));
Query OK, 0 rows affected (0.05 sec)

mysql> insert into fugatbl values (1, "aaa");
Query OK, 1 row affected (0.04 sec)

mysql> insert into fugatbl values (2, "bbb");
Query OK, 1 row affected (0.05 sec)

mysql> select * from fugatbl;
+-------+-------+
| hoge1 | hoge2 |
+-------+-------+
|     1 | aaa   |
|     2 | bbb   |
+-------+-------+
2 rows in set (0.03 sec)

mysql>

クラスターで有効化しただけだと、デフォルトではリーダーから書き込みは出来ない

続いてリーダーエンドポイントに接続して書き込み操作を行ってみます。

% mysql -h hoge0802aurora.cluster-ro-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -u admin -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 58
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> select * from fugatbl;
+-------+-------+
| hoge1 | hoge2 |
+-------+-------+
|     1 | aaa   |
|     2 | bbb   |
+-------+-------+
2 rows in set (0.04 sec)

mysql> insert into fugatbl values (3, "ccc");
ERROR 1836 (HY000): Running in read-only mode

書き込み操作に失敗しましたね。
クラスターの書き込み転送を有効化しただけだとこのように機能はまだ使えません。

aurora_replica_read_consistency パラメータの設定が必要

機能を使うために Aurora クラスターパラメータグループの aurora_replica_read_consistency パラメータを設定する必要があります。

デフォルトでは次のように未設定の状態となっており、この状態では書き込み転送機能が使えない状態です。
許容される値は EVENTUAL、SESSION、GLOBAL です。
ここでは EVENTUAL を設定します。これは書き込み転送時の整合性オプションとなっています。

ライターへ転送されてからリーダーに反映されるまでラグがあるわけですが、結果整合性だとまずい場合は強めの整合性オプションを指定しておくことで同期待ちの時間と整合性でトレードオフ出来ます。挙動の掘り下げは本日行いません。

オプションを設定したらもう一度リーダーエンドポイントで書き込み操作を行ってみます。

% mysql -h hoge0802aurora.cluster-ro-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -u admin -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 95
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> select @@aurora_replica_read_consistency;
+-----------------------------------+
| @@aurora_replica_read_consistency |
+-----------------------------------+
| EVENTUAL                          |
+-----------------------------------+
1 row in set (0.03 sec)

mysql> insert into fugatbl values (3, "ccc");
Query OK, 1 row affected (0.07 sec)

mysql> select * from fugatbl;
+-------+-------+
| hoge1 | hoge2 |
+-------+-------+
|     1 | aaa   |
|     2 | bbb   |
|     3 | ccc   |
+-------+-------+
3 rows in set (0.02 sec)

おお、書き込み操作が出来ましたね。

整合性の確認

EVENTUAL を設定したので、軽く整合性の動作を確認してみます。
INSERT 直後に SELECT を実行してみます。

mysql> insert into fugatbl values (7, "ggg");select * from fugatbl;
Query OK, 1 row affected (0.03 sec)

+-------+-------+
| hoge1 | hoge2 |
+-------+-------+
|     1 | aaa   |
|     2 | bbb   |
|     3 | ccc   |
|     4 | ddd   |
|     5 | eee   |
|     6 | fff   |
+-------+-------+
6 rows in set (0.03 sec)

mysql> select * from fugatbl;
+-------+-------+
| hoge1 | hoge2 |
+-------+-------+
|     1 | aaa   |
|     2 | bbb   |
|     3 | ccc   |
|     4 | ddd   |
|     5 | eee   |
|     6 | fff   |
|     7 | ggg   |
+-------+-------+
7 rows in set (0.03 sec)

INSERT 直後の SELECT ではまだ更新が反映されていないですね。
先程のオプションで整合性のレベルを変更することで、直後の SELECT で更新反映されたものを確実に取得することができるようになります。

ただし、変更が反映されるまで待機時間が発生する場合がありアプリケーションのパフォーマンスに影響が出る場合があります。
強い整合性レベルが必要で反映までのタイムラグを無視できない場合は、引き続き直接ライターエンドポイントへの書き込み・読み込み操作が必要です。

制限事項

制限事項というか、書き込み転送でサポートされていない機能がいくつかあります。

上記ドキュメントでは TEMPORARY TABLE から SELECT したレコードを INSERT する場合や、XA トランザクション、LOAD ステートメントなど触れられています。
本機能の利用にあたって、アプリケーション側このあたりを使用しているかどうか気にする必要がありますね。

さいごに

本日は Amazon Aurora MySQL でリードレプリカの書き込み転送機能がサポートされたので使ってみました。

はまりどころがありそうなので、もう少し検証が必要かな?という気もしますが、トランザクション周りとか。

アプリケーション側でライター・リーダーの切り替え対応するのは、常々つらい部分だなと思っていたので非常におもしろいアップデートではないでしょうか。