TiDB 4.0 为解决热点问题做了哪些改进?
作者:李坤 热点问题概述 一直以来,TiDB 的数据访问热点问题,是用户比较关注的问题。为什么这个问题如此突出呢?这其实是“分布式”带来的结构效应。单机数据库由于只有一个节点,是不存在热点问题的(因为性能的上限就是单机的处理能力),而分布式数据库集群存在多个节点,在达到存储扩展、读写能力扩展的目的上,我们希望大量的读写压力能够平摊在每个节点上,TiDB 也一直在朝着这个目标靠近。 数据库也存在二八原则,80% 的读写在 20% 的最新数据上,以使用最广泛的 MySQL 为例,很多从 MySQL 迁移到 TiDB 的业务,迁移前会使用自增主键,将随机写转为顺序写提高性能。而这种方式,在写入 QPS 较大的 TiDB 集群上,会造成写入热点,原因是 TiDB 使用 range 的方式来进行数据分片,导致新写入的数据集中在一个 range 范围所在的节点,对于这部分写入就会退化成单机的写入性能,未能利用分布式读写扩展的优势。 直面问题 为了解决这些问题,TiDB 在很早之前的 2.0 版本就开始设法改进,这就是新增的表属性 SHARD_ROW_ID_BITS,它的原理是将自动生成的主键在二进制的高几位进行一个位翻转从而将单调递增的 ID 转化为一定范围内的随机 ID,来达到自动将写入数据的压力分摊到不同节点,由于多数业务对于主键通常只需要不重复而不是单调递增