PolarDB for MySQLはPolarTransを使用して、同時実行性の高いオンライントランザクション処理 (OLTP) シナリオでデータベースのパフォーマンスを向上させます。 PolarTransは、アクティブなトランザクションリストに依存する代わりに、コミットタイムスタンプストア (CTS) を使用して、トランザクションをより効率的に管理します。 このトピックでは、PolarTransのCTSの技術原理と利点について説明します。 このトピックでは、標準シナリオでパフォーマンステストを使用して、PolarTransを使用する前後のデータベースのパフォーマンスも比較します。
前提条件
クラスターは、リビジョンバージョンが8.0.1.1.12以降のPolarDB for MySQL 8.0.1を実行します。
背景情報
MySQLやPostgreSQLなどのメインストリームのオープンソースリレーショナルデータベースは、トランザクションステータスを更新し、アクティブなトランザクションリストに基づいてマルチバージョン同時実行制御 (MVCC) メカニズムを実装します。 アクティブトランザクションリストベースのアプローチでは、同時実行性の高い環境でパフォーマンスのボトルネックが発生する可能性があり、複数のvCPUを完全に使用して同時トランザクションを処理することはできません。 また、この手法は、読み取り一貫性、マルチポイント書き込み、および非共有アーキテクチャ内の拡張アーキテクチャ (XA) トランザクション管理の要件を十分に満たしていない。
PolarTransは、この問題に対処するために開発されます。 PolarTransでは、アクティブなトランザクションリストに基づいてトランザクションステータスを更新する必要はありません。 PolarTransは、トランザクションステータスをコピーするのではなく、クラスターの最大コミットタイムスタンプに基づいてトランザクションステータスを決定します。 PolarTransは、トランザクションステータスの更新、取得、およびクエリ (可視性決定) のためのより軽量なソリューションを提供します。 PolarTransは、ロックフリーアルゴリズムを実装して、読み取り /書き込みシナリオおよび書き込み専用シナリオでデータベースのパフォーマンスを向上させることにより、ほとんどのトランザクションロジックも最適化します。
PolarTransは、CTSログを使用して、トランザクションステータスの更新、可視性の決定、トランザクションのアクティブステータスなど、トランザクションのコアデータを記録します。
CTSログは、効率と速度を確保するために完全にメモリに保持されます。 各トランザクションは、trx_id
によって指定されたトランザクションIDに基づいて、リングバッファ
内の特定のスロット
にモジュロマッピングされる。 各スロット
は、trx
ポインタおよびコミットシーケンス番号 (CSN) を含む。
メリット
トランザクションの開始
書き込みトランザクションが開始されると、従来のトランザクションシステムはトランザクションにIDを割り当て、アクティブトランザクションID配列
rw_trx_ids
にIDを追加し、アクティブトランザクションIDと対応するトランザクション間のマッピングを保持するrw_trx_set
データセットtrx
を更新し、トランザクションを読み書きトランザクションリンクリストrw_trx_list
にエンキューします。 このプロセス中にデータの一貫性と整合性を確保するには、trx sys mutex
を使用して操作を保護する必要があります。 対照的に、トランザクションが開始すると、PolarTransは、CTSログにトランザクションに関する情報を記録し、trx_id
によって指定されたトランザクションIDに基づいてトランザクションにスロット
をモジュロ割り当てし、トランザクション状態を特別なアクティブタグでマークする。 全プロセスはロックなしです。トランザクションコミットメントの書き込み
書き込みトランザクションをコミットするために、従来のシステムは
rw_trx_ids
を照会し、trx_id
で指定されたトランザクションIDを削除し、rw_trx_set
とrw_trx_list
を更新します。 プロセス中のデータの一貫性と整合性を確保するには、trx sys mutex
を使用して操作を保護する必要があります。 書き込みトランザクションをコミットするには、PolarTransはコミットタイムスタンプを割り当て、CTSログのCSNフィールドを更新するだけです。読み取りビュー
InnoDBのMVCCメカニズムは、
読み取りビュー
を使用してデータの表示を制御します。読み取りビュー
を作成するには、従来のトランザクションシステムでアクティブトランザクションID配列をコピーし、現在の最小アクティブトランザクションIDと最大トランザクションIDを記録する必要があります。 プロセス中のデータの一貫性と整合性を確保するには、trx sys mutex
を使用して操作を保護する必要があります。 システムは、データ可視性を判定するために、アクティブトランザクションIDアレイに問い合わせる必要があり得る。 重大な読み書き競合が発生するシナリオでは、システムはミューテックス
の保護下で読み書きトランザクションと読み取り専用トランザクションのステータスを更新およびコピーする必要があります。 これは、高いメンテナンスコストを発生させ、トランザクション可視性を決定する効率を低下させる。 PolarTransは、読み取りビュー
の代わりにシステムの最大コミットタイムスタンプを使用してデータの可視性を判断します。 この方法では、読み取り専用トランザクションのCSNと行レコードのtrx csn
フィールドの値のみを比較する必要があります。
PolarTransの有効化
デフォルトでは、グローバル整合性 (ハイパフォーマンスモード) 機能を有効にすると、PolarTransが有効になります。 グローバル整合性 (高パフォーマンスモード) 機能を有効にする方法の詳細については、「概要」トピックの「グローバル整合性 (高パフォーマンスモード) の有効化」セクションを参照してください。
性能比較
PolarTransを有効にする前と後のデータベースのパフォーマンスがテストされます。 パフォーマンスは、1秒あたりのクエリ数 (QPS) に基づいてテストされます。
テスト環境
テストでは、88コアと710 GBメモリを備えたcluster EditionのPolarDB for MySQL 8.0クラスターが使用されます。
テストツール
Sysbench
テスト済みデータ量
各テーブルに1200万行の88のテーブル。
テストケース
テストには、次のSysBench組み込みケースを使用します。
oltp_read_write
oltp_insert
oltp_update_index
oltp_update_no_index
oltp_read_only
テスト結果
テスト結果は、PolarTransが読み取り /書き込みおよび書き込み専用のシナリオでデータベースの全体的なパフォーマンスを大幅に向上させることを示しています。 ただし、読み取り専用のシナリオでは、PolarTransを有効にしてもデータベースのパフォーマンスは向上しません。これは、読み取り専用トランザクションが読み取りビューキャッシュを使用して、データベースがトランザクションステータスをコピーするときに発生するロックオーバーヘッドを減らすことができるためです。