loading...
Redis缓存雪崩
Published in:2022-01-31 | category: Redis
Words: 714 | Reading time: 2min | reading:

缓存雪崩

场景

数据库服务器崩溃,一连串的场景会随之而来

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

问题排查

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

总而言之就两点: 短时间范围内,大量key集中过期

解决方案

  • 思路

    1. 更多的页面静态化处理

    2. 构建多级缓存架构

      Nginx缓存 + redis缓存 + ehcache缓存

    3. 检测Mysql严重耗时业务进行优化

      对数据库的瓶颈排查:例如超时查询,耗时较高事务等

    4. 灾难预警机制

      监控redis服务器性能指标

      CPU占用、CPU使用率

      内存容量

      查询平均响应时间

      线程数

    5. 限流、降级

      短时间范围内牺牲一些客户体验,限制一部分请求访问,降低应用服务器压力,待业务低速运转后再逐步放开访问

  • 落地实践

    1. LRU与LFU切换

    2. 数据有效期策略调整

      根据业务数据有效性进行分类错峰,A类90分钟,B类80分钟,C类70分钟

      过期时间使用固定时间 + 随机值的形式, 稀释集中到期的key的数量

    3. 超热数据使用永久key

    4. 定期维护 (自动 + 人工)

      对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据的延时

    5. 加锁:慎用!!

总结:缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造成压力。如能够有效避免过期时间集中,可以有效解决雪崩现象的出现(40%),配合其他策略一起使用,并监控服务器的运行数据,根据运行记录做可快速调整。

Prev:
Redis哨兵模式(未完)
Next:
Redis开启分布式锁
catalog
catalog