0
点赞
收藏
分享

微信扫一扫

Redis之缓存雪崩

非常帅气的昵称吧 2022-05-03 阅读 35

崩溃发生场景描述

  1. 系统平稳运行过程中,忽然数据库连接量激增
  2. 应用服务器无法及时处理请求
  3. 大量408,500错误页面出现
  4. 客户反复刷新页面获取数据
  5. 数据库崩溃
  6. 应用服务器崩溃
  7. 重启应用服务器无效
  8. Redis服务器崩溃(一台一台的紧接着崩溃)
  9. Redis集群崩溃
  10. 重启数据库后再次被瞬间流量放倒
     

雪崩发生原因

  1. 在一个较短的时间内,缓存中较多的key集中过期(在实际开发当中,是有很多定时key的,因为内存大小有限)
  2. 此周期内请求访问过期的数据,redis未命中,redis向数据库获取数据
  3. 数据库同时接收到大量的请求无法及时处理
  4. Redis大量请求被积压,开始出现超时现象
  5. 数据库流量激增,数据库崩溃
  6. 重启后仍然面对缓存中无数据可用
  7. Redis服务器资源被严重占用,Redis服务器崩溃
  8. Redis集群呈现崩塌,集群瓦解
  9. 应用服务器无法及时得到数据响应请求,来自客户端的请求数量越来越多,应用服务器崩溃
  10. 应用服务器,redis,数据库全部重启,效果不理想,因为仍然没有缓存,即使rdb恢复也不行,因为key是过期的

 原因分析

极少时间内,查询大量key的批量过期,导致不停访问数据库,加大服务器的压力,最终服务器崩溃的情况。(他跟缓存击穿的区别是,他是大量key的批量过期;而缓存击穿是热门key过期后被访问量瞬时增大) 

 

 解决方案(思路)

  1. 更多的页面静态化处理
  2. 构建多级缓存架构:Nginx缓存+redis缓存+ehcache缓存
  3. 检测Mysql严重耗时业务进行优化:对数据库的瓶颈排查:例如超时查询、耗时较高事务等
  4. 灾难预警机制:监控redis服务器性能指标
    (1)CPU占用、CPU使用率
    (2)内存容量
    (3)查询平均响应时间
    (4)线程数
  5. 限流、降级:短时间范围内牺牲一些客户体验,限制一部分请求访问,降低应用服务器压力,待业务低速运转后再逐步放开访问

解决方案(技术) 

  1. LRU与LFU切换
  2. 缓存失效时间分散
    (1)根据业务数据有效期进行分类错峰,A类90分钟,B类80分钟,C类70分钟
    (2)过期时间使用固定时间+随机值的形式,稀释集中到期的key的数量
  3. 超热数据使用永久key
  4. 定期维护(自动+人工):用自动脚本的方式及维护,或者人工的方式维护,对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据的延时
  5. 加锁(慎用!):拿到锁的可以干活,拿不到的不能干活
举报

相关推荐

0 条评论