大規模なテーブルに対する ALTER TABLE のような長時間実行 DDL ステートメントは、プライマリが終了してコミットするのを待つ間、セカンダリデータベースを数百秒間停止させることがあります。バイナリログリアルタイムレプリケーション (BRR) は、コミットシグナルを待つのではなく、プライマリがセカンダリに DDL ステートメントを並行して実行開始するように通知することで、この遅延を解消します。8,000 万行、23 GB のテーブルでのベンチマークテストでは、BRR を使用しない場合にセカンダリで 277 秒のレプリケーション遅延が発生しましたが、BRR を有効にした場合は遅延はゼロでした。
仕組み
MySQL は論理レプリケーションを使用します。プライマリデータベースでトランザクションがコミットされると、その結果の binlog イベントがセカンダリに送信されてリプレイされます。DDL ステートメントの場合、binlog ペイロードは (1 つの Gtid_log_event と 1 つの Query_log_event で) 小さいため、転送時間はごくわずかです。ボトルネックは DDL 実行時間そのものです。プライマリがコミットするまでセカンダリは開始できません。
BRR はこの問題を根本から解決します。プライマリが DDL ステートメントを開始すると、リアルタイム伝送を介して、Brr binlog イベント (この機能で導入された新しいイベントタイプ) を直ちにセカンダリに送信します。セカンダリは、標準の MySQL Worker スレッドとは独立した専用の Brr Worker スレッドを使用して、DDL を並列で実行し始めます。セカンダリが DDL 作業の大部分を完了すると、プライマリからの結果を待機します:
-
プライマリが成功した場合、セカンダリにコミットするよう通知します。
-
プライマリが失敗した場合、セカンダリにロールバックするよう通知します。
レプリケーション遅延の合計は、セカンダリデータベースへのネットワーク伝送 1 回分と DDL のコミット時間にまで削減されます。通常は数十ミリ秒です。
Brr binlog イベントは binlog またはリレーログに書き込まれないため、バイナリログを消費するダウンストリームシステムには影響しません。
前提条件
BRR を有効化する前に、次を確認してください:
-
インスタンスが RDS for MySQL 8.0 の 20250731 以降 のマイナーエンジンバージョンで実行されていること。必要に応じて、マイナーエンジンバージョンをアップグレードするか、データベースバージョンをアップグレードしてください。
-
インスタンスでリアルタイム伝送機能が有効になっていること。
サポートされる DDL ステートメント
BRR が対象とする DDL ステートメントは、マイナーエンジンバージョンによって異なります:
| マイナーエンジンバージョン | サポートされるステートメント |
|---|---|
| 20250731 以降 | ALTER TABLE |
| 20251031 以降 | ALTER TABLE および OPTIMIZE TABLE |
BRR の有効化
インスタンスパラメーターを設定して、プライマリデータベースとセカンダリデータベースの両方で次のパラメーターを設定してください。変更は即時に反映され、インスタンスの再起動は不要です。
プライマリデータベース
| パラメーター | 説明 | デフォルト |
|---|---|---|
loose_binlog_realtime_apply_ddl_source_enabled |
ONプライマリで BRR を有効化するには、 に設定します。 |
— |
loose_binlog_realtime_ddl_time_limit |
BRR は、実行時間がこのしきい値 (ミリ秒) を超える DDL ステートメントにのみ適用されます。N は 0 以上の整数です。 | 1000 |
セカンダリデータベース
| パラメーター | 説明 | デフォルト |
|---|---|---|
loose_binlog_realtime_apply_workers |
セカンダリ上の Brr Worker スレッド数です。1 以上の整数である必要があります。 | — |
ベンチマーク結果
次のテストでは、80,000,000 レコード (23 GB) を持つ単一のテーブルを使用し、ALTER TABLE sbtest1 ENGINE=InnoDB を実行して再構築しました。 プライマリは 16:21:35 に DDL を実行し、16:32:50 に再度実行しました。 テストインスタンスでは、マイナーエンジンバージョン 20251031 を使用しました。
| BRR 有効化 | セカンダリのレプリケーション遅延 |
|---|---|
| いいえ | 277 秒 |
| はい | 0 秒 |