简介
本文介绍Redis的缓存雪崩,包括:含义、原因、解决方案。
含义
缓存雪崩的英文原意是stampeding herd(奔逃的野牛) ,指的是缓存层宕掉后,流量会像奔逃的野牛一样,打向后端存储。
雪崩的原因
由于缓存层承载着大量请求,有效地保护了存储层,但是如果缓存层由于某些原因不能提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会级联宕机的情况。
流程如图1所示:
解决方案
1. 保证Redis服务高可用
和飞机都有多个引擎一样,如果缓存层设计成高可用的,即使个别节点、 个别机器、 甚至是机房宕掉,依然可以提供服务。
Redis Sentinel和Redis Cluster都实现了高可用。
2. 使用隔离组件为后端限流并降级
无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源。
作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部阻塞(hang) 在这个资源上,造成整个系统不可用。 降级机制在高并发系统中是非常普遍的: 比如推荐服务中,如果个性化推荐服务不可用,可以降级补充热点数据,不至于造成前端页面空白一片。
在实际项目中,我们需要对重要的资源(例如Redis、 MySQL、HBase、 外部接口) 都进行隔离,让每种资源都单独运行在自己的线程池中,即使个别资源出现了问题,对其他服务没有影响。 但是线程池如何管理,比如如何关闭资源池、 开启资源池、 资源池阀值管理,这些做起来还是相当复杂的。
这里推荐一个Java依赖隔离工具Hystrix(https://github.com/netflix/hystrix) ,如图2所示。 Hystrix是解决依赖隔离的利器,但是该内容已经超出本文的范围,同时只适用于Java应用,所以这里不会详细介绍。
3. 提前演练
在项目上线前,演练缓存层宕掉后,应用以及后端的负载情况以及可能出现的问题,在此基础上做一些预案设定。
请先
!