CockroachDB TiDB Elastic scalability (Both read and write) Automated failover and high availability Distributed ACID transactions SQL compatibility and protocol MySQL and PostgreSQL Proprietary (+PostgreSQL) PostgreSQL PostgreSQL MySQL Open Source License Apache 2.0 BSL and CCL Apache 2.0 HTAP
Cluster 負荷分散・領域管理 3ノードのみ必要 SQL解析レイヤー PD Cluster TiDB TiKV TiKV TiKV TiKV 容量拡張 ノード追加で対応 TSO / Data Location Metadata PD PD PD Application via MySQL Protocol Application via MySQL Protocol Application via MySQL Protocol Application via MySQL Protocol データストアレイヤー アプリケーション (MySQLClient利用可能) - SQL解析レイヤーとデータストアレイヤーを分割(Google Spanner着想) - 全てのコンポーネントがスケール可能(テーブルの分割等は不要)
3 Region 2 Region 3 Region 1 Region 2 Region 3 Region 1 Region 2 Region 1 TiKV TiKV TiKV TiKV - 全てのノードにデータが均等に3つにコピーされて分散されている。 - Region(32MB)という単位で保存されており、rangeパーティショニングとなっている - 少なくとも2つ(過半数以上)にデータが入った段階で書き込み成功となる - スケールアウトすると直ちにデータの移動が始まる
3 (Follower) Region 2 (Leader) Region 3 (Follower) Region 1 (Leader) Region 2 (Follower) Region 3 (Leader) Region 1 (Follower) Region 2 (Follower) Region 1 (Follower) TiKV TiKV TiKV TiKV - Regionの中の1つがLeaderとしてIOを行う - Leaderが障害を起こすと、FollowerがLeaderを引き継ぐ TiDB TiDB
TiDB TiKV Node 1 Region 1 a = 1 b = 2 Store 1(Leader) a = 1 b = 2 Log Raft Module TiKV Node 2 Region 1 a = 1 b = 2 Store 1(candidate) a = 1 b = 2 Log Raft Module TiKV Node 3 Region 1 a = 1 b = 2 リーダーとなるRegionにのみアクセス リーダーから各Regionにデータをレプリケート Store 1(follower) Region : データチャンクの単位 - 過半数を得られたものを正とする - 書き込み成功:2ノード入った段階 - ノード障害時のリーダー選出:2ノードの投票が得られたノード - データの一意性はこれによって保たれる(Ex. Split Brain時) - 1ノードしかデータが入っていない時:アプリ…古いデータが正しい(未ACK)。 TiDB…古いデータが正しい(1ノード) - 2ノードにデータが入っている時:アプリ…新しいデータが正しい(ACK済)。 TiDB…新しいデータが正しい(2ノード)