PolarDB-X Standard Edition は、InnoDB トランザクションシステムを、System Commit Number (SCN) モデルに基づいて構築されたカスタムエンジンである Lizard に置き換えます。InnoDB は、すべてのリーダー間で共有されるアクティブなトランザクション ID 配列を使用して可視性を追跡しますが、Lizard は各トランザクションビジョンに単一の SCN を割り当てます。これにより、グローバル構造の競合が解消され、スナップショット伝播コストが削減され、過去のコミット済みバージョンに対する FlashBack クエリがネイティブにサポートされます。
使用制限
データベースエンジンは MySQL 8.0 と互換性がある必要があります。
仕組み
リレーショナルデータベースは、Multi-Version Concurrency Control (MVCC) を使用して、コミット済みバージョンに基づいてデータ可視性を判断します。Lizard は、次の2つのコア構成要素を通じて MVCC を実装します。
SCN (System Commit Number):コミット時に割り当てられ、トランザクションコミットの順序を定義する番号です。
トランザクションスロット:コミット済みトランザクションの SCN を保持する永続ストレージユニットです。変更された各行は、SCN を直接ではなく、そのトランザクションスロットの UBA を格納します。
書き込みトランザクション
トランザクションが開始されると、システムはトランザクションスロットを割り当て、そのアドレスを UBA として記録します。
変更された各行について、システムは行レコードに
(SCN=NULL, UBA)を書き込みます。コミット時に、システムは SCN を割り当て、それをトランザクションスロットに書き込み、トランザクションを完了としてマークし、コミット結果をクライアントに返します。
読み取りトランザクション
クエリが開始されると、システムは SCN ジェネレーターから現在の SCN を読み取ることでトランザクションビジョンを作成します。
検査された各行について、システムは UBA を介してトランザクションスロットを検索し、トランザクションのコミットステータスと SCN を取得します。
システムは行の SCN をビジョン SCN と比較して、行バージョンが可視であるかどうかを判断します。
SCN ベースのトランザクションパフォーマンス
InnoDB トランザクションシステムと比較して、Lizard SCN モデルには3つの利点があります。
| 利点 | 詳細 |
|---|---|
| グローバル構造の依存関係なし | 可視性チェックは共有アクティブトランザクション ID 配列にアクセスしないため、同時負荷下での読み取り/書き込み競合を大幅に削減します。 |
| コンパクトなトランザクションビジョン | トランザクションビジョンは、アクティブトランザクション ID 配列の代わりに単一の SCN を保持するため、スナップショット伝播をより安価にします。 |
| FlashBack クエリ | SCN モデルは、過去のコミット済みバージョンに対するカスタム FlashBack クエリをネイティブにサポートします。 |
トレードオフ:コミット時、トランザクションスロットのみが更新されます。各変更された行レコードの SCN は、クリーンアウトが発生するまで NULL のままです。したがって、すべての可視性チェックは、UBA をたどってトランザクションスロットにアクセスする必要があります。これは、行ごとの追加のルックアップとなります。
Lizard は、2つのクリーンアウトメカニズムでこのオーバーヘッドに対処します。
コミットクリーンアウト
書き込みトランザクション中、Lizard は変更された行のサブセットを追跡します。コミット後、コミットされた SCN をそれらの行にバックフィルします。コミットレイテンシを低く保つために、バックフィルされる行の数は、現在のレコード数とシステムの負荷容量に基づいて上限が設定されます。
遅延クリーンアウト
クエリが SCN がまだ NULL である行を読み取ると、Lizard は UBA を介してトランザクションスロットを参照することで SCN を解決します。トランザクションがすでにコミットされている場合、Lizard は副作用として SCN を行レコードに書き戻します。同じ行の後続の読み取りでは、UBA ルックアップを完全にスキップします。
トランザクションスロットの再利用
トランザクションスロットは無限に増大することはできません。Lizard はフリーリストを通じてそれらを再利用します。スロットはフリーリストに戻され、新しいトランザクションは最初にフリーリストから取得します。
空きスロットを見つけるために複数のデータページを走査するオーバーヘッドを回避するために、Lizard はトランザクションスロットページのキャッシュテーブルを維持します。スロット割り当ては、このキャッシュから直接読み取ることで、スロットの再利用の I/O コストを削減します。
パフォーマンス
クリーンアウトオーバーヘッドは、ホットスポットの競合中ではなく、読み取りクエリ中にのみ適用されます。以下のベンチマーク結果は、SCN トランザクションシステムと従来の InnoDB を比較したものです。
| システム | QPS | TPS | 95パーセンタイルレイテンシ (ms) |
|---|---|---|---|
| Lizard | 636,086.81 | 31,804.34 | 16.07 |
| MySQL 8.0.32 | 487,578.78 | 24,378.94 | 34.33 |
| MySQL 8.0.18 | 311,399.84 | 15,577.15 | 41.23 |
テスト環境:Intel 8269CY 104C、1600万行、512 の同時読み書きスレッド。
MySQL 8.0.32 と比較して、Lizard はスループットで 30% の改善、p95 レイテンシで 53% の削減をもたらします。