Compaction和Garbage Collection (GC) 是什么关系?

两者好像有点类似,但是触发条件又不一样

我理解,gc是数据行为, Compaction tikv行为,gc过后的数据才会被Compaction

不是类似,是差别很大

GC,对于 tidb,tikv,tiflash,都会有回收的机制,将内存碎片释放在回收重用的过程

Compact 或者 Compaction 只针对数据节点,按照不同的数据标记,对数据压缩或者进行丢弃的过程

Compaction(压缩)和 Garbage Collection(垃圾回收)是两个独立但互相关联的概念。Compaction 解决了内存碎片化的问题,提高了内存利用率;而 Garbage Collection 则负责回收不再使用的内存对象,保证内存管理的自动性和有效性。

1 个赞

GC 机制简介 | PingCAP 文档中心
这里说的GC和和MVCC相关,减少TiKV中超时的历史版本的Key。

我理解TiDB下的GC + Compaction = PG下的VACUUM :thinking:

tidb 的增删改查最终反映到tikv是对一个key的处理。
在key中增加了时间戳后缀,实现了mvcc。
tidb的gc就是删掉过期的版本。
也就是说一条数据可能存在 key1_ver1 key1_ver2 key1_ver3 等好几个版本,等key1_ver1 过了gc时间了,没有事务在用了。就要删掉。这就是gc干的活。

tikv底层用的rocksdb。
也就是说上面的 删除key,就是 一条 delete(key1_ver1)
gc到此就结束了。

至于compact,就要从rocksdb的 lsmtree 理解了。
对于rocksdb来说,所有的修改只是追加。比如说上面的操作反应到rocksdb就是做了几条记录:
deletekey(key1_ver1)
putkey(key1_ver3)
putkey(key1_ver2 )
putkey(key1_ver1)
从下到上,时间按从老到新。

这样其实对于 key1_ver1 在rocksdb中就属于浪费的key,读不到了。这样删除的key多了以后,就会浪费很多磁盘空间。所以就有了compact
执行compact后,数据就变成了
putkey(key1_ver3)
putkey(key1_ver2)

磁盘空间就减少了。

2 个赞

tidb一般说的gc不是指内存gc,而是tikv中的数据被delete,drop ,truncate,update后,然后超过参数tidb_gc_life_time时间的旧数据清理,标记为已经清理,空间可以重复写入数据了

Compaction是tikv的底层数据库rocksdb的概念,可以理解为对数据整理,压缩,排序等

gc :tidb的概念 清理设置的gc safepoint时间点前的mvcc数据和清理SST(drop、truncate) ,对于数据清理就是加个rocksdb的delete标记,等待rocksdb compact时才真正的清理。
compact: rocksdb的概念,把写入的数据一层层往下合并,同时清理到设置了deleted的数据。
tikv有个gc in compaction filter 功能,在rocksdb compact时通过接口调用 实现 GC 操作

2 个赞

画个图就可以理解了。。。


删除相当于打标数据被删除,gc才会真正把删除的数据清除,compact才会把删除的数据空间释放,大致就这样。。。

了解学习。

一个是数据清理,一个是数据合并

简单的理解,GC是逻辑上的行为,主要是标记数据待删除;Compaction 是底层rocksdb的行为,合并sst 转存到下一层,释放空间

2 个赞

老哥的解释清晰明了

所以GC其实作用不大,只是为Compaction做准备,Compaction才能减少全表扫描时候的读放大。

可以看看这个文档回复 key_skipped_count来自哪里 - :ringer_planet: TiDB 技术问题 - TiDB 的问答社区 (asktug.com)

1 个赞

真想把原始数据dump出来看看,truncate和delete打的标识应该不同。


TiDB 中删除数据后会立即释放空间吗?

truncate 调用rockesdb的DeleteRange接口,可以批量处理连续的key,所以非常快。
关于tidb数据存储部分你得看rockesdb相关文档

1 个赞

好的,谢谢