このトピックでは、ApsaraDB RDS for MySQLインスタンスでサポートされているX-Engineストレージエンジンについて説明します。 このエンジンはトランザクションを処理し、ディスク使用量を大幅に削減できます。
概要
X-Engineは、PolarDBのニーズに合わせてAlibaba Cloudのデータベース製品ビジネスユニットによって開発されたオンライントランザクション処理 (OLTP) データベース指向のストレージエンジンです。 このストレージエンジンは、コストを削減するためにAlibaba Groupのさまざまなビジネスシステムで広く使用されています。 これらのシステムは、トランザクション履歴データベースおよびDingTalkチャット履歴データベースを含む。 X-Engineは、Alibaba Groupが中国で開催されるDouble 11ショッピングフェスティバルで通常の数百倍のトラフィックに耐えることができる重要なデータベーステクノロジーでもあります。
X-Engineは、大規模な電子商取引のトランザクション処理に最適化されています。 X-Engine R&Dチームが執筆したX-Engine: A Optimized Storage Engine for Large-scale E-Commerce Transaction Processingという論文では、X-Engineがストレージエンジン分野で行った先駆的な成果について説明しています。 この論文は、2019のSIGMOD 2019のIndustrial Trackによって受け入れられました。
InnoDBストレージエンジンとは異なり、X-engineは階層ストレージにログ構造のマージツリー (LSMツリー) アーキテクチャを採用しています。 LSMツリーには次の重要な利点があります。
インデックスを必要とするホットスポットデータセットのサイズが小さいため、書き込みパフォーマンスが向上します。
最下層の永続データページは読み取り専用です。 さらに、それらはコンパクトな形式で保存され、ストレージコストを削減するためにデフォルトで圧縮されています。
LSMツリーの利点に加えて、X-Engineはエンジニアリング実装において以下の革新をもたらします。
継続的に最適化された書き込みパフォーマンス: 継続的な最適化により、X-Engineは、LSMツリーアーキテクチャで実行されるRocksDBの書き込みパフォーマンスよりも10倍以上高い書き込みパフォーマンスを実現できます。
ストレージ層でのデータの再利用: データの再利用は、コンパクション操作のパフォーマンスを最適化し、従来のLSMツリーアーキテクチャのシステムリソースに対するコンパクション操作の影響を軽減します。 これにより、システムパフォーマンスを安定させることができます。
ハイブリッドストレージ: SSDやHDDなど、さまざまなストレージメディアをデプロイできます。 これらのストレージメディアは、同じRDSインスタンスで異なるI/O機能を提供します。 ハイブリッドストレージアーキテクチャは、X-Engineの階層ストレージアーキテクチャと連携して、ホットデータとコールドデータを別々にインテリジェントに格納します。 これにより、パフォーマンスを損なうことなく全体のコストを削減できます。
マルチレベルのキャッシュ、リフィル、およびプリフェッチ: これらにより、X-Engineは、LSMツリーアーキテクチャを採用するエンジンの読み取りパフォーマンスの欠点を補うために、きめ細かいアクセスメカニズムとキャッシュテクノロジーを使用できます。
上記の最適化により、X-Engineは従来のInnoDBストレージエンジンの代わりになります。 トランザクションをサポートすることに加えて、X-Engineは占有ストレージスペースを最大90% 削減し、ストレージコストを削減することもできます。 X-Engineは、データ量が多く、高い読み書きパフォーマンスを必要とするビジネスに特に適しています。
X-Engineの使用シナリオの詳細については、「X-Engineのベストプラクティス」をご参照ください。
前提条件
RDSインスタンスは、RDS High-availability EditionまたはRDS Basic EditionでMySQL 8.0を実行します。
X-Engineを使用するRDSインスタンスの購入
RDSインスタンスにX-Engineを使用する場合は、RDSインスタンスを作成するときに、[基本設定] ステップでデータベースエンジン用のMySQL 8.0を選択し、[インスタンス設定] ステップで [デフォルトストレージエンジン用のX-Engine (高圧縮率)] を選択します。 その他のパラメーターの詳細については、「ApsaraDB RDS For MySQLインスタンスの作成」をご参照ください。
MySQL 5.5、MySQL 5.6、またはMySQL 5.7を実行するRDSインスタンスにX-Engineを使用する場合は、RDSインスタンスのデータをMySQL 8.0を実行する新しいRDSインスタンスに移行する必要があります。 詳細については、以下をご参照ください。 RDSインスタンス間でデータを移行します。
RDSインスタンスのストレージエンジンをX-engineに変換する場合は、「InnoDB、TokuDB、またはMyRocksからX-Engineにテーブルを変換する」の手順に従ってください。
X-Engineテーブルの作成
RDSインスタンスの作成時にX-Engineを選択した場合、RDSインスタンス内に作成されたテーブルはデフォルトでX-Engineを使用します。 次のステートメントを実行して、RDSインスタンスで使用されるデフォルトエンジンを表示します。
'% default_storage_engine %' のような変数を表示します。
既定のエンジンがX-engineの場合、テーブル作成ステートメントでストレージエンジンを指定する必要はありません。
テーブルを作成すると、データはX-Engineに保存されます。
X-engineを使用するRDSインスタンスでInnoDBエンジンを使用するテーブルを作成できます。 Data Transmission Service (DTS) を使用してInnoDBテーブルをX-Engineを搭載したRDSインスタンスに移行する場合、移行先テーブルはInnoDBを使用する可能性があります。 詳細については、「InnoDB、TokuDB、またはMyRocksからX-Engineへのテーブルの変換」の「ソリューション2」セクションをご参照ください。
制限事項
X-EngineとInnoDBを一緒に使用した場合のリソース割り当ての制限
RDSインスタンスにX-Engineを使用する場合、メモリの95% が書き込みキャッシュおよびブロックキャッシュとして使用され、読み取りと書き込みを高速化します。 InnoDBバッファプールは多くのメモリを占有しません。 InnoDBを使用するテーブルを使用して、X-Engineを使用するRDSインスタンス内に大量のデータを格納しないでください。 そうしないと、キャッシュヒット率が低いためにX-Engineのパフォーマンスが低下する可能性があります。 RDSインスタンスがMySQL 8.0を実行する場合、RDSインスタンス内のすべてのテーブルにX-EngineまたはInnoDBを使用することを推奨します。
エンジン機能の制限
X-Engineには機能にいくつかの制限があります。 いくつかの機能は開発中です。 次の表に記載されていないその他の機能は、InnoDBの機能と同じです。
カテゴリ
機能
Xエンジン
補足
SQLの特徴
外部キー
サポートされていません。
なし
一時テーブル
サポートされていません。
なし
パーティションテーブル
サポートされていません。 X-Engineは、パーティションの作成、追加、削除、変更、またはクエリをサポートしていません。
なし
生成された列
サポートされていません。
なし
ハンドラーAPI
サポートされていません。
なし
列のプロパティ
最大列サイズ
(LONGBLOB/LONGTEXT/JSON)
32 MB
なし
GISデータ型
サポートされていません。 X-Engineは、GEOMETRY、POINT、LINESTRING、POLYGON、MULTILINESTRING、MULTILINESTRING、MULTIPOLYGON、およびGEMOMETRYCOLLECTIONのGISデータ型をサポートしていません。
なし
インデックス
Hash index
サポートされていません。
なし
空間インデックス
サポートされていません。 X-Engineは、フルテキストインデックスの作成と使用をサポートしていません。
なし
トランザクション
トランザクション分離レベル
2つの分離レベルが提供されます。
コミット読み取り (RC)
繰り返し読み取り (RR)
なし
最大トランザクションサイズ
32 MB
大規模なトランザクションのサポートは開発中です。
Savepoint
サポートされていません。
なし
XAトランザクション
サポートされていません。
XAトランザクションのサポートは開発中です。
ロック
ロックの粒度
サポートされているテーブルレベルのロック。
行レベルのロックがサポートされています。
GAPロックはサポートされていません。
なし
スキップロック
ロックNowait
サポートされていません。
なし
文字セット
インデックスなしの列でサポートされる文字セット
サポートされています。
なし
インデックス付き列でサポートされる文字セット
Latin1 (latin1_bin)
GBK (gbk_chinese_ciおよびgbk_bin)
UTF-8 (utf8_general_ciおよびutf8_bin)
UTF-8MB4 (utf8mb4_0900_ai_ci、utf8mb4_general_ci、およびutf8mb4_bin)
なし
プライマリ /セカンダリレプリケーション
バイナリログ形式
stmt/row/mixed
説明デフォルトのバイナリログ形式はRAW形式です。 stmtおよび混合形式は、特定の同時実行シナリオでデータセキュリティ問題を引き起こす可能性があります。
なし
大規模な取引の制限
X-Engineは大規模なトランザクションをサポートしていません。 トランザクションが多数の行を変更した場合、X-Engineは中間コミット機能を使用します。 たとえば、トランザクションを使用して10,000を超える行を変更する場合、X-Engineはこのトランザクションをコミットし、新しいトランザクションを開始します。 ただし、コミット・イン・ミドル機能は、原子性、一貫性、分離、耐久性 (ACID) に厳密に従うことはできません。 中央でコミット機能を使用する場合は注意してください。 例:
トランザクションを開始して10,000行以上を挿入します。 挿入中に、コミットされたデータの一部は、他の要求によって照会され得る。
トランザクションを開始して10,000行以上を変更します。 データの一部がトランザクションの途中でコミットされた場合、トランザクションをロールバックすることはできません。
ドロップテーブルt1; 作成テーブルt1(c1 intプライマリキー、c2 int)ENGINE=xengine; 始める; call insert_data(12000); // T12,000行が挿入され、中間コミット操作がトリガーされます。 その結果、データの最初の10,000行がコミットされる。 ロールバック; // 最後の2,000行のみロールバックできます。 t1からcount(*) を選択します。// コミットされた10,000行のデータを照会できます。 + --------- | count(*) | + --------- | 10000 | + --------- 1行セット (0.00秒)
トランザクションを開始して、10,000を超える行を削除または変更します。 いくつかの行は省略される。
ドロップテーブルt1; 作成テーブルt1(c1 intプライマリキー、c2 int)ENGINE=xengine; insert_data(10000) を呼び出す。始める; t1の値に挿入する (10001,10001) 、(10002,10002) 。"delete from t1 where c1 >= 0;// 削除は中間コミット操作をトリガーし、現在のトランザクションによって挿入されたデータの行は削除されません。 コミット; t1から * を選択します。+ ------ ------- + | c1 | c2 | + ------ ------- + | 10001 | 10001 | | 10002 | 10002 | + ------ ------- + セットの2列 (0.00秒)
パラメーター
RDSインスタンスを作成するときに、デフォルトのストレージエンジンとしてX-Engineを選択できます。 次の表に示すパラメーターに基づいてパラメーターテンプレートを調整し、ビジネス要件を満たすこともできます。 詳細については、「ApsaraDB RDS For MySQLインスタンスの作成」をご参照ください。
カテゴリ | パラメーター | 説明 | 補足 |
パフォーマンス | xengine_arena_block_size | メモリテーブルがオペレーティングシステムおよびjemallocの外部メモリ管理システムに新しいメモリを要求するときに使用される単位。 | 起動後の読み取り専用。 |
xengine_batch_group_max_group_size | トランザクションパイプライン内のグループの最大数。 | 起動後の読み取り専用。 | |
xengine_batch_group_max_leader_wait_time_us | トランザクションパイプラインの最大待機時間。 | 起動後の読み取り専用。 | |
xengine_batch_group_slot_array_size | トランザクションパイプラインの最大バッチサイズ。 | 起動後の読み取り専用。 | |
メモリ | xengine_block_cache_size | 読み取りブロックキャッシュのサイズ。 | このパラメーターは変更できません。 |
xengine_row_cache_size | 行キャッシュのサイズ。 | このパラメーターは変更できません。 | |
xengine_write_buffer_size | メモリテーブルの最大サイズ。 | このパラメーターは変更できません。 | |
xengine_block_size | ディスク上のデータブロックのサイズ。 | 初期化後の読み取り専用。 起動後の読み取り専用。 | |
xengine_db_write_buffer_size | すべてのサブテーブルのアクティブなメモリテーブルの最大サイズ。 | このパラメーターは変更できません。 | |
xengine_db_total_write_buffer_size | すべてのサブテーブルのアクティブなメモリテーブルと不変のメモリテーブルの最大サイズ。 | このパラメーターは変更できません。 | |
xengine_scan_add_blocks_limit | 各範囲ベースのスキャン要求中にブロックキャッシュに追加できるブロックの数。 | このパラメーターは変更できません。 | |
コンパクション | xengine_flush_delete_percent_trigger | メモリテーブルのレコード数がこのパラメーターの値を超えると、xengine_flush_delete_record_triggerパラメーターが有効になります。 | このパラメーターは変更できません。 |
ロック | xengine_max_row_locks | 1つのSQLリクエストでロックできる行の最大数。 | このパラメーターは変更できません。 |
xengine_lock_wait_timeout | ロック待機のタイムアウト期間。 | このパラメーターは変更できません。 |
実行ステータス指標
次の表に、X-Engineのステータスメトリックを示します。
メトリックの名前 | 説明 |
xengine_rows_deleted | 削除された行の数。 |
xengine_rows_inserted | 挿入された行の数。 |
xengine_rows_read | 読み取り行の数。 |
xengine_rows_updated | 更新された行の数。 |
xengine_system_rows_deleted | X-Engineを使用するシステムテーブルに対する削除操作の回数。 |
xengine_system_rows_inserted | X-Engineを使用するシステムテーブルに対する挿入操作の数。 |
xengine_system_rows_read | X-Engineを使用するシステムテーブルに対する読み取り操作の数。 |
xengine_system_rows_updated | X-Engineを使用するシステムテーブルの更新回数。 |
xengine_block_cache_add | ブロックキャッシュに対する追加操作の数。 |
xengine_block_cache_data_hit | 読み取られたデータブロックのヒット数。 |
xengine_block_cache_data_miss | 読み取られたデータブロック内のミスの数。 |
xengine_block_cache_filter_hit | フィルターブロック内のヒット数。 |
xengine_block_cache_filter_miss | フィルタブロック内のミスの数。 |
xengine_block_cache_hit | ブロックキャッシュ内のヒット数。 このメトリックの値は、次の式を使用して計算されます。このメトリックの値=data_hitメトリックの値 + index_hitメトリックの値。 |
xengine_block_cache_index_hit | インデックスブロック内のヒット数。 |
xengine_block_cache_index_miss | インデックスブロック内のミスの数。 |
xengine_block_cache_miss | ブロックキャッシュ内のミスの数。 このメトリックの値は、以下の式を使用して計算される。このメトリックの値=data_missメトリックの値 + index_missメトリックの値。 |
xengine_block_cachecompressed_miss | 圧縮ブロックキャッシュ内のミスの数。 |
xengine_bytes_read | 物理ディスクから読み取られるバイト数。 |
xengine_bytes_written | 物理ディスクに書き込まれるバイト数。 |
xengine_memtable_hit | メモリテーブルのヒット数。 |
xengine_memtable_miss | メモリテーブルのミス数。 |
xengine_number_block_not_compressed | 非圧縮ブロックの数。 |
xengine_number_keys_read | キーが読み取られた回数。 |
xengine_number_keys_updated | キーが更新された回数。 |
xengine_number_keys_written | キーが書き込まれた回数。 |
xengine_number_superversion_acquires | スーパーバージョンが参照に適用される回数。 |
xengine_number_superversion_cleanups | スーパーバージョンがクリアされた回数。 Superversionが参照されていない場合は、クリアされます。 |
xengine_number_superversion_releases | 参照されるSuperversionがリリースされた回数。 Superversionが参照されていない場合は、クリアされます。 |
xengine_snapshot_conflict_errors | RR分離レベルでのスナップショットバージョンの競合によりエラーが返された回数。 |
xengine_wal_bytes | ディスクに書き込まれるredoログのサイズ。 単位:バイト |
xengine_wal_group_syncs | redoログによってGroupCommitが実行された回数。 |
xengine_wal_synced | redoログが同期される回数。 |
xengine_write_other | フォロワーがトランザクションパイプラインでトランザクションをコミットする回数。 |
xengine_write_self | リーダーがトランザクションパイプラインでトランザクションをコミットする回数。 |
xengine_write_wal | redoログが書き込まれた回数。 |