掌握这两个调优技巧,让TiDB性能提速千倍!

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 本文为大家分享个推通过调优,实现TiDB千倍性能提升的实战经验。

北京冬奥会上,运动健儿们激战正酣,他们正在用速度、力量、韧性诠释更快、更高、更强的奥林匹克精神,向他们致敬!其实,在0和1的计算机世界里,开发者和程序员们为了提升系统运行速度、最大化释放服务器性能,也要面对各种各样的挑战,不断提出方案,展开实践,以突破瓶颈、解决难题。

 

个推“大数据降本提效”专题,正是通过总结分享自身在大数据实战过程中的踩坑经验、调优技巧等,为从业人员开展大数据实践提供参考。本文是“大数据降本提效”专题的第三篇,将为大家分享个推通过调优,实现TiDB千倍性能提升的实战经验。

 封面.png


 

个推与TiDB的结缘

 

作为一家数据智能企业,个推为数十万APP提供了消息推送等开发者服务,同时为众多行业客户提供专业的数字化解决方案。在快速发展业务的同时,公司的数据体量也在高速增长。随着时间的推移,数据量越来越大,MySQL已经无法满足公司对数据进行快速查询和分析的需求,一种支持水平弹性扩展,能够有效应对高并发、海量数据场景,同时高度兼容MySQL的新型数据库成为个推的选型需求。

 

经过深入调研,我们发现“网红”数据库TiDB不仅具备以上特性,还是金融级高可用、具有数据强一致性、支持实时HTAP的云原生分布式数据库。因此,我们决定将MySQL切换到TiDB,期望实现在数据存储量不断增长的情况下,仍然确保数据的快速查询,满足内外部客户高效分析数据的需求,比如为开发者用户提供及时的推送下发量、到达率等相关数据报表,帮助他们科学决策。

 

完成选型后,我们就开始进行数据迁移。本次迁移MySQL数据库实例的数据量有数T左右,我们采用TiDB自带的生态工具Data Migration (DM)进行全量和增量数据的迁移。

 

  • 全量数据迁移:从数据源迁移对应表的表结构到TiDB,然后读取存量数据,写入到TiDB集群。
  • 增量数据复制:全量数据迁移完成后,从数据源读取对应的表变更,然后写入到TiDB集群。


微信图片_20220208201637.png

个推将MySQL数据迁移到TiDB

 

当数据同步稳定之后,将应用逐步迁移到TiDB Cluster。把最后一个应用迁移完成之后,停止DM Cluster。这样就完成了从MySQL到TiDB的数据迁移。

 

注:DM的具体配置使用详见官方文档。

 

 

陷入TiDB使用的“反模式”

 

然而,当应用全部迁移到TiDB之后,却出现了数据库反应慢、卡顿,应用不可用等一系列的问题。

 

如下图:

2-登录数据库时遇到卡顿.png

登陆数据库时遇到卡顿

 

通过排查,我们发现有大量的慢SQL都是使用load导入数据的脚本。

 

3-慢SQL的导入需要耗时几十分钟.png

慢SQL的导入耗时几十分钟

 

和业务方沟通后,我们发现有些导入语句就包含几万条记录,导入时间需要耗时几十分钟。

 

对比之前使用MySQL,一次导入只需几分钟甚至几十秒钟就完成了,而迁到TiDB却需要双倍甚至几倍的时间才完成,几台机器组成的TiDB集群反而还不如一台MySQL机器。

 


这肯定不是打开TiDB的正确姿势,我们需要找到原因,对其进行优化。

 

4-服务器负载.png

单个服务器负载过高

 

通过查看监控,发现服务器负载压力都是在其中一台机器上(如上图,红色线框里标注的这台服务器承担主要压力),这说明我们目前并没有充分利用到所有的资源,未能发挥出TiDB作为分布式数据库的性能优势。

 

打开TiDB的正确使用姿势

 

首先优化配置参数

 

