/tidb-data 数据目录增长比插入的数据量大很多

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:4.0
  • 【问题描述】:在mysql中10mb数据,插入tidb中,用show table regions,显示数据变大了好几倍(3-5), 在数据目录 /tidb-data/tikv/db中,数据增长了十几倍,而且有几次删除了tidb的表,/tidb-data/tikv/db的数据量还不减少。

我用的单机模拟安装的,不知道为什么,希望解答一下, 目前在测试mysql 同步到tidb的数据量比例—就是mysql 1GB(tokudb,innodb)到tidb中大概占用多少,方便购买服务器

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

  1. mysql 中 10mb的数据,mydumper 导出后是多少,按照mydumper来计算一下
  2. 数据目录/tidb-data/tikv/db ,如何查看增长了十几倍? 删除表后,需要等 compaction 完成才会释放空间
  3. tidb 的默认设置是 3 副本,但是会有compaction,所以会比3倍的容量要小,可以理解为 3 * 0.7 的容量。 如果您的容量只计算原表大小,索引需要单独计算,多谢。

du -ah --max-depth=1 ./ 这个查看 /tidb-data/tikv 就是mysql 70MB的数据导入到tidb ,tidb show table tbname regions 为 95

然后存放数据的/tidb-data/tikv-20160 到 /tidb-data/tikv-20162 分别增长了300,200 100mb

想问这多出来的是什么

请具体查看一下,这三个目录,比对一下每个子目录,是哪里多出来的,多谢。

image
image


image

横着看 ,

其实我不在意他们之间大小不一样 100MB 还是200MB 都无所谓

我在意的是 我mysql70MB的数据导入到tidb为啥占用了近600mb的磁盘空间

你好,

tikv 使用 rocksdb 作为存储引擎,可以了解下 rocksdb 中关于空间放大的概念

  1. 这里可以看到你查看的是raft 目录,有很大一部分是 log 文件,这里代表的是 raft 同步时记录的log 信息,这些信息应用后,是可以被重新写入的,所以空集群开始写入时,会有一些占用。 主要可以看.sst文件的占用。应该是差不多的。

  2. 另外,rocksdb 会随着数据的写入,进行compaction,之后数据会进一步压缩。所以上面答复您会有那样的公式,多谢。

TiKV 采用 LSM-Tree 架构的 RocksDB 作为底层存储引擎,最新写入的数据会在最上层,最老的数据在最底层。 如果用户只执行过 INSERT 而没有 UPDATE 和 DELETE 的话,那么按照默认配置 max-bytes-for-level-multiplier ,每一层的大小是上一层的十倍。 RocksDB 相同层不会有重复的数据,再乘以三个副本,因此 10GB 数据最多占据 (512MB + 1GB + 10GB) * 3 的物理空间,由于 RocksDB 还采取了针对对 key 的前缀压缩, 以及针对 block 的 LZ4 或 ZSTD 压缩,因此最终占用的磁盘空间肯定小于 33.5GB. (512MB 为L0 的 SST 文件大小。这里没有考虑索引的大小)

这个 “512MB 为L0 的 SST 文件大小”,这个L0是哪个文件?大小是固定的吗?image|374x500

https://github.com/facebook/rocksdb/wiki/Leveled-Compaction

可以看下 rocksdb 的 wiki

按这个文章说的,如果mysql 同步的数据小于L0(512MB),比如mysql 50MB同步到tidb,那么就会有(50+50)*3=300MB 这种翻6倍的效果,而同步的数据大于512就不会有了? 是这样吗?

  1. 您好,这个文章说明的是包含了update信息的。 如果只有 insert,那么你的 50M 都会在 L0,也就是 50*3 =150M。
  2. 针对你的问题,需要先了解,tikv 中存在两个 rocksdb,你看的目录是 raft ,所以是raft 日志的目录。 真正的数据在 db 目录下。 raft 目录下的数据应用后,是可以自动覆盖清理的。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。