既然tidb会使用raft 协议对每个region复制副本,当默认副本数为3且TiDB集群中TiKV节点数为3时,每个TiKV节点存储的数据量应该是总数据量*副本数/节点数吧,那应该是等于每个TiKV节点存储的数据库全部数据量呀,为什么实际情况是当存储了2.7T的数据时,每个TiKV节点只用了900G的磁盘空间。请大家帮我解答一下,感谢!!!
2.7T是看的哪个指标
2.7T是mysql中统计的数据文件大小,tidb的数据是从mysql全量迁移来的,应该也是2.7T吧
不是的,tidb压缩效率比mysql高,不能单独比较磁盘占用。
那我想问下,每个TiKV节点存储的是数据库全部数据吗
因为tikv的存储引擎压缩数据,对比mysql大概1比3~5
按照你描述的部署结构,每个tikv上的就是全量数据
你的问题核心在于对 “总数据量” 的定义存在误解,以及对 TiKV 副本分布逻辑的理解偏差。我们可以从 TiDB 的存储架构和 Raft 副本分布机制来拆解这个问题:
关键结论先明确
当默认副本数为 3、TiKV 节点数为 3 时,每个 TiKV 节点存储的是 “单副本总数据量”,而 3 个节点的存储总和才是 “单副本总数据量 × 副本数”。
你看到的 “总数据量 2.7T” 其实是3 个副本的总存储量(900G × 3),而 “单副本实际数据量” 是 900G,因此每个 TiKV 节点正好存储 1 个完整的单副本数据(900G),完全符合预期。
详细解释:为什么会这样?
- “总数据量” 的定义需要明确
我们通常说的 “数据库总数据量”,指的是单副本数据量(即逻辑数据量,不含副本冗余)。例如,你向 TiDB 写入 900G 的业务数据(单副本),TiDB 会通过 Raft 协议复制出 2 个副本,最终 3 个副本的总存储量是 900G × 3 = 2.7T。
你提到的 “存储了 2.7T 的数据”,实际是3 个副本的物理存储总和,而非单副本的逻辑数据量。
- Raft 副本的均匀分布逻辑
TiDB 将数据分片为多个 “Region”(默认大小 64MB),每个 Region 会有 3 个副本(默认),这 3 个副本会均匀分布在不同的 TiKV 节点上(通过 PD 调度保证)。
当 TiKV 节点数 = 副本数(都是 3)时,每个 TiKV 节点会恰好持有所有 Region 的其中 1 个副本。因此:
- 所有 Region 的单副本总数据量 = 900G(逻辑数据量)
- 每个 TiKV 节点存储的是所有 Region 的 1 个副本 → 900G
- 3 个节点的总存储 = 900G × 3 = 2.7T(物理总存储)
- 举个直观例子
假设你的数据被拆分为 100 个 Region,每个 Region 单副本大小为 9G:
- 单副本总数据量 = 100 × 9G = 900G(逻辑数据)
- 每个 Region 的 3 个副本分别放在 TiKV1、TiKV2、TiKV3 上
- 每个 TiKV 节点会存储 100 个 Region 的 1 个副本 → 100 × 9G = 900G
- 3 个节点总存储 = 900G × 3 = 2.7T
额外补充:可能影响存储量的其他因素
- 数据压缩:TiKV 默认会对数据进行压缩(如使用 zstd 算法),实际物理存储可能比逻辑数据量小。但你的案例中 900G × 3 = 2.7T,说明压缩影响不大,主要还是副本分布逻辑导致。
- Region 调度偏差:如果 PD 调度存在短暂不均衡(如节点负载波动),可能会出现某个节点略多、某个略少的情况,但长期会趋于均衡(你的案例中 3 个节点都是 900G,说明调度很均衡)。
总结
核心误解是把 “3 个副本的总物理存储(2.7T)” 当成了 “单副本逻辑数据量”。实际上:
- 单副本逻辑数据量 = 900G
- 3 个副本总物理存储 = 900G × 3 = 2.7T
- 当 TiKV 节点数 = 副本数时,每个节点存储 1 个完整副本 → 900G
这完全符合 TiDB 的 Raft 副本分布设计,是正常现象
可不可以这样理解,如果tikv节点数大于3,而副本数等于3,这种情况或者以后继续扩容的话,每个Tikv才真正算是就只保存了部分数据量呀
是的。
有没有碎片?整理碎片后多大?
对了,索引这些是不是都一样。
mysql可能包括了binlog日志,表空间碎片等待。。刚迁移到tidb,tidb没有这些空间使用问题。