救命!DBA找上门了,数据库cpu飙到60%

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 这篇文章讲述了作者如何通过优化数据库查询和引入二级缓存架构,成功解决了数据库CPU使用率规律性飙升的问题,提高了系统稳定性。

一、背景

有一天,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使用率,提高数据库的稳定性

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

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

image.png

相关实践学习
基于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
相关文章
|
6月前
|
数据库 SQL Cloud Native
DBA福利:云原生分布式数据库 PolarDB-X 操作指南
【6月更文挑战第2天】简述如何使用PXD工具一键安装PolarDB-X操作
72074 10
|
7月前
|
缓存 关系型数据库 分布式数据库
PolarDB常见问题之数据库cpu突然飙高如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
Oracle 关系型数据库 Linux
解决在linux服务器上部署定时自动查找cpu,内存,磁盘使用量,并将查询结果写入数据库的脚本,只能手动运行实现插库操作
问题描述:将脚本名命名为mortior.sh(以下简称mo),手动执行脚本后查询数据库,表中有相应的信息,放入自动执行队列中,脚本被执行,但是查询数据库,并没有新增数据。
86 0
|
6月前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之在一个集群上创建多个数据库实例,是否可以做cpu和内存的配额指定
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
7月前
|
安全 JavaScript Java
私房菜|私房菜定制上门服务系统|基于springboot+vue私房菜定制上门服务系统设计与实现(源码+数据库+文档)
私房菜|私房菜定制上门服务系统|基于springboot+vue私房菜定制上门服务系统设计与实现(源码+数据库+文档)
97 0
|
7月前
|
SQL BI 数据库
数据库慢查询:DBA的挑战与应对策略
NineData的慢查询分析功能。它可以自动采集并记录数据库中的所有慢查询,比较亮眼的是它通过对每一条慢查询进行性能诊断,最终提供优化建议,包含添加或修改索引、调整表结构等,同时还可以根据业务类型配置SQL开发规范,配置完成后,系统还会基于这些规范诊断慢SQL。
1062 2
数据库慢查询:DBA的挑战与应对策略
|
7月前
|
存储 SQL 关系型数据库
探索数据库的世界:DB、DBMS、DBA、DBS的全面介绍
探索数据库的世界:DB、DBMS、DBA、DBS的全面介绍
977 0
|
数据库 数据库管理 OceanBase
OceanBase数据库中,角色的权限是由数据库管理员(DBA)设置的
OceanBase数据库中,角色的权限是由数据库管理员(DBA)设置的
164 1
|
运维 关系型数据库 MySQL
MySQL DBA的必备参考,两位数据库资深专家呕心沥血之作
互联网发展至今,开源软件已经深入人心,并且受到广泛的支持和响应,很多公司在使用开源软件的同时也输出了一些好的开源产品。MySQL 作为当今世界.上最受欢迎的开源数据库产品之一,在很多互联网企业里起到了不可或缺的作用。由于MySQL的诸多特性,比如开源免费、灵活、轻量简单且越来越多的企业开始使用MySQL,在业界诞生了一大批相关从业者,他们研究MySQL的原理,探讨MySQL的架构,完善MySQL的运维,丰富MySQL的工具,促进MySQL的发展,我们称这些人为MySQL DBA,而本人也是其中之一,深感荣幸。
|
运维 关系型数据库 MySQL
GitHub无抗手!MySQL DBA攻坚指南一出,阿里数据库专家都解脱了
大家可能并不觉得,数据库其实非常重要,每个业内巨头,每个成熟的互联网产品都有多个数据库系统,能保证大量并发场景下不出错,并非易事。尤其是银行、电商、电信、电力、航空等实时交易重要的环境中,可靠的数据库是重中之重,稳定压倒一切。