tidb热点表问题分析报告
一、背景:
1、 生产tidb集群正常情况下延迟平均在1秒以下,异常期间突增到2秒多,如下图所示。

2、 生产业务出现的Java 数据库连接池活动连接数告警。
二、故障分析:
1、 异常期间采样分析没有发现明显性能sql问题和数据库并发问题。
2、 没有发现硬件负载异常问题,不存在性能瓶颈。
3、 经过集群延迟异常期间的采样分析,生产tidb集群出现热点表(trajectory_push_success)问题,如下图所示:

4、 异常期间,出现读线程池cpu负载100%的情况(每台服务器2个kv节点,每个tikv节点分配15核)。

三、故障原因:
1、表象原因分析:扫描业务数据库的trajectory_push_success表在kv节点出现热点表问题,导致该节点的读线程池负载100%。因此该kv节点上的运单中台业务的表出现读取响应慢。
2、深层次原因分析:
trajectory_push_success表在该时间段读流量很高,该表存在读数据倾斜,且表为自增主键聚簇表,导致新数据分配主键时是按照顺序分配的,这样会导致某个kv节点上的数据过于集中,占用线程池资源。
四、解决方案:
1、修改trajectory_push_success表的主键将auto_increment 主键改为auto_random主键,这样会将新写入数据随机分配主键并打散分配到不同的kv节点,避免出现热点表问题。
2、对tidb集群的热点表做监控,针对每分钟出现大于1G写入的热点表进行监控告警。
3、形成tidb建表规范,对主键要求不高业务建立随机主键。