プレスリリースやお知らせ、開発ブログ、会社の活動状況、Mattermost・aws・AI等の技術情報などを発信しています。

Amazon RDSのMySQLでActive-Activeクラスターができるようになったので試してみた

ディーメイクAdvent Calendar 2023 12/05の記事です。

こんにちは mori です。

先日(2023.11.17)のAWSのアップデートで「Amazon RDS for MySQL でアクティブ/アクティブレプリケーション用の Group Replication プラグインのサポートを開始」というのがありました。

RDSでActive-Activeクラスターを組めるということで、どんなもなのか気になりましたので試してみたいと思います。

クラスタなだけあり、注意点や考慮事項など結構あるようです。
詳細については、公式のドキュメント参照下さい。(Configuring active-active clusters for RDS for MySQL

既存のRDSへの設定方法もドキュメントには記載されていましたが、今回は新規RDSの手順を参考に実施していきます。
手順の流れは以下のようになるそうです。

  • ステップ1:パラメータグループの作成
  • ステップ2:新しいRDSインスタンスを作成
  • ステップ3:アクティブ/アクティブ クラスターを組むDBインスタンスを設定
  • ステップ4:1台目のDBインスタンスで初期化・レプリケーションを開始
  • ステップ5:2台目のDBインスタンスで初期化・レプリケーションを開始
  • ステップ6:クラスターのステータスの確認
  • ステップ7:データのインポート(今回は動作確認)

ステップ1:パラメータグループの作成

AWS CLIを利用して、パラメータグループを作成します。
パラメータグループ名は「myactivepg」です。

aws rds create-db-parameter-group \
  --db-parameter-group-name myactivepg \
  --db-parameter-group-family mysql8.0 \
  --description "Parameter group for active-active clusters"

作成したパラメータグループのパラメータ値を変更します。
具体的なパラメータ値に関する説明は公式ドキュメントを参照ください。
'group_replication_group_name'のパラメータ値は、同期する各RDSでそろえる必要があるとのことです。

aws rds modify-db-parameter-group \
  --db-parameter-group-name myactivepg \
  --parameters "ParameterName='rds.group_replication_enabled',ParameterValue='1',ApplyMethod=pending-reboot" \
               "ParameterName='rds.custom_dns_resolution',ParameterValue='1',ApplyMethod=pending-reboot" \
               "ParameterName='enforce_gtid_consistency',ParameterValue='ON',ApplyMethod=pending-reboot" \
               "ParameterName='gtid-mode',ParameterValue='ON',ApplyMethod=pending-reboot" \
               "ParameterName='binlog_format',ParameterValue='ROW',ApplyMethod=immediate" \
               "ParameterName='slave_preserve_commit_order',ParameterValue='ON',ApplyMethod=immediate" \
               "ParameterName='group_replication_group_name',ParameterValue='11111111-2222-3333-4444-555555555555',ApplyMethod=pending-reboot"

ステップ2:新しいRDSインスタンスを作成

Active-Activeクラスターを組むRDSインスタンスを作成します。なお、最大で9台のRDSでActive-Active構成が組めるそうです。

今回は2台のRDSインスタンスを構築しました。
RDSの構築手順は省略しますが、パラメータグループにステップ1で作成したパラメータグループを指定します。
また、データベースのバージョンは「8.0.35」以降を選択します。

ステップ3:アクティブ/アクティブ クラスターを組むDBインスタンスを設定

DB パラメーターグループの「group_replication_group_seeds」に、クラスターに含める DB インスタンスのエンドポイントにパラメーターを設定します。

今回は「database-1」と「database-2」の2つのRDSインスタンスのエンドポイントを指定します。
2台以上でクラスタを組みたい場合は、エンドポイントを増やしていく感じです。

aws rds modify-db-parameter-group \
  --db-parameter-group-name myactivepg \
  --parameters "ParameterName='group_replication_group_seeds',ParameterValue='database-1.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306,database-2.xxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306',ApplyMethod=immediate"

ステップ4:1台目のDBインスタンスで初期化・レプリケーションを開始

ここからはそれぞれのDBインスタンスに接続しての作業となります。
MYSQLクライアントで接続してから実行ください。
RDSへ接続後に以下のストアド プロシージャを実行することでグループを初期化してレプリケーションプロセスを開始します。

call mysql.rds_set_configuration('binlog retention hours', 168); -- 7 days binlog
call mysql.rds_group_replication_create_user('group_replication_user_password');
call mysql.rds_group_replication_set_recovery_channel('group_replication_user_password');
call mysql.rds_group_replication_start(1);

※レプリケーションユーザは「rdsgrprepladmin」が予約されているとのことです。
 「rdsgrprepladmin」のパスワード(group_replication_user_password)は適宜変更ください。

ステップ5:2台目のDBインスタンスで初期化・レプリケーションを開始

ステップ4と同様のコマンドを2台目のDBインスタンスで実行します。
rdsgrprepladmin」のパスワード(group_replication_user_password)は同じにする必要があります。

call mysql.rds_set_configuration('binlog retention hours', 168); -- 7 days binlog
call mysql.rds_group_replication_create_user('group_replication_user_password');
call mysql.rds_group_replication_set_recovery_channel('group_replication_user_password');
call mysql.rds_group_replication_start(0);

ここまでの手順でアクティブ/アクティブ クラスターの設定が完了しました。

ステップ6:クラスターのステータスの確認

実際に同期されているかステータスを確認していきます。

どちらかのDBにMYSQLクライアントで接続し、以下のコマンドを実行します。
それぞれの「MEMBER_STATE」が「ONLINE」になっていれば、Active-Activeクラスターとして動作しています。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 7738c83d-8f91-11ee-b01d-0a2c8b45aec3 | ip-172-23-2-11  |        3306 | ONLINE       | PRIMARY     | 8.0.35         | MySQL                      |
| group_replication_applier | 9e57d311-8f91-11ee-a2ae-067fb12737ff | ip-172-23-1-233 |        3306 | ONLINE       | PRIMARY     | 8.0.35         | MySQL                      |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+-------------+----------------+----------------------------+
2 rows in set (0.00 sec)

mysql> 

ステップ7:データのインポート(今回は動作確認)

Active-Activeクラスターの設定が完了しましたので、動作確認をしていきたいと思います。

構築したデータベースに接続して、テーブルを作成してみました。確認した内容は以下になります。
1「database-2」 テーブルが存在しないことを確認
2「database-1」 testtable を作成
3「database-2」 testtable テーブルが作成されていることを確認
4「database-2」 testtable2 を作成
5「database-1」 testtable2 テーブルが作成されていることを確認

mysql> 
mysql> show tables;
Empty set (0.00 sec)

mysql> 
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| testtable      |
+----------------+
1 row in set (0.01 sec)

mysql> create table testtable2 (id int, name varchar(10));
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> create table testtable (id int, name varchar(10));
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| testtable      |
| testtable2     |
+----------------+
2 rows in set (0.00 sec)

mysql> 

無事に2台間で、同期ができており、クラスターが組めました。

所感

Amazon RDSでコミュニティサポートのプラグインで、利用可能なものもあるということに驚きました。
MySQL Group Replication プラグインというのも知らなかったので勉強になりました。

実際に手順を実施してみましたが、想像していたよりも少ないステップで設定することができました。(簡単でした)
クラウド上で自分たちでActive-Activeのクラスターを組めような仕組みは、ほとんどないかと思います。

また、VPCピアリングやトランジットゲートウェイを利用すれば、クロスVPC間においてもActive-Activeのクラスターを組めるそうです。
BPCなどの災害対策や、ソリューションごとにVPCを分けてRDSを立てたりなどしてDBが乱立してしまう場合などにうまく活用できるかもしれませんね。

  • B!

おすすめ記事リンク