RDS for MariaDBの遅延レプリケーション機能を試してみた

2022.02.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

RDS for MariaDBで遅延レプリケーションが利用出来るようになりました。
従来はRDS for MySQLの特定バージョンから利用出来ていましたが、MariaDBでも利用出来るようになった形です。

以下、遅延レプリケーションの目的をMySQLリファレンスより引用させて頂きました。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 17.4.11 遅延レプリケーション

  • ソースでのユーザーミスから保護します。 遅延により、遅延レプリカを誤った直前の時点にロールバックできます。
  • 遅延があるときにシステムがどのように動作するかをテストするため。 たとえば、アプリケーションでは、レプリカの負荷が高いためにラグが発生する場合があります。 しかし、この負荷レベルを生成するのが難しい場合があります。 遅延レプリケーションは、負荷をシミュレートしなくても遅延をシミュレートできます。 また、遅延レプリカに関連する状態のデバッグにも使用できます。
  • バックアップを再ロードせずに、データベースが過去にどのように表示されていたかを検査します。 たとえば、1 週間の遅延でレプリカを構成することで、過去数日前にデータベースがどのように表示されたかを確認する必要がある場合は、遅延レプリカを検査できます。

設定方法

RDSを構成しますが、リードレプリカ作成のためにバックアップ保持期間を0日以外にする必要があります。
また、MySQLの場合はInnoDB以外のストレージエンジンだと利用出来ません。

以下のバージョン以降のエンジンで利用が可能です。

  • MariaDB10.6.5以降
  • MySQL8.0.26以降
  • MySQL5.6.40以降

mysql.rds_set_source_delayストアドプロシージャが利用出来るようになっています。

設定前

バージョンと自動バックアップの日数だけ気をつけて設定します。

コンソールからリードレプリカを作成してみました。

ライター側でテーブルとテストデータを作成し、リーダーでクエリしてみます。

Writer

mysql> use iwasadb
Database changed
mysql> create table hogetable (val1 int, val2 varchar(10));
insert into hogetable values (1, "hoge1");
insert into hogetable values (2, "hoge2");
insert into hogetable values (3, "hoge3");Query OK, 0 rows affected (0.04 sec)

mysql> insert into hogetable values (1, "hoge1");
Query OK, 1 row affected (0.03 sec)

mysql> insert into hogetable values (2, "hoge2");
Query OK, 1 row affected (0.03 sec)

mysql> insert into hogetable values (3, "hoge3");
Query OK, 1 row affected (0.03 sec)

mysql>

Reader

mysql> use iwasadb
Database changed
mysql> select * from hogetable;
+------+-------+
| val1 | val2  |
+------+-------+
|    1 | hoge1 |
|    2 | hoge2 |
|    3 | hoge3 |
+------+-------+
3 rows in set (0.02 sec)

mysql>

すぐ反映されていますね。

設定後

次に、リードレプリカ上で遅延レプリケーションの設定を行います。
なお、設定前にレプリケーションを停止する必要があります。

mysql> call mysql.rds_set_source_delay(300);
ERROR 1198 (HY000): This operation cannot be performed as you have a running slave ''; run STOP SLAVE '' first

mysql> call mysql.rds_stop_replication;
+---------------------------+
| Message                   |
+---------------------------+
| Slave is down or disabled |
+---------------------------+
1 row in set (1.11 sec)

Query OK, 8 rows affected (1.11 sec)

mysql> 
mysql> call mysql.rds_set_source_delay(10);
+-----------------------------------+
| Message                           |
+-----------------------------------+
| source delay is set successfully. |
+-----------------------------------+
1 row in set (0.05 sec)

Query OK, 5 rows affected (0.05 sec)

mysql> call mysql.rds_start_replication;
+-------------------------+
| Message                 |
+-------------------------+
| Slave running normally. |
+-------------------------+
1 row in set (1.18 sec)

Query OK, 8 rows affected (1.18 sec)

mysql>

ではライターでレコードを作成してみましょう。

mysql> select * from hogetable;
+------+-------+
| val1 | val2  |
+------+-------+
|    1 | hoge1 |
|    2 | hoge2 |
|    3 | hoge3 |
|    4 | hoge4 |
+------+-------+
4 rows in set (0.04 sec)

mysql> select * from hogetable;
+------+-------+
| val1 | val2  |
+------+-------+
|    1 | hoge1 |
|    2 | hoge2 |
|    3 | hoge3 |
|    4 | hoge4 |
|    5 | hoge5 |
+------+-------+
5 rows in set (0.04 sec)

反映されるまで10秒程度かかりました。
CloudWatchからレプリカラグも見てみます。

こちらでも遅延が確認出来ていますね。

さいごに

本日はRDS for MariaDBの遅延レプリケーション設定を行ってみました。
遅延レプリケーション設定を使ったことがなく、MySQLですでに利用出来ていたことも知りませんでした。

手動ミスでのリカバリにも使えるのかもしれませんが、冒頭に引用させて頂いたように遅延がある際のアプリケーションテストに利用出来るなどはかなり活用出来そうな気がしますね。