事故背景

公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用户和代理商投诉了。经理让我带同事们一起复盘这次线上事故。

什么原因造成的?

抢购活动计划是零点准时开始,

22:00 运营人员通过后台将商品上线

23:00后台小哥已经将商品导入缓存中,提前预热

抢购开始的瞬间流量非常大,按计划是通过Redis承担大部分用户查询请求,避免请求全部落在数据库上。

缓存命中

如上图预期大部分请求会命中缓存,但是由于后台小哥预热缓存的时候将所有商品的缓存时间都设置为2小时过期,所有的商品在同一个时间点全部失效,瞬间所有的请求都落在数据库上,导致数据库扛不住压力崩溃,用户所有的请求都超时报错。

实际上所有的请求都直接落到数据库,如下图:

缓存雪崩

什么时候发现的?

凌晨01:02 SRE 收到系统告警,登录运维管理系统发现数据库节点 CPU和内存飙升超过阈值,迅速联系后台开发人员定位排查。

为什么没有早点发现?

由于缓存设置过期时间是2小时,凌晨1点前缓存可以命中大部分请求,数据库服务处于正常状态。

发现时采取了什么措施?

后台小哥通过日志定位排查发现问题后,进行了一系列操作:

首先通过API Gateway(网关)限制大部分流量进来

接着将宕机的数据库服务重启

再重新预热缓存

确认缓存和数据库服务正常后将网关流量正常放开,大约01:30 抢购活动恢复正常。

如何避免下次出现?

这次事故的原因其实就是出现了缓存雪崩,查询数据量巨大,请求直接落到数据库上,引起数据库压力过大宕机。

在业界解决缓存雪崩的方法其实比较成熟了,比如有:

  • 均匀过期

  • 加互斥锁

  • 缓存永不过期

(1)均匀过期

设置不同的过期时间,让缓存失效的时间点尽量均匀。通常可以为有效期增加随机值或者统一规划有效期。

缓存key过期时间均匀分布

(2)加互斥锁

跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程阻塞排队。

互斥访问

(3)缓存永不过期

跟缓存击穿解决思路一致,缓存在物理上永远不过期,用一个异步的线程更新缓存。

异步更新缓存

复盘总结

通过与同事复盘这次线上事故,大家对于缓存雪崩有了更深刻的理解。为了避免再次出现缓存雪崩事故,大家一起讨论了多个解决方案:

(1)均匀过期

(2)加互斥锁

(3)缓存永不过期

希望技术人能够敬畏每一行代码!

- END -

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

经理让我复盘上次Redis缓存雪崩事故相关推荐

  1. 老大让我复盘上次Redis缓存雪崩事故

    本文 Github/javamap 已收录,有Java程序员进阶技术知识地图以及我的系列文章,欢迎大家Star. 事故背景 公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用 ...

  2. 解决redis缓存穿透、redis缓存雪崩问题

    redis缓存雪崩 如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了. 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕 ...

  3. Redis缓存雪崩缓存击穿缓存穿透

    Redis缓存雪崩&缓存击穿&缓存穿透 一 缓存更新策略 二 缓存雪崩 三 缓存击穿 四 缓存穿透 一 缓存更新策略 目前redis缓存更新存在3种主流策略,分别是:内存淘汰.超时剔除 ...

  4. redis缓存雪崩、缓存击穿和缓存穿透还傻傻分不清?看这篇就够了

    前言 关于Redis的高频问题,缓存雪崩.缓存击穿和缓存穿透一定少不了,相信大家在面试中都被问到过类似的问题.为什么这些问题一直热门呢?因为我们在使用Redis缓存时,这些问题都是很容易遇到的.接下来 ...

  5. Redis 缓存雪崩、击穿、穿透

    Redis 缓存雪崩.击穿.穿透 文章目录 Redis 缓存雪崩.击穿.穿透 一.Redis基础 Redis基本数据类型.操作 二.面试相关问题 1.小伙子您好,看你简历上写了你项目里面用到了Redi ...

  6. redis缓存雪崩、穿透、击穿概念、布隆过滤器小结及解决办法

    判存业务 redis缓存雪崩.穿透.击穿概念及解决办法 什么是 概念: 1.缓存雪崩 对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意 ...

  7. 面试填坑之Redis无底洞(一、Redis缓存雪崩、击穿、穿透)

    Redis缓存雪崩.击穿.穿透 学习自大佬:https://blog.csdn.net/qq_35190492/article/details/102889333 https://www.cnblog ...

  8. redis缓存雪崩、击穿、穿透

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.redis缓存雪崩 二.redis缓存击穿 三.redis缓存穿透 前言 主要是介绍一下redis缓存雪崩.击穿. ...

  9. 【视频】Redis缓存雪崩,原来这么简单有趣

    Redis缓存雪崩 这是我的第一个原创视频,希望大家帮忙点赞. 微信搜索「 三太子敖丙 」回复[资料]获取帅丙面试大厂整理的所有资料包括电子书和各类文章.

最新文章

  1. 我们每天都在做无用功?
  2. android 模拟点击localinstrumentation,Android Instrumentation模拟鼠标点击事件
  3. 两个栈实现一个队列,两个队列实现一个栈
  4. UA MATH636 信息论5 信道编码定理的证明
  5. struts实战--文件下载
  6. sql server 作业收缩数据库
  7. c语言输入三个数判断等边三角形,随便输入三个数,看能否组成一个三角形
  8. CentOS查看每个进程的网络流量
  9. 零的突破!炸出圈的“女娲补天”教授获国家杰青!
  10. 用python前端html后端django_浅谈Django前端后端值传递问题
  11. 开启爬虫之路,从零开始...
  12. html显示当前时间_HTML基础教程:超链接的使用
  13. The Dataflow Model: A Practical Approach to Balancing
  14. 剑指offer-序列化二叉树
  15. thinkphp v5.0.11漏洞_ThinkPHP 5.0.x-5.0.23、5.1.x、5.2.x 全版本远程代码执行漏洞分析
  16. Qt初学者的一些学习方法、参考资料
  17. 重庆计算机一级考试在线做,全国(重庆考区)计算机一级考试教程.doc
  18. 【火灾检测】基于matlab连通区域+SVM特征融合火灾检测【含Matlab源码 1223期】
  19. 《Perl语言入门》学习笔记
  20. tomcat设置编码

热门文章

  1. 如何使用Fiddler抓包操作?
  2. 深度剖析 浮点型 在内存中的存储【C语言】
  3. P4216 [SCOI2015]情报传递 LCA+树上主席树 离线操作
  4. mysql数据库连接jar_mysql数据库连接jar包
  5. Android p2p service,android – WifiP2pDnsSdServiceInfo.newInstance中的可用服务类型
  6. 2019 ICPC Asia Nanjing Regional K.Triangle(求一个能将三角形分成两个面积相同的线段、计算几何)
  7. 模板 - 欧拉路、欧拉回路(一笔画问题)
  8. java建立_利用Java创建Windows服务
  9. wordpress php执行短代码_【漏洞通告】PHP远程代码执行漏洞(CVE-2019-11043)
  10. jpg怎么合成一份_哪些超实用的有机化学知识点---之有机合成工具包