博客
关于我
老大让我复盘上次Redis缓存雪崩事故
阅读量:360 次
发布时间:2019-03-04

本文共 863 字,大约阅读时间需要 2 分钟。

抢购活动线上事故复盘:缓存雪崩的教训

事故背景

近期公司推出了一个商品抢购活动,由于后台操作失误,导致活动效果不佳,引发了用户和代理商的投诉。老大让我与同事一起复盘这次线上事故。

什么原因造成的?

抢购活动原本计划在0点准时开始,22点运营人员通过后台将商品上线。23点后台小哥已经将商品导入缓存中,提前预热。

抢购开始时流量非常大,预计Redis将承担大部分用户查询请求,避免所有请求都落在数据库上。

预期与现实

根据预期,大部分请求应该命中缓存。然而,后台小哥在预热缓存时,将所有商品的缓存时间设置为2小时过期。结果,在同一时间点,所有商品的缓存同时失效,所有请求都落到了数据库上,导致数据库无法承受压力,崩溃,用户请求全部超时报错。

当前发现

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

为什么没有早点发现?

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

发现时采取的措施

后台小哥通过日志定位排查问题后,采取了以下措施:

  • 通过API Gateway限制大部分流量
  • 宕机的数据库服务重启
  • 重新预热缓存
  • 确认缓存和数据库服务正常后,将网关流量正常放开
  • 抢购活动恢复正常,大约01:30
  • 如何避免下次出现?

    这次事故的根本原因是缓存雪崩,查询数据量巨大,请求直接落到数据库上,导致数据库压力过大宕机。

    业界解决缓存雪崩的方法有以下几种:

    方法一:均匀过期

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

    方法二:加互斥锁

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

    方法三:缓存永不过期

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

    复盘总结

    通过与同事复盘这次线上事故,大家对缓存雪崩有了更深刻的理解。为了避免类似问题,我们讨论了多个解决方案:

    • 均匀过期
    • 加互斥锁
    • 缓存永不过期

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

    转载地址:http://dlbr.baihongyu.com/

    你可能感兴趣的文章
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenPPL PPQ量化(5):执行引擎 源码剖析
    查看>>
    Openresty框架入门详解
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    Openstack企业级云计算实战第二、三期培训即将开始
    查看>>
    OpenStack的基本概念与架构详解
    查看>>
    openstack虚拟机迁移live-migration中libvirt配置
    查看>>
    ORACEL学习--理解over()函数
    查看>>
    Oracle GoldenGate Director安装和配置(无图)
    查看>>
    oracle script
    查看>>
    Oracle Spatial空间数据库建立
    查看>>
    Oracle 写存储过程的一个模板还有一些基本的知识点
    查看>>
    oracle 创建字段自增长——两种实现方式汇总
    查看>>
    Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
    查看>>
    ORACLE 客户端工具连接oracle 12504
    查看>>
    Oracle 递归
    查看>>
    oracle--用户,权限,角色的管理
    查看>>
    Oracle10g EM乱码之快速解决
    查看>>
    Oracle11G基本操作
    查看>>