具体如何优化呢?我们首先从配置参数方面着手。众所周知,很多配置参数都是使用系统的默认参数,这并不能帮助我们合理地利用服务器的性能。通过深入查阅官方文档及多轮实测,我们对TiDB配置参数进行了适当调整,从而充分利用服务器资源,使服务器性能达到理想状态。

 

下表是个推对TiDB配置参数进行调整的说明,供参考:


表格.png


 

重点解决热点问题

 

调整配置参数只是基础的一步,我们还是要从根本上解决服务器负载压力都集中在一台机器上的问题。可是如何解决呢?这就需要我们先深入了解TiDB的架构,以及TiDB中表保存数据的内在原理。

 

在TiDB的整个架构中,分布式数据存储引擎TiKV Server负责存储数据。在存储数据时,TiKV采用范围切分(range)的方式对数据进行切分,切分的最小单位是region。每个region有大小限制(默认上限为96M),会有多个副本,每一组副本,成为一个raft group。每个raft group中由leader负责执行这个块数据的读&写。leader会自动地被PD组件(Placement Driver,简称“PD”,是整个集群的管理模块)均匀调度在不同的物理节点上,用以均分读写压力,实现负载均衡。

 

5-TiDB架构图.png

TiDB架构图(图片来源于TiDB官网)

 

TiDB会为每个表分配一个TableID,为每一个索引分配一个IndexID,为每一行分配一个RowID(默认情况下,如果表使用整数型的Primary Key,那么会用Primary Key的值当做RowID)。同一个表的数据会存储在以表ID开头为前缀的一个range中,数据会按照RowID的值顺序排列。在插入(insert)表的过程中,如果RowID的值是递增的,则插入的行只能在末端追加。

 

当Region达到一定的大小之后会进行分裂,分裂之后还是只能在当前range范围的末端追加,并永远仅能在同一个Region上进行insert操作,由此形成热点(即单点的过高负载),陷入TiDB使用的“反模式”。

 

常见的increment类型自增主键就是按顺序递增的,默认情况下,在主键为整数型时,会将主键值作为RowID ,此时RowID也为顺序递增,在大量insert时就会形成表的写入热点。同时,TiDB中RowID默认也按照自增的方式顺序递增,主键不为整数类型时,同样会遇到写入热点的问题。

 

在使用MySQL数据库时,为了方便,我们都习惯使用自增ID来作为表的主键。因此,将数据从MySQL迁移到TiDB之后,原来的表结构都保持不变,仍然是以自增ID作为表的主键。这样就造成了批量导入数据时出现TiDB写入热点的问题,导致Region分裂不断进行,消耗大量资源。

 

对此,在进行TiDB优化时,我们从表结构入手,对以自增ID作为主键的表进行重建,删除自增ID,使用TiDB隐式的_tidb_rowid列作为主键,将

create table t (a int primary key auto_increment, b int);

改为:

create table t (a int, b int)SHARD_ROW_ID_BITS=4 PRE_SPLIT_REGIONS=2

 

通过设置SHARD_ROW_ID_BITS,将RowID打散写入多个不同的Region,从而缓解写入热点问题。

 

此处需要注意,SHARD_ROW_ID_BITS值决定分片数量:

  • SHARD_ROW_ID_BITS = 0 表示 1 个分片
  • SHARD_ROW_ID_BITS = 4 表示 16 个分片
  • SHARD_ROW_ID_BITS = 6 表示 64 个分片

 

SHARD_ROW_ID_BITS值设置的过大会造成RPC请求数放大,增加CPU和网络开销,这里我们将SHARD_ROW_ID_BITS设置为4。

 

PRE_SPLIT_REGIONS指的是建表成功后的预均匀切分,我们通过设置PRE_SPLIT_REGIONS=2,实现建表成功后预均匀切分2^(PRE_SPLIT_REGIONS)个Region。

 

 

经验总结

 

· 以后新建表禁止使用自增主键,

考虑使用业务主键

· 加上参数SHARD_ROW_ID_BITS = 4  PRE_SPLIT_REGIONS=2

 

 

此外,由于TiDB的优化器和MySQL有一定差异,出现了相同的SQL语句在MySQL里可以正常执行,而在TiDB里执行慢的情况。我们针对特定的慢SQL进行了深入分析,并针对性地进行了索引优化,取得了不错的成效。

 

