高同時実行数のオンライントランザクション処理 (OLTP) ワークロードにおいて、MySQL のアクティブなトランザクションリストはボトルネックとなります。すべてのトランザクション開始、コミット、および可視性チェックの際に trx sys mutex を取得する必要があり、これによりスループットが制限され、複数の vCPU を十分に活用できなくなります。PolarDB for MySQL では、この課題を PolarTrans で解決します。PolarTrans は、アクティブなトランザクションリストを、コミットタイムスタンプに基づいてトランザクション状態を追跡するメモリ内ロックフリー機構である コミットタイムスタンプストア (CTS) に置き換えます。
本トピックでは、CTS の動作原理、トランザクションライフサイクル各段階における改善点、および PolarTrans 有効化後のパフォーマンス変化について説明します。
サポートされるバージョン
グローバル整合性 (高性能モード) 機能を通じて PolarTrans を有効化するには、PolarDB for MySQL Enterprise Edition クラスターが以下のいずれかのバージョン要件を満たす必要があります。
エンジンバージョン 8.0.2 で、リビジョンバージョンが 8.0.2.2.19 以降
エンジンバージョン 8.0.1 で、リビジョンバージョンが 8.0.1.1.29 以降
エンジンバージョン 5.7 で、リビジョンバージョンが 5.7.1.0.26 以降
クラスターのバージョンを確認するには、エンジンバージョンの「エンジンバージョンの確認」セクションをご参照ください。
アクティブなトランザクションリストがパフォーマンスを制限する理由
MySQL や PostgreSQL などの主要なリレーショナルデータベースでは、マルチバージョン同時実行制御 (MVCC) を実現するためにアクティブなトランザクションリストが採用されています。高同時実行環境では、この方式には以下の 3 つの課題があります。
複数の vCPU を活用して同時実行トランザクションを処理できない
多数のトランザクションが
trx sys mutexを競合する際にパフォーマンスボトルネックが発生する非共有アーキテクチャにおいて、読み取り整合性、マルチポイント書き込み、および拡張アーキテクチャ (XA) トランザクション管理を十分にサポートできない
PolarTrans は、アクティブなトランザクションリストを CTS に置き換えることで、これらの制限に対処します。トランザクションの状態をコピーする代わりに、PolarTrans はクラスターの最大コミットタイムスタンプに基づいてトランザクションの可視性を決定します。CTS ログはすべてメモリ内で維持されます。各トランザクションは、その trx_id に基づいて リングバッファ 内の特定の スロット に剰余マッピングされ、各スロットには trx ポインターとコミットシーケンス番号 (CSN) が格納されます。
CTS によるトランザクション各段階の改善
アクティブなトランザクションリストでは、トランザクションライフサイクルの 3 つの重要なタイミングで trx sys mutex の取得が必要です。CTS では、これら 3 段階すべてにおいてこの要件が不要になります。
| 段階 | 従来の方式 | PolarTrans (CTS) |
|---|---|---|
| トランザクション開始 | rw_trx_ids へのトランザクション ID の割り当て、rw_trx_set および rw_trx_list の更新 — すべて trx sys mutex | CTS ログへのトランザクション情報の記録、trx_id を基にした slot のモジュロ割り当て、およびアクティブタグによるマーク — ロックフリー |
| トランザクションコミット | rw_trx_ids の照会、トランザクション ID の削除、rw_trx_set および rw_trx_list の更新 — trx sys mutex | コミットタイムスタンプの割り当ておよび CTS ログ内の CSN フィールドの更新のみ |
| 可視性判定 | アクティブなトランザクション ID 配列のコピー、最小・最大トランザクション ID の記録、配列照会による行の可視性判定 — trx sys mutex | 読み取り専用トランザクションの CSN を、行レコード内の trx csn フィールドと比較し、システムの最大コミットタイムスタンプを読み取りビューの代わりに使用 |
PolarTrans では、ほとんどのトランザクションロジックにロックフリーのアルゴリズムを適用することで、読み書き混在および書き込み専用の両シナリオにおけるスループットを向上させます。
パフォーマンス比較
以下のテストでは、PolarTrans 有効化前後における秒間クエリ数 (QPS) を測定しています。
テスト環境:
| パラメーター | 値 |
|---|---|
| クラスター | PolarDB for MySQL 8.0、Cluster Edition |
| 仕様 | 88 コア、710 GB メモリ |
| テストツール | Sysbench |
| データ量 | 88 テーブル、テーブルあたり 1,200 万行 |
テストケース:
結果: PolarTrans は、読み書き混在および書き込み専用のシナリオにおいて QPS を大幅に向上させます。
読み取り専用のシナリオでは、PolarTrans によるパフォーマンス向上は見られません。読み取り専用トランザクションは既に読み取りビューのキャッシュから恩恵を受けており、トランザクション状態のコピーに伴うロックオーバーヘッドが低減されています。
PolarTrans の有効化
PolarTrans は、グローバル整合性 (高性能モード) 機能を有効化するとデフォルトで有効になります。設定手順については、「概要」トピックの「グローバル整合性 (高性能モード) の有効化」セクションをご参照ください。