报告老板:这次的缓存事故是这样的...
事故背景
公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用户和代理商投诉了。老板让我带同事们一起复盘这次线上事故。
什么原因造成的?
抢购活动计划是零点准时开始,
22:00 运营人员通过后台将商品上线
23:00后台小哥已经将商品导入缓存中,提前预热
抢购开始的瞬间流量非常大,按计划是通过Redis承担大部分用户查询请求,避免请求全部落在数据库上。
如上图预期大部分请求会命中缓存,但是由于后台小哥预热缓存的时候将所有商品的缓存时间都设置为2小时过期,所有的商品在同一个时间点全部失效,瞬间所有的请求都落在数据库上,导致数据库扛不住压力崩溃,用户所有的请求都超时报错。
实际上所有的请求都直接落到数据库,如下图:
什么时候发现的?
凌晨01:02 SRE 收到系统告警,登录运维管理系统发现数据库节点 CPU和内存飙升超过阈值,迅速联系后台开发人员定位排查。
为什么没有早点发现?
由于缓存设置过期时间是2小时,凌晨1点前缓存可以命中大部分请求,数据库服务处于正常状态。
发现时采取了什么措施?
后台小哥通过日志定位排查发现问题后,进行了一系列操作:
首先通过API Gateway(网关)限制大部分流量进来
接着将宕机的数据库服务重启
再重新预热缓存
确认缓存和数据库服务正常后将网关流量正常放开,大约01:30 抢购活动恢复正常。
如何避免下次出现?
这次事故的原因其实就是出现了缓存雪崩,查询数据量巨大,请求直接落到数据库上,引起数据库压力过大宕机。
在业界解决缓存雪崩的方法其实比较成熟了,比如有:
均匀过期
加互斥锁
缓存永不过期
(1)均匀过期
设置不同的过期时间,让缓存失效的时间点尽量均匀。通常可以为有效期增加随机值或者统一规划有效期。
(2)加互斥锁
跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程阻塞排队。
(3)缓存永不过期
跟缓存击穿解决思路一致,缓存在物理上永远不过期,用一个异步的线程更新缓存。
复盘总结
通过与同事复盘这次线上事故,大家对于缓存雪崩有了更深刻的理解。为了避免再次出现缓存雪崩事故,大家一起讨论了多个解决方案:
(1)均匀过期
(2)加互斥锁
(3)缓存永不过期
希望技术人能够敬畏每一行代码!
往期推荐
《大厂内部资料》Redis 性能优化的 13 条军规!全网首发
2020-03-24
惊呆了,竟然可以用这种方式秒建Redis集群?
2020-03-26
史上最全的 SQL 优化方案!建议收藏
2020-04-13
关注我,每天陪你进步一点点!
报告老板:这次的缓存事故是这样的...相关推荐
- 报告老板,微服务高可用神器已祭出,您花巨资营销的高流量来了没?
来自:码大叔 我得意地来到老板的办公室:"报告老板,高可用神器已祭出,您花巨资营销的高流量什么时候到?" 老板呵呵一声:"高流量下周一来报道,你可以准备下和他做工作交接了 ...
- 8月14日云栖精选夜读 | 报告老板!这个阿里程序员每天上班就看别人接吻
我叫吉恒杉,29岁,是一名"吻戏鉴定师". 和女朋友刚谈恋爱的时候,我说我的工作是训练计算机识别出吻戏镜头.她听完觉得特别不可思议,谁能给钱让你干这个呢? 如果你用手机.电脑看过视 ...
- 掘地三尺,我挖出了这次线上事故的元凶:Java内存泄漏!
来源:http://www.importnew.com/29591.html 一个凄凉的午夜 一定是网络的问题 一定是 GC 的问题 一定是内存泄漏 真有这么糟糕吗? 还是不行 那现在是怎么回事? 修 ...
- java开发事故如何处理_记一次缓存事故
善于总结,才能更快进步 通常,我们队高并发的数据都会进行缓存,而且为了防止缓存过大,通常我们都会把缓存设置一个超时时间,并且会有cache miss机制.本文,我记录一下错误的缓存机制引起的BUG. ...
- 报告老板,我们的H5页面在iOS11系统上白屏了!
时间回到一周前,当时刚开发完公司A项目的一个新的版本,等待着测试完成就进行发布.此时的我也准备从连续多日的紧张开发状态中走出来,以为可以稍稍放松一下.而那时的我还不知道,我即将面临一个强大的Bug选手 ...
- 报告老板!这个阿里程序员每天上班就看别人接吻
我叫吉恒杉,29岁,是一名"吻戏鉴定师". 和女朋友刚谈恋爱的时候,我说我的工作是训练计算机识别出吻戏镜头.她听完觉得特别不可思议,谁能给钱让你干这个呢? 如果你用手机.电脑看过视 ...
- Java中不可或缺的59个小技巧,贼好用!
来源:https://blog.dogchao.cn/?p=70 <Effective JavaJava>名著,必读.如果能严格遵从本文的原则,以编写API的质量来苛求自己的代码,会大大提 ...
- 经理让我复盘上次Redis缓存雪崩事故
事故背景 公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用户和代理商投诉了.经理让我带同事们一起复盘这次线上事故. 什么原因造成的? 抢购活动计划是零点准时开始, 22:0 ...
- 老大让我复盘上次Redis缓存雪崩事故
本文 Github/javamap 已收录,有Java程序员进阶技术知识地图以及我的系列文章,欢迎大家Star. 事故背景 公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用 ...
最新文章
- mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的
- Linkedin 工程师如何优化他们的 Java 代码
- USB、TTL电平、232电平之间的相互转换
- Shel脚本-初步入门之《03》
- [JavaWeb-HTML]HTML标签_块标签
- 数字电路设计200例_惊险!200米高空,quot;蜘蛛侠quot;救quot;蜘蛛人quot;!
- 信息学奥赛一本通(1412:二进制分类)
- matlab imformats,그래픽스 파일에 이미지 쓰기
- adalm pluto_将Apache Pluto与Lucene搜索引擎示例教程集成
- 面向对象封装的web服务器
- 服务器启动端口被占用,解决Nginx启动出现端口被占用的问题
- antd 表单的校验方式
- FISCO BCOS最强学习路径,汇聚全网资源(2022更新版)
- 瑞萨can入门书学习三
- 华为p8刷linux系统,在华为P8上轻松解锁Bootloader
- 亚马逊ERP系统无货源采集上货软件
- 用MapReduce统计微博的粉丝数,加上博主的昵称
- VSPD+XCOM+Proteus仿真stm32串口通信
- 从零开始学习Java神经网络、自然语言处理和语音识别,附详解和简易版GPT,语音识别完整代码示例解析
- 【Pandas】根据某列分组求和