TiDB HTAPクイックスタートガイド

このガイドでは、ハイブリッドトランザクションおよび分析処理(HTAP、Hybrid Transactional and Analytical Processing)に対するTiDBのワンストップソリューションを始める最も簡単な方法について説明する。

基本概念

TiDB HTAPを使用する前に、TiDB OLTP(オンライン・トランザクション処理、Online Transactional Processing)のための行ベースストレージエンジンであるTiKVと、TiDB OLAP(オンライン分析処理、Online Analytical Processing)のための列ベース(Columnar storage)ストレージエンジンであるTiFlashについて、いくつかの基本知識が必要である。

  • HTAPストレージエンジン: HTAPは行ベースストレージエンジンと列ベースストレージエンジンを共存させる。両方のストレージエンジンはデータを自動的に複製し、強い整合性を維持できる。行ベースストレージエンジンはOLTP性能を最適化し、列ベースストレージエンジンはOLAP性能を最適化する。
  • HTAPデータ整合性: 分散トランザクションキーバリューデータベースとして、TiKVはACID互換トランザクションインターフェースを提供し、複数レプリカ間のデータ整合性とRaftコンセンサスアルゴリズム実装による高可用性を保証する。TiKVの列ベースストレージ拡張として、TiFlashはRaft Learnerコンセンサスアルゴリズムに従ってTiKVからリアルタイムにデータを複製する。
  • HTAPデータ分離: HTAPリソース分離問題を解決するため、必要に応じてTiKVとTiFlashを別システムにデプロイできる。
  • MPPコンピューティングエンジン: MPPはTiDB 5.0以降のTiFlashエンジンが提供する分散コンピューティングフレームワークであり、ノード間のデータ交換を可能にし、高性能・高スループットのSQLアルゴリズムを提供する。MPPモードを使用すると、分析クエリ実行時間を大幅に短縮できる。

手順

この文書では、TPC-Hデータセットのサンプルテーブルをクエリすることで、TiDB HTAPの利便性と高性能を体験できる。TPC-Hは大量のデータと非常に複雑な一連のビジネス指向アドホッククエリで構成された、一般的な意思決定支援ベンチマークである。TPC-Hを使用して22個の完全なSQLクエリを体験するには、tidb-benchリポジトリまたはTPC-Hにアクセスし、クエリ文とデータを生成する方法を確認してほしい。

Step 1. ローカルテスト環境をデプロイする

TiDB HTAPを使用する前に、TiDBデータベースプラットフォームのクイックスタートガイドで説明されているようにローカルテスト環境を準備し、次のコマンドを実行してTiDBクラスタをデプロイする。

tiup playground

Step 2. テストデータを準備する

次の手順では、TiDB HTAPを使用するためのテストデータとしてTPC-Hデータセットを作成できる。TPC-Hに関心がある場合は、一般的な実装ガイドを参照してほしい。

  1. 次のコマンドを実行して、テストデータ生成ツールをインストールする。

    tiup install bench
    
  2. 次のコマンドを実行して、テストデータを生成する。

    tiup bench tpch --sf=1 prepare
    

    このコマンドの出力にFinishedが表示されれば、データが生成されたことを示す。

  3. 次のSQL文を実行して、生成されたデータを表示する。

    SELECT
      CONCAT(table_schema,'.',table_name) AS 'Table Name',
      table_rows AS 'Number of Rows',
      FORMAT_BYTES(data_length) AS 'Data Size',
      FORMAT_BYTES(index_length) AS 'Index Size',
      FORMAT_BYTES(data_length+index_length) AS'Total'
    FROM
      information_schema.TABLES
    WHERE
      table_schema='test';
    

    出力から分かるように、合計8個のテーブルが作成され、最大テーブルには650万行がある。データはランダムに生成されるため、ツールで作成された行数は実際のSQLクエリ結果と異なる。

    +---------------+----------------+-----------+------------+-----------+
    |  Table Name   | Number of Rows | Data Size | Index Size |   Total   |
    +---------------+----------------+-----------+------------+-----------+
    | test.nation   |             25 | 2.44 KiB  | 0 bytes    | 2.44 KiB  |
    | test.region   |              5 | 416 bytes | 0 bytes    | 416 bytes |
    | test.part     |         200000 | 25.07 MiB | 0 bytes    | 25.07 MiB |
    | test.supplier |          10000 | 1.45 MiB  | 0 bytes    | 1.45 MiB  |
    | test.partsupp |         800000 | 120.17 MiB| 12.21 MiB  | 132.38 MiB|
    | test.customer |         150000 | 24.77 MiB | 0 bytes    | 24.77 MiB |
    | test.orders   |        1527648 | 174.40 MiB| 0 bytes    | 174.40 MiB|
    | test.lineitem |        6491711 | 849.07 MiB| 99.06 MiB  | 948.13 MiB|
    +---------------+----------------+-----------+------------+-----------+
    8 rows in set (0.06 sec)
    

    これは商業注文システムのデータベースである。test.nationテーブルは国の情報、test.regionテーブルは地域情報、test.partテーブルは部品情報、test.supplierテーブルは供給者情報、test.partsuppテーブルは供給者の部品情報、test.customerテーブルは顧客情報、test.ordersテーブルは注文情報、test.lineitemテーブルは明細項目情報を表す。

