数据库锁死,连接池被不可用故障回顾

在双十一高峰前,新功能上线导致服务不可用,数据库连接池耗尽。排查发现计算排行榜的SQL长时间占用连接,原本缓存数据的实时计算触发问题。解决方案是优化代码并避免复杂SQL实时计算。此事件强调了灰度测试、缓存管理和风险意识的重要性。
摘要由CSDN通过智能技术生成

故障描述

1.双十一高峰前的新功能上线,距离封版还有两天时间,准备把新功能版本数据上线。测试环境已测试通过,准备上线,开始灰度环境验证,也是没问题。检查数据也是正常,开始正式发布,因为排名需要重新计算,清除生产缓存数据。过了10分钟监控开始报警,服务不可用,db数据库也开始报警,数据库连接池配置200,一启动完成数据库连接池就被用完。

故障排查

首先想到是新功能版本代码的问题,马上联系运维,代码回滚到历史正常的版本,开始观察。发现服务已经起不来了。连续dba查看数据库连接情况,发现数据库已经连不上了,只能重启数据库。数据库启动完成之后再次启动服务,已经可以正常启动,先启动一个节点,发现数据库连接又全部占用。服务又可用。归滚,重启大法都无效!!!!
第一次开始想到是分布式锁的问题,是不是锁时间太长,执行的事务没有释放,先排查代码。
同步查看监控慢sql,运维开始查占用连接的执行的sql,最后发现是计算排行榜的SQL执行一直占用连接。问题定位到开始排查代码,排名榜的数据一直都是做T+1计算,为啥这次会出这个问题,开始review代码。发现排行榜数据读的是缓存数据,缓存不存在开始计算排行榜数据。 这里是巨大坑,不应该在此计算,sql在数据量较少时候并没有发现问题,(数据每月/100多万)现在数据量已经到700多万的数据。再次检查其实这里代码是存在很多问题,缓存失效,sql复杂,也是迟早会暴露出来。一次缓存删除导致问题提前暴露出来。
从问题发现到解决花了两个多小时时间,活生生的经验啊。

问题解决

首先把计算逻辑先干了,不做复杂sql排名操作,优化代码。

总结

  • 类似排名或者其他复杂的sql,但在前期这块的设计上没有把关好,没意识到这里的风险,服务的请求应该是的结果数据,不应该实时去计算。
  • 风险意识需要加强,功能灰度是十分必要的。
  • 生产缓存数据设计一定要思考好,哪些是能删除哪些不能随意删除,不能随意删除生产缓存数据。
  • 发版风险没管控好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值