0
1
3
0
专栏/.../

记一次因 GC bug 导致 TiKV 存储占用不均的问题处理

 OnTheRoad  发表于  2022-12-29

1. 问题描述

1.1. 环境描述

选项 选项值
OS 版本 CentOS 7.9
TiDB 版本 v5.3.0
部署模式 各组件独立部署
集群名称 kruidb
TiDB 节点 x3
PD 节点 x3
TiKV 节点 x3

1.2. 问题现象

1.2.1. Dashboard 日志

Dashboard 存在大量 ERROR 级别的关于 gc worker 的报错日志,内容如下:

[gc_worker.go:713] ["[gc worker] delete range failed on range"] [uuid=60a807a27f00012] [startKey=7480000000000017ac] [endKey=7480000000000017ad] [error="[gc worker] destroy range finished with errors: [unsafe destroy range failed on store 1: gc worker is too busy unsafe destroy range failed on store 3: gc worker is too busy unsafe destroy range failed on store 2: gc worker is too busy]"]

1.2.2. TiKV 空间占用不均

Grafana 监控面板(路径:kruidb-PD->Statistics-balance)显示 3 个 TiKV 节点空间占用相差较大。

image.png

2. 问题分析

2.1. 系统视图查看 region 分布

mysql> SELECT t1.store_id,
              sum(case when t1.is_leader = 1 then 1 else 0 end) leader_cnt,
              count(t1.peer_id) region_cnt
         FROM information_schema.tikv_region_peers t1
        GROUP BY t1.store_id;
+----------+------------+------------+
| store_id | leader_cnt | region_cnt |
+----------+------------+------------+
|        1 |      27292 |      81867 |
|        2 |      27292 |      81867 |
|        3 |      27292 |      81867 |
+----------+------------+------------+
3 rows in set (0.00 sec)

通过系统视图 information_schema.tikv_region_peers 可查看各个 TiKV 节点中 Leader 与 Region 副本的分布情况。由结果可知,各 TiKV 节点中 Leader 与 Region 副本数量分布均匀。

2.2. 监控面板查看 region 分布

通过 Grafana 监控面板(路径:kruidb-Overview->TiKV),可查看各个 TiKV 节点中 Leader 与 Region 副本的分布情况。面板显示与系统视图 information_schema.tikv_region_peers 结果一致。

image.png

2.3. 系统视图 gc_delete_range

  1. mysql.gc_delete_range 执行了 drop/truncate 后,需要被 GC worker 定期物理删除的 Key-Value 范围段;
  2. mysql.gc_delete_range_done 已经被 GC worker 物理删除的 Key-Value 范围段。
mysql> SELECT COUNT(1) FROM mysql.gc_delete_range;
+----------+
| COUNT(1) |
+----------+
|     8135 |
+----------+
1 row in set (0.01 sec)

系统视图显示存在大量需要被物理删除,而由于 GC worker 失败未删除的数据。

2.4. 查看 store 评分

通过 Grafana 监控面板(路径:kruidb-PD->Statistics-balance),可查看各个 TiKV 节点 Leader 与 Region 评分。PD 调度器会优先将 Leader 与 Region 调度到评分较低的 TiKV 节点中。

面板显示,各个 TiKV 节点的 Leader 评分较均衡。而 store-2 与 store-3 因空间不足,Region 评分较高。

image.png

3. 问题处理

通过以上各系统视图与监控面板初步判断,由于 GC Woker 执行失败,导致大量本应物理删除的数据,未被物理删除,从而占用大量存储空间。

通过查询 ASKTUG,断定由于触发 GC bug #11903 ,原文链接:TiDB 节点大量[gc worker] delete range failed 报错信息

  1. 临时解决方案:可通过禁用 gc.enable-compaction-filter,并重启集群。
  2. 永久解决方案:升级 TiDB 集群版本,永久解决。

3.1. 禁用 gc.enable-compaction-filter

  1. 在线修改 TiKV 配置
mysql> SET CONFIG tikv gc.enable-compaction-filter=false;
  1. 修改持久化配置文件

为避免 SET CONFIG 在线修改的配置,被 tiup reload 所覆盖。需要修改持久化配置文件。

[tidb@tiup-console ~]$ tiup cluster edit-config kruidb

server_configs:
  tikv:
    gc.enable-compaction-filter: false
[tidb@tiup-console ~]$ tiup cluster reload kruidb
[tidb@tiup-console ~]$ tiup cluster stop  kruidb
[tidb@tiup-console ~]$ tiup cluster start kruidb

3.2. 增加调度

调整 PD 调度参数,以提高调度速度。

[tidb@tiup-console ~]$ find ./ |grep pd-ctl
./.tiup/components/ctl/v5.3.0/pd-ctl

[tidb@tiup-console ~]$ tiup ctl:v6.1.0 pd -u http://192.168.72.11:2379 -i
## 1. 查看 scheduler 配置
» config show scheduler
{
  "replication": {
    "enable-placement-rules": "true",
    "enable-placement-rules-cache": "false",
    "isolation-level": "",
    "location-labels": "",
    "max-replicas": 3,
    "strictly-match-label": "false"
  },
  "schedule": {
    "enable-cross-table-merge": "true",
    "enable-joint-consensus": "true",
    "high-space-ratio": 0.7,
    "hot-region-cache-hits-threshold": 3,
    "hot-region-schedule-limit": 4,
    "hot-regions-reserved-days": 7,
    "hot-regions-write-interval": "10m0s",
    "leader-schedule-limit": 4,
    "leader-schedule-policy": "count",
    "low-space-ratio": 0.8,
    "max-merge-region-keys": 200000,
    "max-merge-region-size": 20,
    "max-pending-peer-count": 64,
    "max-snapshot-count": 64,
    "max-store-down-time": "30m0s",
    "max-store-preparing-time": "48h0m0s",
    "merge-schedule-limit": 8,
    "patrol-region-interval": "10ms",
    "region-schedule-limit": 2048,
    "region-score-formula-version": "v2",
    "replica-schedule-limit": 64,
    "split-merge-interval": "1h0m0s",
    "tolerant-size-ratio": 0
  }
}
»

## 2. 提高 Leader 调度器数量
» config set leader-schedule-limit 8

## 3. 提高 region 调度器数量
» config set region-schedule-limit 4096

3.3. 结果验证

12小时候,检查 Grafana 各监控面板,多个 TiKV 节点存储空间占用已达到均衡,且空间占用由原来的 3T 下降到 500G。

0
1
3
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论