【Redis】Redis 各种故障分析

255 阅读2分钟

脑裂现象

描述

Redis 集群脑裂指:因为网络问题,导致主节点与从节点,主节点与哨兵集群都处于不同的网络分区,此时主节点依旧可用,但是哨兵判定主节点已经下线,所以会将从节点提升为主节点,此时同时存在两个主节点,就像 Redis 集群的大脑分裂成了两个。

后果

出现脑裂问题时,在哨兵判定主节点下线、提升从节点为新的主节点这段过程中,客户端还是会基于原来的主节点读写数据,因为原主节点依旧正常所以客户端不会发生错误。当哨兵提升新的主节点之后,会通知客户端切换到新的主节点。此时新的主节点无法去获取哨兵故障转移期间原主节点写入的数据。当原主节点与哨兵建立连接之后,会被降级为从节点,此时所有故障转移期间的数据都会丢失。

解决方案

正常情况应该是主节点故障和哨兵进行故障转移期间,客户端无法向主节点写入数据,因此解决脑裂问题的方案就是让主节点在假故障的时候,拒绝客户端写入。

只需要对所有 Redis 服务进行以下配置即可,当 Redis 服务被选中为 Master 就会遵守以下设置:

# redis.conf
# 【Master】当低于指定个 Slave 连接时,Master 拒绝所有写操作
min-slaves-to-write 3

# 【Master】当延迟高于指定秒数时,Master 拒绝所有写操作
min-slaves-max-lag 10

当低于指定数量的从节点连接,或者主从延迟太大时,拒绝写服务,这样保证了主节点在与从节点断开连接时主从数据的一致性。保证了主从数据的一致性,即使临时出现第二个 Master,新旧主节点的数据都是一致的,就不存在数据丢失的问题。