优化成果

 

通过慢SQL查询平台可以看到,经过优化,大部分的导入在秒级时间内就完成了,相比原来的数十分钟,实现了数千倍的性能提升


慢SQL优化结果.png

慢SQL优化结果

 

同时,性能监控图表也显示,在负载高的时刻,是几台机器同时高,而不再是单独一台升高,这说明我们的优化手段是有效的,TiDB作为分布式数据库的优势得以真正体现。

 

实现负载均衡.png

优化后,实现服务器负载均衡

 

 

总结

作为一种新型分布式关系型数据库,TiDB能够为OLTP(Online Transactional Processing)和OLAP(Online Analytical Processing)场景提供一站式的解决方案。个推不仅使用TiDB进行海量数据高效查询,同时也展开了基于TiDB进行实时数据分析、洞察的探索。后续更多“大数据降本提效”的干货分享,请大家持续锁定个推技术实践公众号~

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
25天前
|
存储 SQL 缓存
优化ClickHouse查询性能:最佳实践与调优技巧
【10月更文挑战第26天】在大数据分析领域,ClickHouse 以其卓越的查询性能和高效的列式存储机制受到了广泛的关注。作为一名已经有一定 ClickHouse 使用经验的开发者,我深知在实际应用中,合理的表设计、索引优化以及查询优化对于提升 ClickHouse 性能的重要性。本文将结合我的实践经验,分享一些有效的优化策略。
49 3
|
固态存储 关系型数据库 MySQL
TiDB亿级数据亚秒响应查询集群部署
TiDB亿级数据亚秒响应查询集群部署
327 0
|
3月前
|
存储 算法 Cloud Native
【PolarDB-X列存魔法】揭秘TPC-H测试背后的性能优化秘籍!
【8月更文挑战第25天】阿里巴巴的云原生数据库PolarDB-X以其出色的性能、可靠性和扩展性闻名,在多种业务场景中广泛应用。尤其在列存储模式下,PolarDB-X针对分析型查询进行了优化,显著提升了数据读取效率。本文通过TPC-H基准测试探讨PolarDB-X列存执行计划的优化策略,包括高效数据扫描、专用查询算法以及动态调整执行计划等功能,以满足复杂查询的需求并提高数据分析性能。
99 1
|
3月前
|
存储 运维 数据库
ADBPG&Greenplum成本优化问题之优化Greenplum的性能和磁盘使用如何解决
ADBPG&Greenplum成本优化问题之优化Greenplum的性能和磁盘使用如何解决
41 1
|
5月前
|
存储 NoSQL 关系型数据库
PolarDB产品使用问题之如何充分利用好产品的性能,提升并发处理能力
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
存储 Oracle JavaScript
300万数据导入导出优化方案,从80s优化到8s(实测)
300万数据导入导出优化方案,从80s优化到8s(实测)
300万数据导入导出优化方案,从80s优化到8s(实测)
|
缓存 运维 监控
Cassandra 性能压测及调优实战
掌握Cassandra分布式数据库性能压测及性能调优 作者:孤池
3876 1
Cassandra 性能压测及调优实战
|
关系型数据库 测试技术 OLTP
「NewSQL技术」Greenplum 6中的OLTP负载性能提升60倍以上
「NewSQL技术」Greenplum 6中的OLTP负载性能提升60倍以上
|
关系型数据库 MySQL
《HTAP能力持续增强 HybridDB for MySQL分析性能提升》电子版地址
HTAP能力持续增强 HybridDB for MySQL分析性能提升
240 0
《HTAP能力持续增强 HybridDB for MySQL分析性能提升》电子版地址
|
SQL 存储 关系型数据库
OceanBase 4.0解读:从TPC-H性能测评看4.0与3.x差异
OceanBase 4.0解读:从TPC-H性能测评看4.0与3.x差异
685 0
OceanBase 4.0解读:从TPC-H性能测评看4.0与3.x差异
下一篇
无影云桌面