在业务快速扩张的集群年代 ,vivo 内部的问题问题很多业务为了可以快速上线 ,给现网功能提供支撑 ,排查在 KV 类型的修复选型下许多场景都选用了轻量快速的 Redis 集群 。但是磁盘随着业务的不断发展与稳定 ,当数据量级达到一定程度的空间时候 ,数据性质开始发生变化:有的占用历史 Redis 集群热度下沉,但是香港云服务器浅谈依然基于 Redis 集群作为载体进行 KV 存储。这种类型的集群数据不仅量大,而且访问频次不高。问题问题
业务的排查发展阶段变化也会对数据载体的诉求也会相应发生变化 。对于大规模而热度不算高的修复 KV 存储场景而言,业务对降低成本的磁盘诉求日益增多 。为了满足这种类型的空间业务诉求 ,vivo 基于 TiKV 自研一套 KV 系统供业务使用。为了让业务可以更加便捷的接入,源码下载我们基于计算存储分离架构进行设计,把 TiKV 作为存储层开发 Redis 协议兼容的 KV 存储组件。架构如下 :

为了让机器资源可以得到更加高效的利用 ,我们使用不同业务混合部署的模式在相同的服务器上部署 TiKV 实例 。随着集群使用的场景日益增多 ,使用过程中面临的问题也会各种各样,TiKV 集群会出现诸如磁盘空间占用与预期不符 ,读写时延抖动,负载(存储占用,region 个数 ,服务器租用或者热读热写)不均衡等等的问题。
这次先从磁盘空间占用问题着手,从几个比较常见的排查点进行着手和排查 。其他的问题排查和修复会通过其他的文章后续进行分享。
磁盘空间的占用空间如果较高,例如磁盘剩余空间占比低于 pd 的 low-space-ratio ,会导致 pd 的 scheduler 判断节点所在机器磁盘资源不足 ,无法执行调度作业 ,建站模板导致集群的各种负载会越发不均衡;更加严重的情况可能会直接影响当前物理机器上的所有 TiKV 实例的可用性。
当前我们使用 TiKV 的 4.X ,5.X 以及 6.X 版本,其中有的特性在更新的版本中会得到修复。
从我们运维的经验来看,磁盘空间占用构成主要分以下几块:
日志buffer (占位文件)数据后续将根据这几种维度在 TiKV 的日常运维工作中进行排查和分析 。总的免费模板来说,组成如下 :
(1)日志
① Tikv 日志
② RocksDB 日志
(2)buffer
① 占位符文件
(3)数据
① RocksDB 数据
raft 数据(老版本)KV 数据② titan 数据
raft 数据(老版本)KV 数据下面基于我们在日常运维事项中出现频次较多的一些维度进行排查和分析,供大家线上运维工作一些参考 。
2.1 日志文件占用较多磁盘如果空间占用较大 ,可以优先对日志文件进行删除减缓磁盘空间资源使用 。
在一些老版本 TiKV 配置是没有 RocksDB 和 raftdb 日志的滚动保留配置 ,这种情况下会导致一些较老的日志长期保存 ,长期运行会导致日志文件占据磁盘空间较大 。
通常这种日志文件会在 Data 路径下:

