什么是Redis的集群脑裂?

       Redis的集群脑裂指在主从集群中,同时有两个master主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个master主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。此时Redis的集群脑裂就有可能会导致数据丢失。


为什么会发生Redis的集群脑裂?(为什么会同时出现两个master主节点?)

网络问题:导致Redis Master节点跟Redis Slave节点和哨兵Sentinel集群处于不同的网络分区,此时因为Sentinel集群无法感知到master的存在,所以将Slave节点提升为Master节点。此时就存在两个不同的Master节点,就像一个大脑分裂成了两个。

主机资源问题:redis Master节点所在的服务器上的其他程序临时占用了大量资源(例如 CPU 资源),导致主库资源使用受限,短时间内无法响应心跳,于是Sentinel集群重新选举了新的Master,当其它程序不再使用资源时,旧Master节点又恢复正常,同一集群下出现两个Master。

Redis 主节点阻塞:主库自身遇到了阻塞的情况,例如,处理 bigkey 或是发生内存 swap,短时间内无法响应心跳,还是会触发Sentinel机制,等主库阻塞解除后,又恢复正常的请求处理了。


Redis主从 异步的同步丢数据问题

        对于Redis主节点与从节点之间的数据复制,是异步复制的,如果master主节点还没来得及同步(主从数据一致)给slave节点时发生宕机,那么master内存中的数据会丢失。


解决Redis集群脑裂和Redis主从异步的同步丢数据问题

        在redis的配置文件中有两个参数我们可以设置:

min-slaves-to-write  N 

min-slaves-max-lag N

        min-slaves-to-write默认配置为0,这个配置表示master至少有N个slave节点才进行工作。当出现Redis集群脑裂时,其中一个出问题的master此时就少于N的slave连接,此master就拒绝写请求。

        min-slaves-max-lag默认配置为10,这个配置表示slave和master之间只能落后N ms的数据。超过了该值就拒绝写请求,就不会往master中写入数据。

  服务降级解决master拒绝写请求问题,但是那些写请求可以写到Mysql中,再把数据从MySQL加载出来,写到正常的mater去。