tidb8.5.3 tikv存储不均衡

TiKV 未释放空间的原因

1)SST import 临时文件

路径

/data1/tidb-data/tikv-20160/import

里面会有:

.temp
.sst

这些是 restore 过程产生的。

如果 restore 中断:

不会自动清理。


2)删除库只是逻辑删除

你执行了:

drop database

但:

数据不会立即删除

因为 TiDB 是:

MVCC + GC 回收

删除后:

数据进入:

GC 等待阶段

只有 GC 后才真正释放。


3)GC 停在凌晨

你说:

gc时间停在凌晨

说明:

GC 没推进

检查:

mysql.tidb

看:

tikv_gc_safe_point

可能停住了。

例如:

2024-04-08 02:00

一直不动。

那么:

drop 的库不会被清理

磁盘自然不释放。


4)Region 不均衡

restore 过程中:

大量 SST 导入

会产生:

大量 Region

如果 restore 中断:

调度不完整。

就会出现:

某些 tikv 写入大量数据
某些 tikv 很少

磁盘不均衡。


现在正确处理方案

按顺序执行。

不要跳步骤。


第一步:检查 GC 状态

执行

select * from mysql.tidb where variable_name like ‘tikv_gc%’;

重点看

tikv_gc_enable
tikv_gc_run_interval
tikv_gc_safe_point

正常应该类似:

tikv_gc_enable = true
tikv_gc_run_interval = 10m
tikv_gc_safe_point = 当前时间 - 1h

如果 safe_point 不动。

说明 GC 卡住。


第二步:手动推进 GC

执行

update mysql.tidb
set variable_value=‘10m’
where variable_name=‘tikv_gc_run_interval’;

然后:

update mysql.tidb
set variable_value=‘true’
where variable_name=‘tikv_gc_enable’;

再看

tikv_gc_safe_point

是否推进。

也可以直接触发:

gc

方法:

set global tidb_gc_run_interval=‘5m’;

等待 10 分钟。

观察:

tikv 磁盘

是否下降。


第三步:清理 Import 目录

进入每个 tikv

cd /data1/tidb-data/tikv-20160/import

查看

ls

如果有:

.temp
.sst

可以清理。

但注意:

必须确认没有 restore 在运行

检查

ps -ef | grep br

确认没有。

然后:

rm -rf import/.temp/*

以及

rm *.sst

这样可以立刻释放大量空间。


第四步:检查 Region 分布

执行

pd-ctl store

capacity
available
region_count

如果出现:

某个 tikv region 特别多

说明不均衡。


第五步:开启调度

执行

pd-ctl config show

看:

region-schedule-limit
leader-schedule-limit

建议:

region-schedule-limit = 2048
leader-schedule-limit = 64

临时提升:

pd-ctl config set region-schedule-limit 2048
pd-ctl config set leader-schedule-limit 64
pd-ctl config set replica-schedule-limit 64

让 PD 重新均衡。


第六步:检查 GC life time

执行

show variables like ‘tidb_gc_life_time’;

如果是:

24h

说明:

删除数据需要等 24 小时。

可以临时改成:

10m

set global tidb_gc_life_time=‘10m’;

然后等待 GC。

磁盘会快速释放

1 个赞