TiKVの概要
TiKV は分散型のトランザクション キー値データベースであり、 ACID準拠のトランザクション API を提供します。 RocksDB に格納されたRaftコンセンサスアルゴリズムおよびコンセンサス状態の実装により、TiKV は複数のレプリカ間のデータの一貫性と高可用性を保証します。 TiDB 分散データベースのstorageレイヤーとして、TiKV は読み取りおよび書き込みサービスを提供し、アプリケーションから書き込まれたデータを永続化します。また、TiDB クラスターの統計データも格納します。
アーキテクチャの概要
TiKV は、Google Spanner の設計に基づいて、マルチラフト グループ レプリカ メカニズムを実装します。リージョンは、キーと値のデータ移動の基本単位であり、ストア内のデータ範囲を参照します。各リージョンは複数のノードに複製されます。これらの複数のレプリカがRaftグループを形成します。リージョンのレプリカはピアと呼ばれます。通常、 リージョンには 3 つのピアがあります。それらの 1 つはリーダーであり、読み取りおよび書き込みサービスを提供します。 PDコンポーネントは、すべてのリージョンのバランスを自動的に調整して、TiKV クラスター内のすべてのノード間で読み取りと書き込みのスループットのバランスがとれるようにします。 PD と慎重に設計されたRaftグループにより、TiKV は水平方向のスケーラビリティに優れ、100 TB を超えるデータを格納するように簡単に拡張できます。
リージョンと RocksDB
各ストア内には RocksDB データベースがあり、データはローカル ディスクに保存されます。すべてのリージョンデータは、各ストアの同じ RocksDB インスタンスに保存されます。 Raftコンセンサス アルゴリズムに使用されるすべてのログは、各 Store の別の RocksDB インスタンスに保存されます。これは、シーケンシャル I/O のパフォーマンスがランダム I/O よりも優れているためです。 raft ログとリージョンデータを格納するさまざまな RocksDB インスタンスを使用して、TiKV は raft ログと TiKV リージョンのすべてのデータ書き込み操作を 1 つの I/O 操作に結合して、パフォーマンスを向上させます。
リージョンとRaftのコンセンサスアルゴリズム
リージョンのレプリカ間のデータの一貫性は、 Raftコンセンサス アルゴリズムによって保証されます。 リージョンのリーダーのみが書き込みサービスを提供でき、データがリージョンの大部分のレプリカに書き込まれた場合にのみ、書き込み操作が成功します。
TiKV は、クラスター内の各リージョンに適切なサイズを維持しようとします。現在、リージョンサイズはデフォルトで 96 MiB です。このメカニズムは、PDコンポーネントがTiKV クラスター内のノード間でリージョンのバランスを取るのに役立ちます。リージョンのサイズがしきい値 (デフォルトでは 144 MiB) を超えると、TiKV はリージョンを 2 つ以上のリージョンに分割します。 リージョンのサイズがしきい値 (デフォルトでは 20 MiB) より小さい場合、TiKV は 2 つの小さい隣接する Region を 1 つのリージョンにマージします。
PD がレプリカを 1 つの TiKV ノードから別のノードに移動する場合、まずターゲット ノードにLearnerレプリカを追加します。LearnerレプリカのデータがLeaderレプリカのデータとほぼ同じになった後、PD はそれをFollowerレプリカに変更し、削除します。ソース ノードのFollowerレプリカ。
あるノードから別のノードへのLeaderレプリカの移動には、同様のメカニズムがあります。違いは、 LearnerレプリカがFollowerレプリカになった後に、 Followerレプリカが自身をLeaderとして選択するための選択を積極的に提案する " Leader Transfer" 操作があることです。最後に、新しいLeaderはソース ノードの古いLeaderレプリカを削除します。
分散トランザクション
TiKV は分散トランザクションをサポートしています。ユーザー (または TiDB) は、同じリージョンに属しているかどうかを気にすることなく、複数のキーと値のペアを書き込むことができます。 TiKV は 2 フェーズ コミットを使用してACID制約を実現します。詳細はTiDB 楽観的トランザクションモデルを参照してください。
TiKVコプロセッサー
TiDB は、一部のデータ計算ロジックを TiKV コプロセッサーにプッシュします。 TiKV コプロセッサー は、各リージョンの計算を処理します。 TiKV コプロセッサーに送信される各リクエストには、1 つのリージョンのデータのみが含まれます。