TIDB 发现写入热点问题

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【TiDB 版本】
v4.0
【问题描述】

  1. 我们发现TIDB 在写入时出现3个节点写入load 非常高,但是其他4个节点几乎没有写入
  2. 我们查询文档发现可能是由于我们的一张热点表是联合唯一主键,的隐氏自增row_id 导致的单个region 写入过与集中,因此我们使用命令 “ALTER TABLE wap_quality_agg_daily_v2 SHARD_ROW_ID_BITS = 4;” 将数据打散,但是后期发现没有效果,希望能够获取社区帮助谢谢
  3. 我们发现有是哪个TIKB 节点的load score 非常高但是这三个tikv的磁盘都一样大,可用空间都没达到上下线,不知道会不会是这边的原因导致的

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

1.热点region:

通过 sql 查询热点 region:
select * from information_schema.TIDB_HOT_REGIONS;

查询热点region上有哪些表和索引,10080是你的tidb status port, regionID 是上面查到的热点regionId:
curl http://{TiDBIP}:10080/regions/{RegionId}

也要看看唯一索引或者其他索引会不会造成热点问题。

  1. SHARD_ROW_ID_BITS 打散 rowID

使用 “ALTER TABLE wap_quality_agg_daily_v2 SHARD_ROW_ID_BITS = 4;” 后,新插入生成的rowId是打散的,但是要配合 split region才能取得理想的效果。

不打散情况下 rowid 从 0 开始增加,在插入数据量不大的情况下已经插入的 rowid不会很大。
但是打散后,根据生成算法产生的 rowid 很多是较大的值,所以这些较大的值有可能也是落在同一个 region 上面,热点问题仍然存在。

没有split情况下,在插入一定时间后,region 数据多进行分裂,应该也可以解除热点问题的,只不过要一定的时间。

3.从磁盘使用上来看,空间利用率都不算高,各个 store region size 不够均匀,是不是因为热点 region 问题,没有进行调度呢

通过 pd-ctl 命令 scheduler show 看下 balance-region-scheduler 是否有打开

  1. 通过 select * from information_schema.TIDB_HOT_REGIONS where type = ‘write’
    发现热点表基本都在 “wap_quality_agg_daily_v2” 上面
    这张表是分区表,按月range 分区的也就是每个月的数据都会写在一个分区立面,不知道这个会不会是导致热点问题的原因
  2. 确实只做了SHARD_ROW_ID_BITS = 4 没有split但是数据写到现在已经24小时了,热点问题仍然存在
  3. balance-region 是已经打开的
    [tidb@tidb-sj1-pd-1 ~]$ tiup ctl pd -u http://10.247.129.184:2379 scheduler show
    Starting component ctl: /home/tidb/.tiup/components/ctl/v4.0.11/ctl pd -u http://10.247.129.184:2379 scheduler show
    [
    “balance-hot-region-scheduler”,
    “balance-leader-scheduler”,
    “balance-region-scheduler”,
    “label-scheduler”
    ]
  4. 我们现在停止写入这张表wap_quality_agg_daily_v2了,然后发现热点问题就消失了

这里主要问题我觉得可能是对于热点region没有调度,实际上wap_quality_agg_daily_v2表的数据已经分散在30+个region上了,压力也不是集中在一个或者极少个region上。

这些wap_quality_agg_daily_v2的region还是集中在其中的三个tikv,balance-region-scheduler可能因为是热点 region 没有对它们进行调度,所以一直是这样子,store的region size 也不够均匀。

目前把写balance-region-scheduler停了,是否在开始慢慢对balance-region-scheduler表的region进行调度了呢。

也可以通过 pd-ctl 手动调度 balance-region-scheduler 的region吧,调度到其他store上面。

尝试下开启 HOT-REGION-SCHEDULER 调度器呢

zhe’g这个应该就是的吧

是这个,开启后怎么样了?

这个一直都是开启的,没有动过

关闭写 wap_quality_agg_daily_v2 后,region 有调度吗?

貌似没有看到HOT-REGION-SCHEDULER 的调度

不知道是不是系统bug ,有没有啥方法可以手动触发这个HOT-REGION-SCHEDULER

还有个地方就是这边的balance score 和 region size 差异比较大,不知道这个 :scatter-range-scheduler

curl -X POST http://{TiDBIP}:10080/tables/{db}/{table}/scatter

可不可以解决这个分数的问题

scatter-range-scheduler 对于pd统计出来的 hot region 也是不会进行调度的,应该没什么效果。

要不打开 pd debug 日志,看看是不能找到线索

打开 pd -> scheduler -> balance region scheduler面板 region-hot 项是不是值很大。

加这个面板看看

sum(delta(pd_scheduler_event_count{instance="$instance", type=“balance-hot-region-scheduler”}[5m])) by (name)

您好,热点问题还存在吗

解决了么

如果有类似问题的话,可以创建新的帖子哈

使用后确实平衡了一些但是写入还是有热点,最终还是系统重装了才解决

请问重装是指重现创建了新的表结构,增加 share rowid bites 和 presplit region 么 ?

增加 share rowid bites 和 presplit region 不行,scatter 也不行都试了,最终是TIDB数据备份然后重装了

重装 TiDB 么?还是重建表了?

这个代价太大了…