事故背景

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

什么原因造成的?

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

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

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

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

缓存命中

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

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

缓存雪崩

什么时候发现的?

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

为什么没有早点发现?

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

发现时采取了什么措施?

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

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

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

再重新预热缓存

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

如何避免下次出现?

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

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

  • 均匀过期

  • 加互斥锁

  • 缓存永不过期

(1)均匀过期

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

缓存key过期时间均匀分布

(2)加互斥锁

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

互斥访问

(3)缓存永不过期

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

异步更新缓存

复盘总结

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

(1)均匀过期

(2)加互斥锁

(3)缓存永不过期

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


往期推荐

《大厂内部资料》Redis 性能优化的 13 条军规!全网首发

2020-03-24

惊呆了,竟然可以用这种方式秒建Redis集群?

2020-03-26

史上最全的 SQL 优化方案!建议收藏

2020-04-13

关注我,每天陪你进步一点点!

报告老板:这次的缓存事故是这样的...相关推荐

  1. 报告老板,微服务高可用神器已祭出,您花巨资营销的高流量来了没?

    来自:码大叔 我得意地来到老板的办公室:"报告老板,高可用神器已祭出,您花巨资营销的高流量什么时候到?" 老板呵呵一声:"高流量下周一来报道,你可以准备下和他做工作交接了 ...

  2. 8月14日云栖精选夜读 | 报告老板!这个阿里程序员每天上班就看别人接吻

    我叫吉恒杉,29岁,是一名"吻戏鉴定师". 和女朋友刚谈恋爱的时候,我说我的工作是训练计算机识别出吻戏镜头.她听完觉得特别不可思议,谁能给钱让你干这个呢? 如果你用手机.电脑看过视 ...

  3. 掘地三尺,我挖出了这次线上事故的元凶:Java内存泄漏!

    来源:http://www.importnew.com/29591.html 一个凄凉的午夜 一定是网络的问题 一定是 GC 的问题 一定是内存泄漏 真有这么糟糕吗? 还是不行 那现在是怎么回事? 修 ...

  4. java开发事故如何处理_记一次缓存事故

    善于总结,才能更快进步 通常,我们队高并发的数据都会进行缓存,而且为了防止缓存过大,通常我们都会把缓存设置一个超时时间,并且会有cache miss机制.本文,我记录一下错误的缓存机制引起的BUG. ...

  5. 报告老板,我们的H5页面在iOS11系统上白屏了!

    时间回到一周前,当时刚开发完公司A项目的一个新的版本,等待着测试完成就进行发布.此时的我也准备从连续多日的紧张开发状态中走出来,以为可以稍稍放松一下.而那时的我还不知道,我即将面临一个强大的Bug选手 ...

  6. 报告老板!这个阿里程序员每天上班就看别人接吻

    我叫吉恒杉,29岁,是一名"吻戏鉴定师". 和女朋友刚谈恋爱的时候,我说我的工作是训练计算机识别出吻戏镜头.她听完觉得特别不可思议,谁能给钱让你干这个呢? 如果你用手机.电脑看过视 ...

  7. Java中不可或缺的59个小技巧,贼好用!

    来源:https://blog.dogchao.cn/?p=70 <Effective JavaJava>名著,必读.如果能严格遵从本文的原则,以编写API的质量来苛求自己的代码,会大大提 ...

  8. 经理让我复盘上次Redis缓存雪崩事故

    事故背景 公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用户和代理商投诉了.经理让我带同事们一起复盘这次线上事故. 什么原因造成的? 抢购活动计划是零点准时开始, 22:0 ...

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

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

最新文章

  1. mysql创建表为什么第二次,mysql当我加入同一个表两次聚合是错误的
  2. Linkedin 工程师如何优化他们的 Java 代码
  3. USB、TTL电平、232电平之间的相互转换
  4. Shel脚本-初步入门之《03》
  5. [JavaWeb-HTML]HTML标签_块标签
  6. 数字电路设计200例_惊险!200米高空,quot;蜘蛛侠quot;救quot;蜘蛛人quot;!
  7. 信息学奥赛一本通(1412:二进制分类)
  8. matlab imformats,그래픽스 파일에 이미지 쓰기
  9. adalm pluto_将Apache Pluto与Lucene搜索引擎示例教程集成
  10. 面向对象封装的web服务器
  11. 服务器启动端口被占用,解决Nginx启动出现端口被占用的问题
  12. antd 表单的校验方式
  13. FISCO BCOS最强学习路径,汇聚全网资源(2022更新版)
  14. 瑞萨can入门书学习三
  15. 华为p8刷linux系统,在华为P8上轻松解锁Bootloader
  16. 亚马逊ERP系统无货源采集上货软件
  17. 用MapReduce统计微博的粉丝数,加上博主的昵称
  18. VSPD+XCOM+Proteus仿真stm32串口通信
  19. 从零开始学习Java神经网络、自然语言处理和语音识别,附详解和简易版GPT,语音识别完整代码示例解析
  20. 【Pandas】根据某列分组求和

热门文章

  1. Oracle数据库查询优化
  2. 蓝桥杯练习系统,入门训练,Java版
  3. mysql索引为啥要选择B+树 (下)
  4. Shell编程—企业生产案例
  5. [Array]Majority Element
  6. Codeforces Round #FF
  7. 几种开源软件授权协议
  8. powerdesigner显示工具面板_photoshop教程-画笔工具预设与选项设置
  9. GET和POST请求到底有什么区别?
  10. Excel单元格“删除线”的添加与删除