tikv region 合并触发条件

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】6.5.3
【复现路径】做过哪些操作出现的问题
1.使用tikv golang的客户端v2.0.7往tikv集群写入数千万级别的kv键值对
2.删除全部的key
3.使用带事务的Iter接口扫描一个特定范围的key,startKey= ff7969676f5c746573745c ,endKey = ff7969676f5c746573745cff
【遇到的问题:问题现象及影响】
1.扫描过程中发现耗时很长,耗时总计快1分钟
2.通过在tikv客户端加入打印发现,iter接口前后向1300多个region发送过getData方法,但是都没有扫描到匹配的key,这一点符合预期,因为都被删除掉了
3.问题是这些region没有触发合并,在什么条件下才会合并?是不是需要在pd上做某些配置呢?

比较吊诡的是,当我使用pd_ctl工具查询start/end key所处的的region的时候,只返回了一个region


这又与上面从1300多个region访问的事实不符,到底是哪出了问题?

请大佬解惑

===============================
更新一下这个问题的进展,首先我使用golang客户端的gc的example跑了一下gc,简单测试了一下,问题还在,也就是scan的时候,仍然会去1300多个region挨个扫描,但是扫不到东西。
取其中的一个region为例7979980,如下图

使用pd工具可以查到7979980这个region里面也是有key的,如下图所示,空间95MB,204800个key

再看一下region里面的mvcc的key的数量

我一开始想不通为什么里面明明有key存在,但是扫出来的数量为0,看到2楼的解释说,即使做了gc,mvcc里面也会有一个tombstone的版本的key存在,那我猜测现在region里面存的key会不会就是墓碑版本的key呢?如果是的话,什么操作才可以彻底删除这些墓碑的key,进而触发region合并且减少region的数量呢?

是否单独部署了tikv实例,而没有部署tidb实例?
如果是,这种情况需要手动来触发gc。

https://github.com/tikv/client-go/wiki/Garbage-Collection

mvcc的清理,主要依靠gc和compaction
详细解释,可以参考下面这个回复。

2 个赞

手工compact下应该就没了

我是学习的,这是单独使用tikv 吗

三种方式满足你的期望:

  1. 加装一个 tidb 节点,通过 tidb节点来自动触发 GC机制
  2. 采用命令行的方式,tikv-cli 手工通过命令行来触发 GC 机制(单节点或者集群)
  3. 通过自定义扩展的方式,结合tikv golang 的服务自行打造 GC 机制的自动触发,来满足这个场景的需求…

大规模的删除之后也会

小到一定阈值 自动合并。

gc回收到一定阈值后合并

意思是如果tikv是单独部署的,GC和region的合并,都得手动来进行啊

gc回收到阈值后开启合并

遇到过大概小到20m左右合并,但没有一个准确的参数控制这个吧?

到阈值后自动开启

有用赞一个

小到一定阈值 自动合并。大到一定程度,就分裂

先标记一下,仔细看看。