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

本文涉及的产品
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 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
相关文章
|
9天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
12天前
|
SQL 缓存 监控
数据库性能优化指南
数据库性能优化指南
|
15天前
|
缓存 监控 NoSQL
数据库如何进行性能优化?
【10月更文挑战第31天】数据库如何进行性能优化?
25 3
|
20天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
33 1
|
30天前
|
监控 Oracle 关系型数据库
Oracle数据库性能优化
【10月更文挑战第16天】Oracle数据库性能优化是
27 1
|
1月前
|
SQL 存储 数据库
慢SQL对数据库写入性能的影响及优化策略
在数据库管理系统中,慢SQL(即执行缓慢的SQL语句)不仅会影响查询性能,还可能对数据库的写入性能产生不利影响
|
3月前
|
开发者 UED Java
Play Framework惊天秘密:如何让异常处理优雅得像芭蕾舞?
【8月更文挑战第31天】在Web应用开发中,异常处理至关重要,直接影响应用稳定性和用户体验。Play Framework作为轻量级Java Web框架,提供了基于Scala偏函数的灵活异常处理机制。通过实现`HttpErrorHandler`接口可定义全局异常逻辑,而在控制器中使用try-catch块则能捕获特定异常。定义自定义异常类也有助于表示特定错误情况。最佳实践包括保持处理一致性、提供有用错误信息、记录日志及分类处理异常。掌握这些技巧,能使Play应用更健壮可靠。
65 1
|
3月前
|
缓存 前端开发 JavaScript
Rails应用慢如蜗牛?揭开数据库到前端的全方位性能优化秘籍,从此告别龟速加载!
【8月更文挑战第31天】本文探讨了Ruby on Rails应用的性能优化方法,涵盖数据库查询与前端渲染。通过具体代码示例,介绍了如何使用`includes`避免N+1查询问题,利用缓存机制提高效率,以及通过合并和压缩CSS及JavaScript文件优化前端渲染。这些技巧有助于全面提升应用性能和用户体验。
51 1
|
3月前
|
开发者 存储 API
Xamarin 开发者的社区资源概览:从官方文档到GitHub示例,全面探索提升开发技能与解决问题的多元化渠道与实用工具
【8月更文挑战第31天】Xamarin 开发者社区资源概览旨在提升开发效率与解决问题,涵盖官方文档、社区论坛、GitHub 项目等。官方文档详尽,涵盖 Xamarin.Forms 使用、性能优化等;社区论坛供交流心得;GitHub 提供示例代码。此外,第三方博客、视频教程及 Xamarin University 等资源也丰富多样,适合各阶段开发者学习与提升。通过综合利用这些资源,开发者可不断进步,应对技术挑战。
48 0
|
3月前
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
211 0