tidb热点写

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.9
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
1、20服务,每次攒批1000,写tidb热点,tikv实例6到24都验证过,只有3个region打满400MB IO
2、去掉分区、索引,联合主键(id,ds),只保留主键id auto_random 也有热点
3、只保留主键id auto_random 也有热点 ,split预分region也有热点

4、计算了一下,单条大概6K,按照总的4w/s,预估一下,单个region 96MB,计划1w条一个region。只保留自增主键AUTO_INCREMENT,split按照id范围切分。热点缓解很大,单个tikv基本都有150MB+ IO
SPLIT PARTITION TABLE xx BETWEEN (0) AND (10000000) REGIONS 1000;

5、现实情况,需要ds分区,建分区表后,主键为(id,ds)
切分命令:SPLIT PARTITION TABLE xx BETWEEN (40000000,‘2024-05-20’) AND (50000000,‘2024-05-30’) REGIONS 1000;

求问:
1、目前没搞明白联合主键组成的row id含义,怎么确实是不是切分的还是1w个id一个region,start、end key 如:t_863_r_040000000002faa2600419b37b7e | t_863_r_040000000002fac9700419b37b83

2、还有其他攒批,单条较大热点写较好优化方案?

【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

有点热点也没啥事儿吧,你的单台机器如果能扛得住这个热点写那也没什么问题啊。

分批次写入不行的话,考虑建索引,提升硬件性能

https://docs.pingcap.com/zh/tidb/stable/shard-row-id-bits#shard_row_id_bits 这个有配置吗?

auto_random这个搞了之后,热点就分散了,你分了多个片,或者说是 [shard_row_id_bits] 设成多少了?

设置这个SHARD_ROW_ID_BITS分片参数试试,缓解写热点,默认为0,表示1个分片

1、 SHARD_ROW_ID_BITS 好像只试用于主键或没有主键的表,我们测试配合我们主键使用不太行

目前进展:
1、spit限制单个region 插入行数1w,避免同一个region一直写入造成热点,性能可以满足,但是看id、ds主键情况下切分region底层分布和预想有区别。想了解更多多主键切分情况

2、排查出auto_random测试攒批写还有热点,是业务侧攒批更改不生效,还是一批5000,改小攒批条数,热点可以解决,但是也遇到新问题,需要返回主键id,但是出现返回都是0情况,已经另外开了个问题讨论

试试shard_row_id_bits和pre_split_regions结合使用
https://docs.pingcap.com/zh/tidb/stable/sql-statement-split-region#pre_split_regions

  1. 联合主键的Row ID:在TiDB中,当使用联合主键时,行的唯一标识符(Row ID)实际上是基于联合主键的排序生成的。这意味着如果主键由(id, ds)组成,那么Row ID的分配将基于这对值的组合排序。因此,如果id是自增的且ds有一定的规律性(例如日期),那么可能会导致写入分布不均,形成热点。
  2. 判断是否按照预期切分:从你提供的startend key格式来看,这是TiDB内部用于表示Region边界的键值。直接从这些键值判断是否精确按照每1万ID切分可能比较困难,因为它们是编码后的键值对。为了确认实际的切分情况,你可以使用pd-ctl工具或者TiDB Dashboard来查看具体的Region分布情况。在pd-ctl中,可以使用region相关的命令来查看特定Region的信息,包括其开始和结束的key范围。