“Redis挂掉了应该怎么办”这个问题不论是在我们的工作中,还是面试中都会遇到;
首先我们需要知道的redis挂掉以后会带来哪些后果
在工作中我们经常会用redis作为缓存,来减轻数据库压力,提高性能并且保证服务可用
因此redis挂掉以后会出现以下的严重后果
- 系统性能断崖式下降
- 数据库的压力骤增
- 数据库宕机,导致服务不可用
解决方案: 一个好的系统的设计,往往都要从预防、故障快速响应、应急处理以及演练复盘来考虑
- 预防:在系统设计时我们需要考虑系统的用户量以及并发量,做好提前的预防,通过合理的架构来降低单节点故障
- 在数据量不大的情况下,采用主从+哨兵的机制来实现故障的自动转移 通过redis读写分离,来让从节点分担读压力,通过哨兵机制来实现节点的监控以及故障的转移
- 数据量大的场景下,采用分片集群的方式 将数据分片到多个主节点,提高容量和分散风险
- 避免机房断电,采用多可用地区部署来避免地域性故障
2.快速响应 这里我们可以通过哨兵机制来检查节点的健康情况,当查过阈值,能够快速实现节点切换。除了通过哨兵机制以外,我们还能通过手动转移故障,但是比较慢和麻烦。
需要注意的时数据同步与数据一致性的问题
- 应急处理 虽然前面的方案以及可以比较很好的应对了,但是在一些极端情况下,上面的方案依旧会存在集群挂掉的情况,我们必须做好一定的兜底策略
首先我们需要保证核心业务的正常,首先触发服务降级,通过熔断器阻断非核心服务请求,保证核心服务请求正常,临时让核心业务能够访问DB,同时需要做好DB限流
当redis恢复以后我们需要通过读取db 日志文件进行数据恢复,然后再进行数据的缓存预热,避免所有请求瞬间涌入
- 演练和复盘 为了提前预防需要建立一个完善的监控告警体系,比如监控reids的内存、CPU、缓存命中情况、主从同步延迟情况等
完善应急方案,比如出现故障如何排查,就比如飞行员的飞行手册
然后可以通过定期的演练,来测试系统是否符合预期
上面的方案不涉及到细节问题,所以大家还需要考虑主从延迟、数据同步,数据倾斜、哨兵误判等问题,欢迎大家积极讨论