CLOVER🍀

That was when it all began.

TiDBのアーキテクチャーをざっくりと眺めてみる(ストレージエンジン概要:TiFlash編)

これは、なにをしたくて書いたもの?

TiDBのアーキテクチャーをざっくりと把握しようという、このあたりの続きです。
※最初のエントリーがこのシリーズのインデックスページにもなっています

TiDBのアーキテクチャーをざっくりと眺めてみる(全体概要、ストレージ概要まで) - CLOVER🍀

TiDBのアーキテクチャーをざっくりと眺めてみる(コンピューティング概要) - CLOVER🍀

TiDBのアーキテクチャーをざっくりと眺めてみる(ストレージエンジン概要:TiKV編) - CLOVER🍀

今回扱うのは、ストレージエンジンのひとつであるTiFlashです。

TiFlash Overview | TiDB Docs

TiFlash

TiFlashについて書かれたページはこちら。

TiFlash Overview | TiDB Docs

TiFlashはTiDBを本質的にトランザクション処理/分析処理ができるハイブリッドなデータベース(HTAP)にしている重要なコンポーネントです。
TiFlashはTiKVの列指向のストレージ拡張機能として提供されていて、優れた分離レベルと強い一貫性保証の両方を提供します。

TiFlash is the key component that makes TiDB essentially an Hybrid Transactional/Analytical Processing (HTAP) database. As a columnar storage extension of TiKV, TiFlash provides both good isolation level and strong consistency guarantee.

また、TiFlashでは列のレプリカはRaft Learnerコンセンサスアルゴリズムによって非同期に複製されます。
これらのレプリカが読み取られた時には、RaftインデックスとMVCCを検証することでスナップショット分離レベルの一貫性を実現します。

In TiFlash, the columnar replicas are asynchronously replicated according to the Raft Learner consensus algorithm. When these replicas are read, the Snapshot Isolation level of consistency is achieved by validating Raft index and multi-version concurrency control (MVCC).

アーキテクチャ

TiFlashのアーキテクチャーです。

TiFlash Overview / Architecture

全体像はこちら。

まとめると、こんな感じのようです。

  • ClickHouseによって効率的に実装されたコプロセッサーのレイヤーを備えた列指向のストレージを提供
  • TiKVへの書き込みをブロックしない低コストな方法で、TiKVノードのデータのリアルタイムレプリケーションを実行
    • TiKVと同じ読み取り一貫性を提供し、最新のデータが読み取られることを保証
    • TiFlashのリージョンレプリカはTiKVのリージョンレプリカと本質的に同じで、TiKVのリーダーレプリカと同時に分割および結合が行われる
  • ワークロードが異なるため、TiFlashとTiKVは別のノードにデプロイすることを推奨
    • 同一ノードにデプロイすることも可能
  • TiFlashに直接データを書き込むことはできず、TiKVにデータを書き込んだ後にTiFlashにレプリケーションすることになる
  • 列指向のストレージ、tiflash proxy、pd buddyの3つのコンポーネントで構成される
    • tiflash proxyはMulti-Raftコンセンサスアルゴリズムを使用した通信を担当
    • pd buddyはPDと連携してテーブル単位でTiKVからデータを複製する
  • レプリケーション開始の流れ
    • TiDBがTiFlashにレプリカを作成するためのDDLを受け取る
    • pd buddyコンポーネントがTiDBのステータスポートを介してレプリケーションテーブルの情報を取得し、PDに送信
    • PDはpd buddyから提供される情報に従って、対応するデータスケジューリングを行う
主な特徴

TiFlashの主な特徴についてです。

TiFlash Overview / Key features

  • 非同期レプリケーション
    • TiFlash内のレプリカは、特殊なロールであるRaft Learnerとして非同期に複製される
    • たとえばTiFlashノードがダウンする、ネットワークが遅延するなどがあっても、TiKV内のアプリケーションは正常に処理を継続できる
    • TiFlash Overview / Key features / Asynchronous replication
  • 一貫性
    • TiKVと同じスナップショット分離レベルの一貫性を提供し、最新のデータが読み取られることを保証する
    • TiFlashが読み取りリクエストを受け取る度に、リージョンレプリカは進行状況検証リクエスト(軽量RPCリクエスト)をリーダーレプリカに送信し、現在のレプリケーション進行状況に読み取りリクエストのタイムスタンプでカバーされるデータが含まれる場合にのみ読み取り操作を実行する
    • TiFlash Overview / Key features / Consistency
  • 賢い選択
    • TiDBはあるクエリーでTiFlash(列指向)、TiKV(行指向)あるいは両方を自動的に選択して、最高のパフォーマンスを確保する
    • このメカニズムはクエリーの実行で異なるインデックスを選択するTiDBのメカニズムによく似ており、TiDBのオプティマイザーは読み取りコストの統計情報にもとづいて適切な選択を行う
    • TiFlash Overview / Key features / Intelligent choice
  • コンピューティングの高速化
    • TiFlashは、列指向ストレージエンジンの特徴である読み取りの効率化と、TiDBのコンピューティングワークロードの一部を共有することでコンピューティングを高速化する
    • TiFlash Overview / Key features / Computing acceleration

非同期レプリケーションについて少し補足すると、この仕組みのおかげでTiKVにデータが残っている限りいつでもTiFlashレプリカを復元できる
ことになります。
また、コンピューティングの高速化においては、TiKVでも行っていたコプロセッサーを使う方法でコンピューティングワークロードを共有すると
されています。コンピューティングをプッシュダウンできるかどうかは、TiFlashのサポート内容によって異なるようです。

TiFlashを使用する

TiFlashは、デプロイしてもデータのレプリケーションを自動で開始しません。レプリケーションするテーブルを手動で指定する必要があります。

TiFlash Overview / Use TiFlash

TiFlashのデータを読み取るには、中規模の分析処理であればTiDBを使ってもよいですし、大規模な分析を行いたい場合はTiSparkを使うのも
よいとされています。MPPモードを使用することもできます。

おわりに

TiDBのアーキテクチャーのうち、TiFlashストレージエンジンを見てみました。

最初に使った時にある程度雰囲気はわかっていましたが、あらためて仕組み(といっても概要ですが)を見てみた感じです。
TiDBにおけるHTAPというものはこういうものなんだな、というのが少し学べた気がします。