この記事は「TiDB Advent Calendar 2023」の21日目の記事です。
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までリリースされているようです。
アーキテクチャ
用途/事例
TiDBにはリアルタイムHTAPを実現するために二つのストレージエンジンを備えています。その一つが行ベースのストレージエンジンであるTiKVでTiDB のストレージ部分は実現しています。
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がこの特性をどう活かしている