2.1.1 排查
可以使用以下指令快速统计当前日志的占用总量 :
复制#排查raftdb.info日志 du -sh -c raftdb.info.* #排查rocksdb.info日志 du -sh -c rocksdb.info.* #其他按照匹配规则进行匹配1.2.3.4.5.6.7.输出如下 :
复制... 37M raftdb.info.2022-08-12-18:17:22.338660642 36M raftdb.info.2022-08-13-18:17:35.358329064 36M raftdb.info.2022-08-14-18:17:47.024173873 36M raftdb.info.2022-08-15-18:17:56.130172134 6.5G total1.2.3.4.5.6.如果在上述排查过程中,发现日志占用的比较多(例如 100G 粒度的亿华云日志),可以认为对磁盘空间资源的使用是比较影响的。应该对该集群进行操作。
2.1.2. 修复
原则上 ,日志文件其实是需要长期保存 ,因为后续进行问题定位等场景是需要的 。这里的修复方式我们提供几种思路:
如果大家有一些类似 graylog 等日志搜集的组件 ,可以在确保日志上传完成之后,及时进行日志文件释放;允许情况下,日志文件与数据日志文件存放在不同的磁盘或者载体中 ,区分日志文件对数据文件在容量上以及磁盘 io 的影响;对日志文件进行转移(例如传到其他更低成本的服务器之后进行压缩等),再进行删除;对较新的版本开启日志 rotation ,根据需求自动删除。情况允许的话尽量保留较多的日志,对日志进行转移,方便后续问题排查 。
2.1.3. 成因
日志文件较多基本是以下几个方面造成:
原生的日志文件没有配置 rotation;在目前的运维过程中我们发现,如果在 TiKV 的 API 层面有存在调用 unsafeDestroyRange 接口会导致 info 级别日志在 rocksdb.info.xx 日志产生(可以针对性排查) 。2.2. 占位文件占用空间较大通常占位文件名字是 space_placeholder_file ,可以基本在部署路径 bin 或者 Data 下 。通常用于 TiKV 节点重启的时候可以有更多的预留空间提供回放使用。
但是如果基于混部的方式进行部署 ,各个节点会重复使用这些占位文件,这种场景下随着节点数的增多 ,占位文件占用的总空间是比较可观的。
可以先使用 ll 指令查看占位文件大小,看是否对磁盘空间资源占用较大。
2.2.1. 排查
可以在 Tikv 的部署路径下通过以下指令进行排查。
复制ll|grep space_place1.输出如下:
复制-rw-r--r-- 1 root root 199941579980 Aug 5 2021 space_placeholder_file1.如果发现 space_placeholder_file 的占用空间比较大(对比磁盘 KV 原有的空间资源) ,可以认为占用的磁盘空间资源对当前 TiKV 节点的影响较大,需要处理。
2.2.2. 修复
如果发现当前磁盘空间确实比较低(尤其在一些可能影响到 pd 调度的场景下),可以进行临时删除 。
注意 :space_palceholder_file 会在 TiKV 启动的时候建立,在重启的时候会作为一个缓冲区使用。如果对磁盘空间利用率要求不至于极致,或者作业现场并没有对磁盘的空间资源要求很高 ,可以优先考虑其他维度的排查和操作 。
另外,如果希望 TiKV 启动的时候不另外占用 space_palceholder_file ,需要更改 TiKV 配置 :
复制[storage] reserve-space= "0MB"1.2.否则后续启动持续生效 。
建议在磁盘空间中 ,尤其混部场景下 ,可以使用统一的占位文件,在需要重启的场景下进行释放 ,节点恢复之后再把占位文件进行占据,保留缓冲区域 。
2.2.3. 成因
在前期的一些部署中 ,默认保留了占位文件,防止磁盘 KV 在没有充足的空间 ,可以用于防御性的磁盘释放。
但是对于一些同磁盘混布的集群,这种过多的资源占用可能对机器磁盘资源带来额外负担 。这种情况下可以通过删除占位文件进行资源释放。
2.3. TiKV 的 GC 过慢导致失效版本数据堆积较多存在一种情况是因为 TiKV 的 compaction filter 开启的话, GC 速度太慢,导致大部分数据都还没 GC 。
2.3.1. 排查
排查项有两个:
1. 排查监控:Tikv details.GC
如果发现 GC speed 监控中基本没有多少速度 ,但是业务侧是存在频繁的对同一个 key刷数据 ,或者删除数据,并没有对应的速冻的话 ,TiKV 层面的 GC 速度不够快。

同时 ,如果因为 compaction filter 开启的话 ,TiKV AutoGC Working 曲线为0 。

2. 排查配置: tikv.toml
可以查看 TiKV 的配置,查看 TiKV 部署路径下的 tikv.toml ,查找项目 gc.enable-compaction-filter。
如果上述两项都得以验证,可以认为 compaction-filter 选项影响到了当前的 GC 进度 。
2.3.2. 修复
操作步骤如下 :
1. 对 TiKV 的配置 tikv.toml 进行更改:gc.enable-compaction-filter 修改成 true 。
复制[gc] # Enable GC by compaction filter or not. enable-compaction-filter = true1.2.3.2. 对 TiKV 的配置 tikv.toml 进行更改:rocksdb.rate-bytes-per-sec 修改成建议配置。
复制[rocksdb] rate-bytes-per-sec = "500MB"1.2.注意配置的大小 :
这里的“500MB”根据实际的磁盘测试写入上限来配置;因为开启了 gc.enable-compaction-filter 之后,TiKV 的 GC 必然会增加 ,最终会带来磁盘 IO 资源消耗 ,为了可以减少 GC 对磁盘的 IO 资源 ,使用 rocksdb.rate-bytes-per-sec 对节点的磁盘 IO 资源进行控制;对于磁盘独占的 TiKV 节点,可以配置成“500MB”(具体参考磁盘写入上限) ,如果后续发现节点性能下降 ,需要适当调低;对于磁盘混布的 TiKV 节点,可以配置成“500MB”(具体参考磁盘写入上限)/<节点数>,如果后续发现节点性能下降 ,需要适当调低 。3. 重启&观察
操作成功后,应该会看到 Tikv details.GC.GC speed 监控项目以及 Tikv details.GC.TiKV AutoGC Working 监控项目发生变化 。


之后 ,可以观察磁盘的使用情况,应该会存在长期的缓慢下降 。
TiKV 开启 gc.enable-compaction-filter 使用注意 :
因为开启了 gc.enable-compaction-filter 之后 , TiKV 的 GC 必然会增加 ,最终会带来磁盘的负载 ,此处需要考虑好扫描的时候可能对 TiKV 带来的负载;由于对集群存在长期影响 ,建议提前与业务进行沟通