TiDB数据库热点问题诊断与处理(使用AUTO_RANDOM)
Tags: AUTO_RANDOMTiDB热点
使用 AUTO_RANDOM
处理自增主键热点表,适用于代替自增主键,解决自增主键带来的写入热点。
使用该功能后,将由 TiDB 生成随机分布且空间耗尽前不重复的主键,达到离散写入、打散写入热点的目的。
注意 TiDB 生成的主键不再是自增的主键,可使用 LAST_INSERT_ID()
获取上次分配的主键值。
将使用 sysbench 工具模拟数据的并发插入,并采用 AUTO_RANDOM 选项来尝试打散热点。
未优化前
采用 sysbench 模拟并发批量写入数据,此过程时间较长(15 min 左右),如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | yum install -y sysbench create database sbtest; sysbench /usr/share/sysbench/oltp_common.lua --time=300 --mysql-host=172.17.0.4 --mysql-port=4000 --mysql-user=root --mysql-db=sbtest --table-size=20000000 --tables=1 --threads=32 --events=999999999 prepare MySQL [sbtest]> show create table sbtest1; +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | sbtest1 | CREATE TABLE `sbtest1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=13644579 | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.05 sec) |
通过 TiDB Dashboard 中的流量可视化图观察热点情况,发现热点分布不均衡:
优化后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | cp /usr/share/sysbench/oltp_common.lua /usr/share/sysbench/oltp_common1.lua 修改文件内容,使用AUTO_RANDOM: query = string.format([[ CREATE TABLE sbtest%d( id bigint(20) NOT NULL AUTO_RANDOM(5), k INTEGER DEFAULT '0' NOT NULL, c CHAR(120) DEFAULT '' NOT NULL, pad CHAR(60) DEFAULT '' NOT NULL ,PRIMARY KEY (id) )]], sysbench /usr/share/sysbench/oltp_common1.lua --time=300 --mysql-host=172.17.0.4 --mysql-port=4000 --mysql-user=root --mysql-db=sbtest --table-size=20000000 --tables=1 --threads=32 --events=999999999 prepare MySQL [sbtest]> show create table sbtest1; +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | sbtest1 | CREATE TABLE `sbtest1` ( `id` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=374886 */ | +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.20 sec) |
再次通过 TiDB Dashboard 中的流量可视化图观察热点情况,发现本次实验热点分布均衡:
由流量图可见,使用 AUTO_RANDOM
代替 AUTO_INCREMENT
能很好地打散热点。