ディーメイク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が乱立してしまう場合などにうまく活用できるかもしれませんね。