MySQL の準同期レプリケーション環境では、大規模トランザクションをコミットすると、Binlog 転送の長時間化が原因で準同期のタイムアウトが発生することがよくあります。これにより、準同期レプリケーションが非同期レプリケーションにダウングレードされ、データの信頼性が低下します。また、後続トランザクションがブロックされ、パフォーマンスの変動も発生します。この問題に対処するため、RDS for MySQL はリアルタイム Binlog 転送機能を提供します。この機能は、トランザクションの実行中に、大規模トランザクションの Binlog をレプリカインスタンスにストリーミングします。これにより、コミット時の同期時間をミリ秒単位にまで短縮し、高いデータの信頼性と安定したサービスパフォーマンスを確保します。
機能の概要
背景情報
MySQL のネイティブ実装では、プライマリインスタンスとレプリカインスタンス間で Binlog を転送するために単一のチャネルを使用します。大規模トランザクションの Binlog がこのチャネルを占有すると、後続のすべてのトランザクションの Binlog 転送がブロックされます。その結果、プライマリインスタンス上でコミット待ちのトランザクションが滞留し、インスタンスが一時的に書き込み不可になります。サービス停止の長期化を防ぐため、MySQL は rpl_semi_sync_master_timeout パラメーターを導入しています。レプリカインスタンスが指定時間内に Binlog の確認応答を返せない場合、準同期レプリケーションは非同期レプリケーションにダウングレードされます。したがって、大規模トランザクションは主に次の 2 つの問題を引き起こします。
パフォーマンスの変動:インスタンスが数秒間書き込み不可になり、多数のコミット要求がスロー SQL クエリとして記録されます。
信頼性の低下:レプリケーションモードがダウングレードされ、極端な場合はデータ損失につながる可能性があります。

リアルタイムBinlog転送
従来のモデルでは、トランザクションの実行中、プライマリインスタンス上の Binlog キャッシュにトランザクションの Binlog がバッファリングされます。トランザクションがコミットされた後にのみ、Binlog ファイルに書き込まれ、レプリカインスタンスに送信されます。RDS for MySQL のリアルタイム Binlog 転送機能は、このプロセスを最適化します。定義されたしきい値を超える大規模トランザクションが発生した場合、この機能は生成された Binlog イベントを Binlog キャッシュからレプリカインスタンスに継続的にストリーミングします。イベントは専用の リレーログキャッシュ に一時的に格納されます。プライマリインスタンスでトランザクションがコミットされると、最終的なコミットコマンドのみが送信されます。レプリカインスタンスは、キャッシュされたデータを直ちにリレーログファイルに書き込み、確認応答を返すことができます。このストリーミング設計により、コミット時の Binlog 転送時間を秒単位からミリ秒単位に短縮し、転送のボトルネックを実質的に解消します。

技術原理:リレーログキャッシュの設計
ストリーミングされた Binlog イベントをレプリカインスタンス上に一時保存するために、RDS for MySQL は大規模トランザクションごとに専用のリレーログキャッシュを作成します。データを書き込む前に、後からリレーログイベントのヘッダーを格納できるよう、キャッシュの先頭に領域を予約します。これにより、キャッシュからリレーログファイルへの迅速な変換が可能になります。予約領域が不足または過剰となるケースについても、元のロジックにフォールバックするか、空イベントでパディングすることで適切に処理し、メカニズムの堅牢性を確保します。
適用性
この機能を使用するには、次のいずれかのデータベースバージョンが必要です。
MySQL 8.4
MySQL 8.0 (マイナーエンジンバージョン 20250531 以降)
手順
プライマリインスタンスとレプリカインスタンスの両方で、次のグローバルパラメーターを設定 してこの機能を有効にします。 パラメーターの変更は、インスタンスの再起動なしで直ちに有効になります。
機能を有効にするには:
プライマリインスタンス:
loose_binlog_realtime_transmit_source_enabled=ONレプリカインスタンス:
loose_binlog_realtime_transmit_replica_enabled=ON
コアパラメーター:
loose_binlog_realtime_transmit_long_transaction_limit_size目的: リアルタイム転送をトリガーするトランザクションのサイズしきい値を指定します。トランザクションで生成される Binlog がこのサイズを超えると、機能が自動的に有効になります。
デフォルト値: 128 MB。
メリット
準同期レプリケーションを構成したインスタンスで 2 GB の大規模トランザクションを実行し、高負荷シナリオをシミュレーションしました。テスト結果を次の図に示します。
最適化前 (MySQL のネイティブ実装): 大規模トランザクションをコミットした後、インスタンスの秒間クエリ数 (QPS) が 0 まで低下し、深刻なパフォーマンスの変動が発生していることが分かります。その後、準同期のタイムアウトによりシステムは非同期モードにダウングレードされます。パフォーマンスは回復しますが、データの信頼性は損なわれます。
最適化後 (RDS for MySQL): リアルタイム Binlog 転送を有効にすると、大規模トランザクションのコミット中であってもインスタンスの QPS は安定して維持されます。これにより、パフォーマンスの変動とレプリケーションモードのダウングレードを効果的に防止できます。
