两者好像有点类似,但是触发条件又不一样
我理解,gc是数据行为, Compaction tikv行为,gc过后的数据才会被Compaction
不是类似,是差别很大
GC,对于 tidb,tikv,tiflash,都会有回收的机制,将内存碎片释放在回收重用的过程
Compact 或者 Compaction 只针对数据节点,按照不同的数据标记,对数据压缩或者进行丢弃的过程
Compaction(压缩)和 Garbage Collection(垃圾回收)是两个独立但互相关联的概念。Compaction 解决了内存碎片化的问题,提高了内存利用率;而 Garbage Collection 则负责回收不再使用的内存对象,保证内存管理的自动性和有效性。
我理解TiDB下的GC + Compaction = PG下的VACUUM
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)
磁盘空间就减少了。
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 操作
了解学习。
一个是数据清理,一个是数据合并
简单的理解,GC是逻辑上的行为,主要是标记数据待删除;Compaction 是底层rocksdb的行为,合并sst 转存到下一层,释放空间
老哥的解释清晰明了
所以GC其实作用不大,只是为Compaction做准备,Compaction才能减少全表扫描时候的读放大。
truncate 调用rockesdb的DeleteRange接口,可以批量处理连续的key,所以非常快。
关于tidb数据存储部分你得看rockesdb相关文档
好的,谢谢