Redis 缓存雪崩

2019-12-19  本文已影响0人  白花蛇草可乐

1、缓存雪崩的概念

缓存层承载着大量请求,有效的保护了存储层。

但是如果缓存层由于某些原因整体不能提供服务(大面积宕机或者缓存的内容失效等),会导致所有的请求都到达存储层,存储层的调用量暴增,造成存储层宕机,系统崩溃。

在网上看到了一个非常有趣的说法:

缓存雪崩的英文原意是 stampeding herd(奔逃的野牛),指的是缓存层宕掉后,流量会像奔逃的野牛一样,打向后端存储。

2、预防措施

2-1、保证缓存层的高可用性

使用 Redis Sentinel 和 Redis Cluster 搭建 Redis 的高可用服务。

除非整个Redis集群全部宕机,否则很难出现雪崩的问题。

2-2、变更系统架构,追加本地缓存

可以考虑利用ehcache或者memcache在本地再追加一层缓存层(local cache)。

利用本地缓存层缓存一部分核心数据,在Redis全面崩溃的情况下,本地缓存还可以暂时抵挡全部或者部分流量,避免给存储层造成太大的负担。

本地缓存的失效时间等策略需要根据业务需求具体设计。

2-3、为存储层追加限流、服务降级组件

在实际项目中,我们需要对重要的资源 (例如 Redis、 MySQL、 Hbase、外部接口) 进行隔离,让每种资源都单独运行在自己的闭环中,即使个别资源出现了问题,也不会对其他服务造成影响。

为此,我们需要在系统中追加限流、服务降级组件(熔断),实现资源隔离。

当访问量剧增、服务出现问题仍然需要保证服务可用。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。

降级的最终目的是保证核心服务可用,即使是有损的。

现阶段最成熟的熔断框架应该是Netflix开源出来的Hystrix,它也是 Spring Cloud 的重要组件。

另外阿里开源出来的限流系统 Sentinel 也值得尝试。

2-4、提前演练

项目上线前,演练缓存层宕掉后,应用以及后端的负载情况以及可能出现的问题,在此基础上做一些预案设定。

上一篇下一篇

猜你喜欢

热点阅读