• TiKV 启动时会预留一块空间用于保护磁盘空间。当磁盘剩余空间小于该预留空间时,TiKV 会限制部分写
操作。预留空间形式上分为两个部分:预留空间的 80% 用作磁盘空间不足时的运维操作所需要的额外
磁盘空间,剩余的 20% 为磁盘临时文件。在回收空间的过程中,如果额外使用的磁盘空间过多,导致
存储耗尽时,该临时文件会成为恢复服务的最后一道防御。
• 临时文件名为 space_placeholder_file,位于 storage.data-dir 目录下。当 TiKV 因磁盘空间耗尽而下
线时,重启 TiKV 会自动删除该临时文件,并自动尝试回收空间。
• 当剩余空间不足时,TiKV 不会创建该临时文件。防御的有效性与预留空间的大小有关。预留空间大小的
计算方式为磁盘容量的 5% 与该配置项之间的最大值。当该配置项的值为 0MiB 时,TiKV 会关闭磁盘防护
功能。
• 默认值:5GiB
• 单位:MiB|GiB
reserve-space 参数用于控制 TiKV 预留的磁盘空间大小,该空间会以 space_placeholder_file 文件的形式预占,旨在防止磁盘被写满导致服务不可用。
root@erp [(none)]> show config where name like '%reserve-space%';
+------+---------------------+-----------------------+-------+
| Type | Instance | Name | Value |
+------+---------------------+-----------------------+-------+
| tikv | 172.16.76.239:20160 | storage.reserve-space | 5GiB |
+------+---------------------+-----------------------+-------+
1 row in set (0.03 sec)
参数配置方法
你可以在 TiKV 的配置文件(通常是 config.toml)中的 [raftstore] 或 [storage] 部分(具体取决于版本)进行配置。该参数的值是一个字符串,支持以 KB、MB 或 GB 为单位。
配置方式:
方法一:
通过 TiUP 修改配置(推荐方式):
tiup cluster edit-config tidb-uat
server_configs:
tidb: {}
tikv:
readpool.coprocessor.use-unified-pool: true
readpool.storage.use-unified-pool: false
rocksdb.wal-size-limit: 1G
rocksdb.wal-ttl-seconds: 86400
storage.reserve-space: 1G
storage.block-cache.capacity: 1G
保存退出:
Please check change highlight above, do you want to apply the change? [y/N]:(default=N) y
Applying changes...
Applied successfully, please use `tiup cluster reload tidb-uat [-N <nodes>] [-R <roles>]` to reload config.
[root@uat-server-2 raft-engine]#tiup cluster reload tidb-uat -R tikv
查看:
tidb:
root@erp [(none)]> show config where name like '%reserve-space%';
+------+---------------------+-----------------------+-------+
| Type | Instance | Name | Value |
+------+---------------------+-----------------------+-------+
| tikv | 172.16.76.239:20160 | storage.reserve-space | 1GiB |
+------+---------------------+-----------------------+-------+
1 row in set (0.03 sec)
如果需要禁用这个文件的生成,请将参数配置为0MB
server_configs:
tidb: {}
tikv:
raft-engine.purge-threshold: 1G
readpool.coprocessor.use-unified-pool: true
readpool.storage.use-unified-pool: false
rocksdb.wal-size-limit: 1G
rocksdb.wal-ttl-seconds: 86400
storage.block-cache.capacity: 1G
storage.reserve-space: 0MB
配置生效前:
[root@uat-server-2 tikv-20160]# ls
db import last_tikv.toml LOCK raftdb.info raft-engine rocksdb.info snap space_placeholder_file
[root@uat-server-2 tikv-20160]# du -sh ./space_placeholder_file
12G ./space_placeholder_file
配置生效后:space_placeholder_file文件已删除
[root@uat-server-2 tikv-20160]# ls
db import last_tikv.toml LOCK raftdb.info raft-engine rocksdb.info snap
方法二:
[raftstore]
reserve-space = "2GB"
此配置表示 TiKV 启动时会在数据目录(storage.data-dir)下预占一个名为 space_placeholder_file 的 2GB 文件。
⚖️ 配置建议
1. 默认值:不同 TiKV 版本的默认值可能不同,建议查阅对应版本的官方文档。
2. 设置大小:
◦ 基本原则:预留空间的大小应能确保在业务高峰时段,磁盘不会因突然的数据写入而被迅速填满。
◦ 参考因素:需综合考虑磁盘的总容量、业务的数据写入量(吞吐量和峰值)、以及 TiKV 存储容量参数 raftstore.capacity(该参数定义了 TiKV 实例存储数据的最大容量)。
◦ 最终取值:TiKV 实际预留的空间大小 Reserved_Size 的计算方式是 Max( Min(disk_total_capacity, raftstore.capacity), reserve-space)。这意味着最终预留的空间会是 reserve-space 设置的值、raftstore.capacity 以及磁盘总容量三者中最大者的上限。
3. 设置为 0MB:在某些特殊情况下,例如磁盘空间已经非常紧张,或者你希望通过其他监控手段来管理磁盘空间,可以将 reserve-space 设置为 "0MB"。但需注意,这将禁用 TiKV 的内置磁盘空间防护机制,需自行确保磁盘不会被写满。
⚠️ 紧急情况处理
若 TiKV 因磁盘空间不足无法启动,可以进行紧急干预:
1. 手动删除数据目录下的 space_placeholder_file 文件以立即释放其占用的空间。
2. 将 reserve-space 参数修改为 "0MB"。
3. 重启 TiKV 实例。
注意:这只是应急办法。根本解决之道还是需要扩容磁盘或清理数据,并在此基础上合理配置 reserve-space。
🔧 重要提醒
• 勿手动删除其他文件:space_placeholder_file 是唯一一个在紧急情况下可能可以手动删除的文件。数据目录下的其他文件(如 db 或 raft 子目录中的文件)绝对不要手动删除,否则可能导致数据丢失或服务异常。
• 监控与调整:配置完成后,务必持续监控磁盘的使用情况。根据实际使用趋势,适时调整 reserve-space 的大小以及其他存储相关参数。
• 参考官方文档:不同版本的 TiKV 在参数行为上可能有细微差别,部署和调整前最稳妥的方式是查阅对应版本的官方文档。


