raft-engine的存储空间占用大小超过预期

【 TiDB 使用环境】测试环境
【 TiDB 版本】

select version();
+--------------------+
| version()          |
+--------------------+
| 8.0.11-TiDB-v7.4.0 |
+--------------------+

【复现路径】
在一个数据库中反复创建和删除表。
【遇到的问题:问题现象及影响】
TiKV存储路径下raft-engine文件夹的空间大小超过预期。

> du -h --max-depth=1
36G     ./raft-engine
31G     ./tablets
4.0K    ./import
4.0K    ./tablet_snap
66G     .

检查raft-engine文件夹中的文件,发现大量文件。按时间排序的结果如下图,约有130个文件。



检查TiDB集群的相关配置如下:

MySQL [(none)]> show config where name like '%raftstore.raft-log-gc%';
+---------+-------------------+-----------------------------------------------------+--------+
| Type    | Instance          | Name                                                | Value  |
+---------+-------------------+-----------------------------------------------------+--------+
| tikv    | 49.52.27.20:20162 | raftstore.raft-log-gc-count-limit                   | 10000  |
| tikv    | 49.52.27.20:20162 | raftstore.raft-log-gc-size-limit                    | 200MiB |
| tikv    | 49.52.27.20:20162 | raftstore.raft-log-gc-threshold                     | 50     |
| tikv    | 49.52.27.20:20162 | raftstore.raft-log-gc-tick-interval                 | 3s     |
| tikv    | 49.52.27.20:20161 | raftstore.raft-log-gc-count-limit                   | 10000  |
| tikv    | 49.52.27.20:20161 | raftstore.raft-log-gc-size-limit                    | 200MiB |
| tikv    | 49.52.27.20:20161 | raftstore.raft-log-gc-threshold                     | 50     |
| tikv    | 49.52.27.20:20161 | raftstore.raft-log-gc-tick-interval                 | 3s     |
| tikv    | 49.52.27.20:20160 | raftstore.raft-log-gc-count-limit                   | 10000  |
| tikv    | 49.52.27.20:20160 | raftstore.raft-log-gc-size-limit                    | 200MiB |
| tikv    | 49.52.27.20:20160 | raftstore.raft-log-gc-threshold                     | 50     |
| tikv    | 49.52.27.20:20160 | raftstore.raft-log-gc-tick-interval                 | 3s     |
| tiflash | 49.52.27.20:3930  | raftstore-proxy.raftstore.raft-log-gc-count-limit   | 73728  |
| tiflash | 49.52.27.20:3930  | raftstore-proxy.raftstore.raft-log-gc-size-limit    | 72MiB  |
| tiflash | 49.52.27.20:3930  | raftstore-proxy.raftstore.raft-log-gc-threshold     | 50     |
| tiflash | 49.52.27.20:3930  | raftstore-proxy.raftstore.raft-log-gc-tick-interval | 3s     |
+---------+-------------------+-----------------------------------------------------+--------+

其中raftstore.raft-log-gc-size-limit为200MiB,远小于实际的36G。raftstore.raft-log-gc-tick-interval为3s,但目录下的raftlog时间差达到分钟级,因此多余的raftlog应该能被删除。

目前通过tiup clean --all暂时清空了日志,但我希望能知道TiDB的配置项所限制的raft-engine目录的空间到底是多少(怎么计算的)?以及如何限制raft-engine目录的空间占用。谢谢!

另,集群tikv的配置文件如下

  tikv:
    log.file.max-backups: 10
    log.level: error
    readpool.coprocessor.use-unified-pool: true
    readpool.storage.use-unified-pool: false
    rocksdb.max-total-wal-size: 1
    storage.engine: partitioned-raft-kv

看这些参数,应该对你有帮助的
https://docs.pingcap.com/zh/tidb/stable/tikv-configuration-file#raft-log-gc-threshold

谢谢你的回复!

我们注意到了相关的参数,并在主楼里展示了我们集群的相关参数。以下是单个节点的对应参数,全部参数见主楼。

±--------±------------------±----------------------------------------------------±-------+
| Type | Instance | Name | Value |
±--------±------------------±----------------------------------------------------±-------+
| tikv | 49.52.27.20:20162 | raftstore.raft-log-gc-count-limit | 10000 |
| tikv | 49.52.27.20:20162 | raftstore.raft-log-gc-size-limit | 200MiB |
| tikv | 49.52.27.20:20162 | raftstore.raft-log-gc-threshold | 50 |
| tikv | 49.52.27.20:20162 | raftstore.raft-log-gc-tick-interval | 3s |

正因相关参数的数值与我们观测到的实际大小存在巨大的偏差,引发我们提出了这个问题。

在文档中,raft-log-gc-size-limit描述为对残余的 Raft 日志大小的硬限制,其具体值在我们集群中为200MiB,但raft-engine中总的空间占用为36G,两者差异巨大。结合raft-log-gc-count-limit描述中的“3/4 Region 大小所能容纳的日志个数”和raft-log-gc-size-limit描述中的默认值"Region 大小的 3/4"。raft-log-gc-size-limit似乎是指全部文件的大小总和,而不是指单个日志文件的大小(如果是的话所观测现象是正常的,因为单个文件大小130MB,且文件数小于10000)。

因此,我们想知道具体raft-log-gc-size-limit是指整体的空间大小还是单个文件的大小。以及raft-engine目录的空间占用是怎么计算的,是raft-log-gc-size-limit,还是raft-log-gc-size-limit * raft-log-gc-count-limit,或者两者都不是?

参数配置太复杂。

2楼可以的

:thinking:我怀疑这个是限制单节点大小的,看楼主截图应该是单机混合部署了3个节点,那计算占用空间时,按x3去计算上限,是否符合观测结果?

1 个赞

是的,我们这个集群是三个tikv部署在同个物理节点的。

但三个tikv部署的具体目录不同,这里展示的raft-engine目录只是其中一个tikv下的raft-engine。整体的情况是每个目录都有36G的占用,三个节点加起来有100多个G,而参数显示是200MiB。

我赞同这些参数描述的是单个tikv的情况,但似乎仍然是对不上的。

raft-log-gc-count-limit调到当前文件数量一半试试有效果没。

这3个参数任意一个达到阈值应该就会触发清理吧?

我记得好像测试遇到过这种情况,重启下tidb集群就可以清理掉

我们现在是把raft-log-gc-count-limit改成原来的1/10。目前占用空间很小,暂时是work的,但我们没法确定到底这个触发清理的阈值到底是多少,所以它只是一个治标不治本的方法,不知道什么时候又会出问题。

谢谢你的方案!

因为现在我们现在搭的是测试集群,所以我们是简单粗暴地用tiup把整个集群的数据清掉了。后续我们调整了配置参数,暂时测试下来没有问题。但正式使用的时候肯定不希望有这些不确定性、需要人工处理的内容。所以我们希望能搞清楚TiDB是怎么处理这个问题的,这些参数具体是怎么发挥作用的。

1 个赞

tidb我测试后面tikv占用硬盘空间很大的,真要用磁盘空间留大点

raft-log 是用于snapshot 追赶 和 版本核对,回放等作用,系统会有部分的保留时间,减少其他的资源占用。

如果对于这块的参数无把握的情况下,建议两种处理方式:

  • 留出可靠的空间比例,用于留存和自动清理
  • 结合实际的业务场景,对该参数的调整值进行测试,看是否满足

请参考


另外建议使用 LTS 的版本…

1 个赞

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