アプリケーションが大規模なトランザクションを実行している場合、トランザクションコミットメント中にバイナリログを処理するのに必要な時間が長すぎて、ApsaraDB RDS for MySQLインスタンスが応答を停止するか、書き込みリクエストの処理に長期間失敗します。 問題を解決するために、ApsaraDB RDS for MySQLはbinlogキャッシュフリーフラッシュ機能を提供しています。 この機能により、大規模なトランザクションのコミットメントが最適化され、RDSインスタンスの安定性が向上します。
前提条件
RDSインスタンスはMySQL 8.0を実行します。
RDSインスタンスは、20230930以降のマイナーエンジンバージョンを実行します。
説明RDSインスタンスのマイナーエンジンバージョンを表示するには、ApsaraDB RDSコンソールにログインし、[基本情報] ページに移動します。 [構成情報] セクションで、[カーネルバージョンのアップグレード] ボタンが表示されているかどうかを確認します。 ボタンが表示されている場合は、ボタンをクリックして、RDSインスタンスのマイナーエンジンバージョンを表示および更新できます。 ボタンが表示されない場合、RDSインスタンスは最新のマイナーエンジンバージョンを実行します。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
実装
バイナリログキャッシュ
バイナリログキャッシュは、一時ファイルによって占有されるセッションレベルのディスク領域です。 バイナリログキャッシュは、バイナリログイベントを一時的に格納するためにセッションごとに割り当てられます。 バイナリログキャッシュのサイズは、メモリキャッシュサイズと一時ファイルのサイズの合計です。 メモリキャッシュサイズは、binlog_cache_sizeパラメーターで指定します。 トランザクションが大きく、メモリキャッシュが満杯である場合、トランザクションのイベントは一時ファイルに記録される。
トランザクションの実行中、生成されたイベントは一時的にバイナリログキャッシュに保存されます。 トランザクションがコミットされている場合、システムは生成されたイベントをバイナリログキャッシュから次々に読み取り、終了位置とチェックサムを更新してから、イベントをバイナリログファイルに書き込みます。 プロセス全体では、トランザクションに対して生成されたイベントが中断なしにバイナリログに書き込まれるようにするためのロックが必要です。 その結果、あるトランザクションのイベントがバイナリログファイルに書き込まれると、他のトランザクションはブロックされます。
大きなトランザクションからのバイナリログ書き込みによる影響
トランザクションが過度に大きく、数十GBのバイナリログキャッシュを占有する場合、トランザクションのコミット中にトランザクションのイベントをバイナリログファイルに書き込むのに必要な時間が長くなります。 これにより、次の影響が生じます。
大きなトランザクションのイベントをバイナリログファイルに書き込むには、書き込みロックが必要です。 その結果、RDSインスタンスは書き込みプロセス中に書き込みリクエストを処理できません。
大きなトランザクションのイベントをバイナリログファイルに書き込むと、大量のI/Oリソースが消費されます。 I/Oリソースが不十分な場合、RDSインスタンスは応答を停止する可能性があります。
binlogキャッシュフリーフラッシュ機能の最適化
AliSQLは、binlogキャッシュフリーフラッシュ機能を最適化します。 最適化後、バイナリログキャッシュに格納されている一時ファイルをバイナリログファイルに変換できます。 binlogキャッシュフリーフラッシュ機能を有効にすると、大規模トランザクションのコミット中に、バイナリログキャッシュ内の一時ファイルがバイナリログファイルに変換されます。 これにより、効率が向上し、I/Oリソースの消費が削減され、RDSインスタンス上の大規模なトランザクションからのバイナリログ書き込みによる影響が軽減されます。
バイナリログキャッシュメカニズムの最適化
バイナリログキャッシュ内の一時ファイルをバイナリログファイルに変換するために、AliSQLは以下の観点からバイナリログキャッシュ機構を最適化します。
システムがバイナリログキャッシュに一時ファイルを書き込むとき、ファイルヘッダー用にスペースが確保されます。 一時ファイルがバイナリログファイルに変換されると、予約されたスペースはバイナリログファイルにイベントヘッダーを格納するために使用されます。
システムがデータをバイナリログキャッシュに書き込むとき、各イベントは予約されたスペースのサイズに基づいてその終了位置を計算します。
一時ファイルのバイナリログファイルへの変換
大規模なトランザクションがコミットされた場合、システムはバイナリログキャッシュ内の一時ファイルをバイナリログファイルに変換します。 変換中、バイナリログファイルのヘッダーイベントとヘッダーイベントはすべての予約済みスペースを占有します。 予約スペースには、次の種類のデータが格納されます。
ファイルヘッダー: 4バイトのヘッダー
[ 0xFE 'bin']
は、ファイルをバイナリログファイルとして識別するために使用されます。 各バイナリログファイルには、このヘッダーが含まれます。ヘッダイベント: フォーマット記述イベントおよび前のグローバルトランザクション識別子 (GTID) イベントが含まれる。
空のイベント: 現在のバイナリログファイルの無視可能なイベントタイプの空のイベントは、残りの予約スペースを占有するために使用されます。
GTIDイベント: トランザクションのGTIDは、トランザクションコミット中に生成されます。 GTIDイベントも予約されたスペースに書き込まれます。
確保された領域が割り当てられたバイナリログキャッシュ内のイベントは、バイナリログキャッシュ内の一時ファイルから変換されたバイナリログファイルに格納されます。 イベントには、クエリイベント、テーブルマップイベント、行ベースのイベント、およびXIDイベントが含まれます。
binlogキャッシュフリーフラッシュ機能を使用して変換されるバイナリログファイルと通常のバイナリログファイルの違いを次に示します。
変換されたバイナリログファイルに空のイベントがあります。
変換されたバイナリログファイルのチェックサムは、デフォルトで無効になっています。
binlogキャッシュフリーフラッシュ機能では、バイナリログファイルの形式は変更されません。 バイナリログファイルとサードパーティツールを使用したレプリケーションは影響を受けません。
パラメーターの説明
loose_binlog_cache_free_flush:
binlogキャッシュフリーフラッシュ機能を有効にするかどうかを指定します。 グローバルシステム変数。 このパラメーターの値を変更すると、変更はすぐに有効になります。 RDSインスタンスを再起動する必要はありません。
有効な値: onとoff。
loose_binlog_cache_free_flush_limit_size:
一時ファイルをバイナリログファイルに変換するかどうかを指定します。 binlogキャッシュフリーフラッシュ機能を有効にした後、トランザクションのバイナリログファイルの数がこのパラメーターの値を超えると、バイナリログキャッシュに格納されている一時ファイルがトランザクションコミット中にバイナリログファイルに変換されます。
デフォルト値: 256 MB。
値の範囲: 20971520〜18446744073709551615。 単位:バイト
最適化効果
上の図は、パフォーマンスレベル1 (PL1) の拡張SSD (ESSD) を使用するRDSインスタンスと、binlogキャッシュフリーフラッシュ機能が有効または無効の場合のローカルSSDに大規模なトランザクションをコミットするのに必要な時間の違いを示しています。
binlogキャッシュフリーフラッシュ機能を有効にすると、大規模なトランザクションのコミットに必要な時間が短縮され、I/Oリソース不足やロック期間の長さなどの問題が解決されます。