缓存雪崩
场景
数据库服务器崩溃,一连串的场景会随之而来
- 系统平稳运行过程中,忽然数据库连接量激增
- 应用服务器无法及时处理请求
- 大量408, 500错误页面出现
- 客户反复刷新页面获取数据
- 数据库崩溃
- 应用服务器崩溃
- 重启应用服务器无效
- Redis服务器崩溃
- Redis集群崩溃
- 重启数据库后再次被瞬间流量放倒
问题排查
- 在一个较短时间内,缓存中较多的key集中过期
- 此周期内请求访问过期的数据,redis未命中,redis向数据库获取数据
- 数据库同时接收到大量的请求无法及时处理
- Redis大量请求被积压,开始出现超时现象
- 数据库流量激增,数据库崩溃
- 重启后仍然面对缓存中无数据可用
- Redis服务器资源被严重占用,Redis服务器崩溃
- Redis集群呈现崩塌,集群瓦解
- 应用服务器无法及时得到数据响应请求,来自客户端的请求数量越来越多,应用服务器崩溃
- 应用服务器,redis,数据库全部重启,效果不理想
总而言之就两点: 短时间范围内,大量key集中过期
解决方案
思路
更多的页面静态化处理
构建多级缓存架构
Nginx缓存 + redis缓存 + ehcache缓存
检测Mysql严重耗时业务进行优化
对数据库的瓶颈排查:例如超时查询,耗时较高事务等
灾难预警机制
监控redis服务器性能指标
CPU占用、CPU使用率
内存容量
查询平均响应时间
线程数
限流、降级
短时间范围内牺牲一些客户体验,限制一部分请求访问,降低应用服务器压力,待业务低速运转后再逐步放开访问
落地实践
LRU与LFU切换
数据有效期策略调整
根据业务数据有效性进行分类错峰,A类90分钟,B类80分钟,C类70分钟
过期时间使用固定时间 + 随机值的形式, 稀释集中到期的key的数量
超热数据使用永久key
定期维护 (自动 + 人工)
对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据的延时
加锁:慎用!!
总结:缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造成压力。如能够有效避免过期时间集中,可以有效解决雪崩现象的出现(40%),配合其他策略一起使用,并监控服务器的运行数据,根据运行记录做可快速调整。