地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【TiKV】入門してみる

この記事は「TiDB Advent Calendar 2023」の21日目の記事です。

github.com

TiKVとは

TiKVは、分散型トランザクションキーバリューストレージシステムです。このシステムは、Rustで開発されており、GoogleのSpannerに触発されたRaftという分散コンセンサスアルゴリズムを使用しています。TiKVは、分散された環境での強力な一貫性を提供することで知られています。

TiKVの主な特徴は以下の通りです

  • 強力な一貫性と高可用性: TiKVは、複数のレプリカ間でデータを同期することによって、高いレベルの一貫性と可用性を実現します。
  • 分散トランザクションサポート: TiKVは、分散環境でのACIDトランザクションをサポートしています。
  • 水平スケーラビリティ: 大量のデータとトランザクションに対応するため、TiKVはクラスター内でのデータの自動分散とバランス調整を行います。
  • Raftコンセンサスアルゴリズム: データの整合性と耐障害性を確保するため、TiKVはRaftという分散コンセンサスアルゴリズムを採用しています。
  • マルチエンジンサポート: TiKVはRocksDBなど複数のストレージエンジンをサポートし、異なるユースケースに適応できます。

TiKVは、特に大規模なオンライントランザクション処理(OLTP)システムやリアルタイムのビッグデータ処理に適しており、CNCFのプロジェクトの一つで2020年9月2日にGraduatedに移行しています。バージョンは6.1までリリースされているようです。

tikv.org

アーキテクチャ

dbdb.io

用途/事例

TiDBにはリアルタイムHTAPを実現するために二つのストレージエンジンを備えています。その一つが行ベースのストレージエンジンであるTiKVでTiDB のストレージ部分は実現しています。

pingcap.co.jp

TiKVはRaftコンセンサスアルゴリズムを採用し、RocksDBにデータを保存しています。これにより、TiKVは複数のレプリカ間でのデータの一貫性と高可用性を保証し、TiDBの堅牢なデータ保存を支えます。

動かしてみる

以下にはdocker-comoposeで動かす例を記載しています。3ノード構成でのTiKVクラスタを使いデータの高可用性と耐障害性を確保するために、3つのPD(Placement Driver)ノードと3つのTiKVノードを使用します。Placement Driverについては過去に記事をかいてるのでそちらをご参照ください。

version: '3'
services:
  pd1:
    image: pingcap/pd:latest
    ports:
      - "2379:2379"
      - "2380:2380"
    volumes:
      - ./pd1-data:/pd-data
    command:
      - --name=pd1
      - --data-dir=/pd-data
      - --client-urls=http://0.0.0.0:2379
      - --advertise-client-urls=http://pd1:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-peer-urls=http://pd1:2380
      - --initial-cluster=pd1=http://pd1:2380,pd2=http://pd2:2380,pd3=http://pd3:2380

  pd2:
    image: pingcap/pd:latest
    ports:
      - "2379"
      - "2380"
    volumes:
      - ./pd2-data:/pd-data
    command:
      - --name=pd2
      - --data-dir=/pd-data
      - --client-urls=http://0.0.0.0:2379
      - --advertise-client-urls=http://pd2:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-peer-urls=http://pd2:2380
      - --initial-cluster=pd1=http://pd1:2380,pd2=http://pd2:2380,pd3=http://pd3:2380

  pd3:
    image: pingcap/pd:latest
    ports:
      - "2379"
      - "2380"
    volumes:
      - ./pd3-data:/pd-data
    command:
      - --name=pd3
      - --data-dir=/pd-data
      - --client-urls=http://0.0.0.0:2379
      - --advertise-client-urls=http://pd3:2379
      - --peer-urls=http://0.0.0.0:2380
      - --advertise-peer-urls=http://pd3:2380
      - --initial-cluster=pd1=http://pd1:2380,pd2=http://pd2:2380,pd3=http://pd3:2380

  tikv1:
    image: pingcap/tikv:latest
    ports:
      - "20160"
    volumes:
      - ./tikv1-data:/tikv-data
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv1:20160
      - --data-dir=/tikv-data
      - --pd=pd1:2379,pd2:2379,pd3:2379

  tikv2:
    image: pingcap/tikv:latest
    ports:
      - "20160"
    volumes:
      - ./tikv2-data:/tikv-data
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv2:20160
      - --data-dir=/tikv-data
      - --pd=pd1:2379,pd2:2379,pd3:2379

  tikv3:
    image: pingcap/tikv:latest
    ports:
      - "20160"
    volumes:
      - ./tikv3-data:/tikv-data
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=tikv3:20160
      - --data-dir=/tikv-data
      - --pd=pd1:2379,pd2:2379,pd3:2379

etcdとの違い

etcdと同じに見えるが..??となってしまうが公式のコンセプトページにあるようにetcdとの比較には大規模データの管理に向いているという母なしとのことでした。TiKVはデータの永続性と分散型トランザクションのサポートに焦点を当てた高可用性のデータストレージソリューションです。一方で、etcdは一貫性と信頼性の高い軽量キーバリューストアであり、構成管理やサービス発見に最適なソリューションと言えそうです。TiDBがこの特性をどう活かしている

tikv.org