记录线上数据库飙升到60%的性能优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 有一天,dba在数据库告警群找到我,说我们数据库CPU有规律性的尖刺,qps每次突然增加500+,尖刺时cpu飙升到60%,没尖刺时只有5%左右

一、背景

有一天,dba在数据库告警群找到我,说我们数据库CPU有规律性的尖刺,qps每次突然增加500+,尖刺时cpu飙升到60%,没尖刺时只有5%左右

image.png

这种情况对系统造成的稳定性风险极高,要我们尽快排查,尽早排除隐患。下面是当时的数据库qps监控

image.png

二、排查与沟通过程

由于是规律性的尖刺,我们想到我们的定时job, 我们业务有一个业务配置缓存数据,通过Java程序的定时job从数据库加载到本地内存的,而且时间也吻合。

通过查看代码,我们是一个单机的job每,5分钟加载一次,每台机器都是分页从数据库读取配置数据,每次读取100条,然后写到本地的内存里。

这里有两个问题,单机的job和分页查询,我们生产环境有50台机器,这样查询db的qps会放大,造成数据库压力扩大。

和dba进行了沟通,dba给了我们两条建议:

1、要我们不要分页查询,直接一次性查询所有的配置数据。

2、不要用本地缓存,直接使用redis,这样就一份数据,操作数据库的qps也降低了。

三、第一次优化

由于是c端系统,而且业务配置缓存是系统的热点数据,考虑到系统稳定性第一,我们第一次没有大的改动,试图调高了分页的limit大小,观测数据库的监控,cpu使用率有下降,但是还是有尖刺,这样还有慢sql情况。

image.png

四、第二次优化

由于尖刺仍然存在,对数据库还是有一定的压力,且现在的方案存在优化空间,为了彻底消除数据库隐患,因此我们开始了第二轮优化。

我们需要解决的问题:

1、降低数据库qps,消除cpu尖刺

2、不影响查询热点配置数据的性能

因为每台机器都请求数据库,分页查询请求,我们想着降低请求qps,因此我们去除原来这种单机定时加载缓存方式,换成加载缓存到redis,这样就只要一台机器启动一个定时任务了,这样可以降低数据库的qps。由一个定时任务每5分钟执行一次,加载到redis。

不影响原来的查询性能,肯定不能直接查询redis,因此我们引入了本地缓存框架Caffine,本地缓存从redis查询数据。这样就形成了二级缓存架构

image.png

整个缓存改造涉及三个阶段:

第一阶段:使用xxljob定时job加载缓存到redis

image.png

第二阶段:程序启动初次加载缓存,加载数据到本地缓存

image.png

第三阶段:Caffine缓存未命中场景,单线程从缓存或者数据库加载

image.png

五、测试与上线流程

这次属于技术升级,需要测试回归相关业务才能上线,整体测试与上线流程如下:

  • 1、测试回归业务功能,开关验证

  • 2、灰度验证

  • 3、分机器发布

  • 4、全量发布

先发布一台机器节点,观测了几天业务情况,观测没问题之后再分批次发布,直到所有机器节点发布完成。

六、最终效果

经过优化上线,数据库的qps和cpu使用率下来了,也没有了尖刺,彻底消除了数据库隐患。

image.png

七、总结

数据库是业务系统强依赖的中间件,保障其稳定性至关重要,本文是根据实际性能优化经验,从架构设计代码层面优化数据库的使用,降低数据库qps和cpu使用率,提高数据库的稳定性

通过这次优化实践,给以后业务功能的设计开发也有一定的启发,一个好的方案设计可以避免系统风险,提高资源利用率,作为程序员可以利用每次新功能的设计开发经验,不断的积累比较好的方案,提升我们自身的能力。

坚持相信有输入一定要有输出,我们一起学习沉淀技术,希望我们的技术能力越来越强。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
关系型数据库 MySQL 数据库
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
深入MySQL数据库进阶实战:性能优化、高可用性与安全性
232 0
|
9月前
|
存储 缓存 NoSQL
数据库性能优化中的缓存优化
数据库性能优化中的缓存优化
|
11天前
|
存储 SQL BI
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
毫秒级查询性能优化实践!基于阿里云数据库 SelectDB 版内核:Apache Doris 在极越汽车数字化运营和营销方向的解决方案
|
1月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(上)
后端接口性能优化分析-数据库优化
127 0
|
1月前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
|
2天前
|
SQL 存储 关系型数据库
深入理解MySQL:数据库管理与性能优化
第一章:MySQL基础 MySQL概述:简要介绍MySQL的历史、特点和应用领域
|
2天前
|
SQL 关系型数据库 MySQL
精通MySQL:从数据库管理到性能优化
第一章:MySQL入门 MySQL简介:了解MySQL的起源、发展历程以及在Web开发中的重要性
|
2天前
|
关系型数据库 MySQL 数据库
精通MySQL:数据库管理、性能优化与最佳实践
h3> 一、引言 MySQL是一个功能强大的开源关系型数据库管理系统,广泛应用于各种Web应用、企业级应用和数据分析等领域
|
11天前
|
存储 缓存 分布式数据库
数据库性能优化方向的三大类别
【6月更文挑战第6天】本文介绍了数据库优化策略,包括集中式数据库的反规范化设计(如增加冗余列、派生列、重组合表、水平和垂直分表)和数据一致性保障;这些方法旨在提升性能、确保数据安全和适应大规模数据场景。
33 1
数据库性能优化方向的三大类别
|
12天前
|
存储 SQL 缓存
Java性能优化(十)-数据库调优-数据库参数设置优化
Java性能优化(十)-数据库调优-数据库参数设置优化
15 0