Step 3. 行ベースストレージエンジンを使用してデータをクエリする

行ベースストレージエンジンだけを使用するTiDBの性能を確認するには、次のSQL文を実行する。

SELECT
    l_orderkey,
    SUM(
        l_extendedprice * (1 - l_discount)
    ) AS revenue,
    o_orderdate,
    o_shippriority
FROM
    customer,
    orders,
    lineitem
WHERE
    c_mktsegment = 'BUILDING'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate < DATE '1996-01-01'
AND l_shipdate > DATE '1996-02-01'
GROUP BY
    l_orderkey,
    o_orderdate,
    o_shippriority
ORDER BY
    revenue DESC,
    o_orderdate
limit 10;

これは配送優先順位クエリであり、指定日までに配送されていない最高収益注文の優先順位と潜在収益を提供する。潜在収益はl_extendedprice * (1-l_discount)の合計として定義される。注文は収益の降順で表示される。この例では、このクエリは未出荷注文を上位10件まで表示する。

Step 4. テストデータを列指向ストレージエンジンに複製する

TiFlashがデプロイされた後、TiKVはデータをすぐにTiFlashへ複製しない。複製するテーブルを指定するには、TiDB MySQLクライアントで次のDDL文を実行する必要がある。その後、TiDBは指定されたレプリカをTiFlashに作成する。

ALTER TABLE test.customer SET TIFLASH REPLICA 1;
ALTER TABLE test.orders SET TIFLASH REPLICA 1;
ALTER TABLE test.lineitem SET TIFLASH REPLICA 1;

特定テーブルの複製状態を確認するには、次の文を実行する。

SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'test' and TABLE_NAME = 'customer';
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'test' and TABLE_NAME = 'orders';
SELECT * FROM information_schema.tiflash_replica WHERE TABLE_SCHEMA = 'test' and TABLE_NAME = 'lineitem';

上記文の結果:

  • AVAILABLEは、特定テーブルのTiFlashレプリカを使用できるかどうかを示す。1は使用可能、0は使用不可を意味する。レプリカが使用可能になると、この状態はそれ以上変更されない。DDL文でレプリカ数を変更すると、複製状態が再計算される。
  • PROGRESSは複製進行状況を意味する。値は0.0〜1.0である。1は少なくとも一つのレプリカが複製されたことを意味する。

Step 5. HTAPを使ってデータをより速く分析する

Step 3のSQL文を再実行し、TiDB HTAPの性能を確認できる。

TiFlashレプリカを含むテーブルの場合、TiDBオプティマイザーはコスト見積もりに基づいてTiFlashレプリカを使用するかどうかを自動的に決定する。TiFlashレプリカが選択されているかどうかは、descまたはexplain analyze文で確認できる。例:

explain analyze SELECT
    l_orderkey,
    SUM(
        l_extendedprice * (1 - l_discount)
    ) AS revenue,
    o_orderdate,
    o_shippriority
FROM
    customer,
    orders,
    lineitem
WHERE
    c_mktsegment = 'BUILDING'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate < DATE '1996-01-01'
AND l_shipdate > DATE '1996-02-01'
GROUP BY
    l_orderkey,
    o_orderdate,
    o_shippriority
ORDER BY
    revenue DESC,
    o_orderdate
limit 10;

EXPLAIN文の結果がExchangeSenderまたはExchangeReceiver演算子を示す場合、MPPモードが有効であることを示す。

また、クエリ全体の各部分がTiFlashエンジンだけを使用して計算されるよう指定できる。詳細はTiDBを使用してTiFlashレプリカを読む方法を参照してほしい。

この二つの方法のクエリ結果とクエリ性能を比較できる。

次は何か

  • TiDB HTAPアーキテクチャ
  • HTAP調査
  • TiFlashの使用