大規模なトランザクションがコミットされる際、ApsaraDB RDS for MySQL は、セッションキャッシュからバイナリログファイルにバイナリログイベントをフラッシュする間、書き込みロックを保持します。バイナリログキャッシュが数十 GB にまで増大すると、このロックがすべての書き込みリクエストをブロックし、I/O リソースを枯渇させ、インスタンスが応答しなくなる可能性があります。
binlog キャッシュフリーフラッシュ機能は、コミット時に各イベントをロック下で読み込んで再書き込みする代わりに、バイナリログキャッシュ内の一時ファイルを直接バイナリログファイルに変換することで、このボトルネックを解消します。これにより、大規模トランザクションのコミット時間を短縮し、I/O 消費を削減して、インスタンスの応答性を維持します。
前提条件
開始する前に、以下を確認してください:
-
RDS インスタンスで MySQL 8.0 または MySQL 5.7 が実行されていること
-
マイナーエンジンバージョンが 20240731 以降であること
マイナーエンジンバージョンを確認するには、ApsaraDB RDS コンソールにログインし、[基本情報] ページに移動します。[設定情報] セクションで、[カーネルバージョンのアップグレード] ボタンが表示されているかどうかを確認します。ボタンが表示されている場合は、それをクリックしてマイナーエンジンバージョンを表示し、更新します。ボタンが表示されていない場合、インスタンスはすでに最新のマイナーエンジンバージョンになっています。詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
機能の有効化と設定
機能の有効化
次のコマンドを実行して binlog キャッシュフリーフラッシュを有効にします:
SET GLOBAL loose_binlog_cache_free_flush = on;
この変更はすぐに有効になります。インスタンスを再起動する必要はありません。
有効化の確認
SHOW GLOBAL VARIABLES LIKE 'loose_binlog_cache_free_flush';
しきい値の調整
loose_binlog_cache_free_flush_limit_size パラメーターは、変換をトリガーする最小のバイナリログデータサイズを設定します。デフォルトは 256 MB です。つまり、バイナリログデータが 256 MB を超えるトランザクションのみがフリーフラッシュパスを使用します。
より小さなトランザクションに最適化を適用するには、しきい値を下げます:
SET GLOBAL loose_binlog_cache_free_flush_limit_size = <size-in-bytes>;
機能の無効化
SET GLOBAL loose_binlog_cache_free_flush = off;
パラメーター
| パラメーター | デフォルト | 説明 |
|---|---|---|
loose_binlog_cache_free_flush |
off |
機能を有効または無効にします。グローバルシステム変数です。インスタンスを再起動することなく、すぐに有効になります。有効値:on 、 off。 |
loose_binlog_cache_free_flush_limit_size |
268435456 (256 MB) |
変換をトリガーするしきい値。トランザクションのバイナリログデータがこの値を超えると、コミット時にバイナリログキャッシュ内の一時ファイルがバイナリログファイルに変換されます。値の範囲:20971520–18446744073709551615 バイト。 |
仕組み
バイナリログキャッシュ
各セッションは、それぞれ独自のバイナリログキャッシュを持ちます。このキャッシュは、binlog_cache_size でサイズが制限されるメモリ内スペースと、ディスク上の一時ファイルを組み合わせたものです。トランザクションのイベントがこのメモリ内スペースの上限を超えると、一時ファイルに書き出されます。
コミット時、エンジンはキャッシュからすべてのイベントを読み取り、終了位置とチェックサムを更新し、書き込みロック下でバイナリログファイルに書き込みます。このロックはイベントが中断されずに書き込まれることを保証しますが、フラッシュの期間中、他のトランザクションがブロックされます。
大規模トランザクションのバイナリログ書き込みの影響
トランザクションのバイナリログキャッシュが数十 GB に達した場合、コミット時にこれをフラッシュすると、2つの問題が発生します:
-
書き込みリクエストのブロック:フラッシュの期間中、書き込みロックが保持されるため、他のトランザクションの書き込みが妨げられます。
-
I/O 枯渇:大規模なシーケンシャル書き込みが I/O リソースを消費し、インスタンスが応答しなくなる可能性があります。
binlog キャッシュフリーフラッシュによる解決策
AliSQL は、キャッシュ内の一時ファイルを直接バイナリログファイルに変換できるように、バイナリログキャッシュのメカニズムを最適化します。これは、次の2つの変更によって可能になります:
-
予約済みヘッダースペース:イベントが一時ファイルに書き込まれる際、先頭にバイナリログファイルのヘッダー用のスペースが予約されます。一時ファイルがバイナリログファイルに変換されると、その予約済みスペースが必要なヘッダーで埋められます。別途書き込みを行う必要はありません。
-
事前計算された終了位置:各イベントは予約済みスペースのサイズに基づいて自身の終了位置を計算するため、変換後にはすでに位置が正しい値になっています。
変換されたバイナリログファイルの内容
大規模なトランザクションがコミットされると、変換前に一時ファイルの先頭にある予約済みスペースが次のデータで埋められます:
| データ | 説明 |
|---|---|
| ファイルヘッダー | [0xFE 'bin']ファイルをバイナリログファイルとして識別する 4 バイトのマジックナンバー |
| ヘッダーイベント | フォーマット記述イベントと直前のグローバルトランザクション ID (GTID) イベント |
| 空のイベント | 残りの予約済みスペースを埋める、無視できるタイプのイベント |
| GTID イベント | コミット時に生成される、コミット中トランザクションの GTID |
ファイルの残りの部分には、クエリイベント、テーブルマップイベント、行ベースのイベント、XID イベントなど、トランザクションの元のイベントが保持されます。
通常のバイナリログファイルとの違い
変換されたバイナリログファイルは、通常のバイナリログファイルと2つの点で異なります:
-
残りの予約済みスペースを占有する空のイベント (無視可能なタイプ) が含まれます。
-
デフォルトでチェックサムが無効になっています。
binlog キャッシュフリーフラッシュ機能は、バイナリログファイルのフォーマットを変更するものではありません。レプリケーションおよびサードパーティ製のツールは影響を受けません。
最適化の効果
この図は、パフォーマンスレベル 1 (PL1) の Enterprise SSDs (ESSDs) と Premium Local SSDs を使用するインスタンスで、機能を有効にした場合と無効にした場合の大規模トランザクションのコミット時間を比較したものです。binlog キャッシュフリーフラッシュを有効にすると、コミット時間を短縮し、I/O リソースの枯渇と長時間の書き込みロックの両方を解決します。