すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:使用上の注意

最終更新日:Jan 11, 2024

このトピックでは、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インスタンスの作成」をご参照ください。

説明

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ログが書き込まれた回数。