本文转载自微信公众号「爱笑的架构师」,作者雷架 。转载本文请联系爱笑的架构师公众号。
事故背景
公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用户和代理商投诉了。经理让我带同事们一起复盘这次线上事故。
什么原因造成的?
抢购活动计划是零点准时开始,
22:00 运营人员通过后台将商品上线
23:00后台小哥已经将商品导入缓存中,提前预热
抢购开始的瞬间流量非常大,按计划是通过Redis承担大部分用户查询请求,避免请求全部落在数据库上。
缓存命中
如上图预期大部分请求会命中缓存,但是由于后台小哥预热缓存的时候将所有商品的缓存时间都设置为2小时过期,所有的商品在同一个时间点全部失效,瞬间所有的请求都落在数据库上,导致数据库扛不住压力崩溃,用户所有的请求都超时报错。
实际上所有的请求都直接落到数据库,如下图:
缓存雪崩
什么时候发现的?
凌晨01:02 SRE 收到系统告警,登录运维管理系统发现数据库节点 CPU和内存飙升超过阈值,迅速联系后台开发人员定位排查。
为什么没有早点发现?
由于缓存设置过期时间是2小时,凌晨1点前缓存可以命中大部分请求,数据库服务处于正常状态。
发现时采取了什么措施?
后台小哥通过日志定位排查发现问题后,进行了一系列操作:
首先通过API Gateway(网关)限制大部分流量进来
接着将宕机的数据库服务重启
再重新预热缓存
确认缓存和数据库服务正常后将网关流量正常放开,大约01:30 抢购活动恢复正常。
如何避免下次出现?
这次事故的原因其实就是出现了缓存雪崩,查询数据量巨大,请求直接落到数据库上,引起数据库压力过大宕机。
在业界解决缓存雪崩的方法其实比较成熟了,比如有:
(1)均匀过期
设置不同的过期时间,让缓存失效的时间点尽量均匀。通常可以为有效期增加随机值或者统一规划有效期。
缓存key过期时间均匀分布
(2)加互斥锁
跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程阻塞排队。
互斥访问
(3)缓存永不过期
跟缓存击穿解决思路一致,缓存在物理上永远不过期,用一个异步的线程更新缓存。
异步更新缓存
复盘总结
通过与同事复盘这次线上事故,大家对于缓存雪崩有了更深刻的理解。为了避免再次出现缓存雪崩事故,大家一起讨论了多个解决方案:
(1)均匀过期
(2)加互斥锁
(3)缓存永不过期
希望技术人能够敬畏每一行代码!
人头马君度(Rmy Cointreau)的历史非常重要,这家酒业公司以将最好的酒陈化100年...
【51CTO.com快译】数字化转型使应用程序领导人必须找到有效的方法来更新改造遗留...
2020年以来,由疫情停工减产所导致的缺芯困局影响着全球汽车发展,而本以为2021...
2020年11月26日深圳潮数科技于石家庄成功召开数据安全 新时代新基建信息应用之基...
本文中的五个步骤有助于您掌握转型的总体需求,并有助于您处理一些真正重要的事...
根据TrendForce的最新调查,自2020年初以来,COVID-19流感大流行加速了世界各地...
在VMworld 2020,VMware宣布与NVIDIA进行全面合作,共同推出新一代的混合云架构...
在疫情的影响下,人们的工作和生活方式在过去的一年发生了前所未有的变化。为了...
根据调查,随着用户对计算能力、存储和网络容量的需求增长,服务器需求比经济不...
时间真快呀!转眼又至周一。让我们卯足干劲继续前行,先来看看上周有哪些不容错...