tikv 删除大量数据后几个小时后, 已经删除的区间 scan, 还是会过滤到大量已删除的数据

tikv 删除大量数据后几个小时后, 磁盘已经降下来了, scan 已删除的数据, 最后结果也为空,但是中间会扫描到大量已删除的数据,导致 scan 速度很慢, 这个有办法处理么

scan debug 日志如下:(图中只是很长 scan debug 日志中的一部分)

当前版本:
Release Version: 4.0.1

相关配置:
region-compact-check-interval 是默认值, 5min
region-compact-check-step 是默认值,100
是不是意味着每个 5 分钟会有 100 个 region 尝试 compact, 但是为何好几个小时后已删除的数据没有 compact 掉

你好,

请帮忙确认下当前 gc 的相关设置。

SELECT
*
FROM
mysql.tidb
WHERE
variable_name LIKE ‘%gc%’;

直接使用的 tikv 没有使用 tidb, 但会有程序每隔 10 分钟发送新的 safepoint 给 tikv

删除会有涉及两种不同的方式:

  1. 少量范围的删除,会 txn scan 之后 delete
  2. 确认一段时间不会再操作的范围删除,会使用 UnsafeDestroyRange

不知道这两种删除会不会对这个问题造成影响

用的是 raw kv 还是 txn kv?txn scan 意思是 txn kv 吗?

扫描到大量已删除数据是如何发现的?是从监控的 processed keys 吗?

  1. 如果用的是 txn kv。txn scan 后 delete 其实是写入 tombstone,不会删除掉数据,真正删除数据的是 GC。
  2. UnsafeDestroyRange 会直接删除数据,要注意这个不会通过 raft 同步,需要往所有 tikv 发送。

scan 慢的话怀疑是 gc 跟不上导致版本积累,麻烦看一下 gc 的进度。safepoint 一直在更新只能说明要 gc 之前的版本,tikv gc 不一定能跟上。。

用的 txn kv

扫描到大量已删除数据是如何发现的

因为 debug 日志一直开着,可以看到扫描已删除范围的时候, 一直出现上面的第一张图, 不停在 txn getData, 过了好几分钟后会 scan 完毕,返回空列表(因为已删除)

gc 的进度

进度是这个? process 的百分比是一阵阵显示(每一阵结束说明当前的 gc 已完成?), 删除操作的时间在截图之前(昨天)

gc 应该是正常的,而且数据量不多。麻烦看一下 tikv grpc kv_scan 的延迟还有,scheduler scan 的监控:
image

手动请求了两次昨天删除的范围,都是 1分钟以后再返回的

有时候事务没有开启 follow-reader, 却会报 tikv reports RegionNotFound in follow-reader" 的错误, 这个也是因为批量删除导致的?

从 TiKV 处理延迟来看,速度很快。怀疑和客户端使用方式有关,看 log 好像是串行每次 scan 64个 key 的范围,可以用整个要 scan 的 key range 除以 64 算一下需要多少次 scan,每次 scan 就算 1ms 就能知道大致需要多长时间了。TiDB 内部这种大范围的 scan 都是并行发送给 TiKV 的,所以延迟只有 1 次 RTT。

那照理说 scan 一个已经删除的范围,应该只要一次 scan 就可以了吧, 是因为 region 大量为空,但本身没有被删除,所以被清空的 region 还是需要 scan 一次来查询?

说明空 region 被清理的太慢了?

对的。空 region 要等 region merge 清理,可以查一下官网有加速 region merge 的参数。

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