ZK和redis中是否会发生脑裂问题?

首先介绍一下什么是脑裂?

简单的说,就好比一个人有两个大脑,这种情况下,就不知道应该受那个大脑控制了。

在redis或者zk集群中,就是主从结构中出现了多个master。

zk中会出现脑裂现象吗?

不会:因为zk集群中,leader的选举有一个过半机制

  1. 一个集群的机器分布在AB两个机房,每个机房的数量是相同的:
    1. 正常情况下,zk会选举出一个leader,假设在A机房,如果某个时间,AB机房之间的网络断开了,但是每个机房内的网络是正常的。
    2. 因为ZK的主从同步机制中,leader会给follower发送心跳,因此leader可以收到A机房机器的ack响应,但是无法收到B机房的ack响应 ------ 这个时候leader收到的ack响应数量没有过半,那么leader退位,重新选举
    3. 但是因为AB两个机房的机器数目都是一样的,哪个机房都没有超过一半的数目,因此无法选出新的leader,此时集群属于不可用状态
  2. 几个集群机器分布在AB两个机房,A机房数目大于B机房:
    1. 假设leader在A机房,AB机房网络断开,但是机房内网络正常,此时因为A机房机器过半,那么leader不受影响,A机房正常工作
  3. 几个集群机器分布在AB两个机房,A机房数目小于B机房:
    1. 假设leader在A机房,AB机房网络断开,但是机房内网络正常,此时leader收到的ack响应不够,leader退位,在B机房重新选举一个leader,B机房正常工作。

redis中会出现脑裂现象吗?

有可能,场景如下:

redis的主从架构中,master提供写操作,slavers提供读操作。如果某一个时间,master与所有的从节点都失去了连接,但是和客户端是正常连接的,此时之后写操作,主节点A将数据写到缓存中,但是因为网络问题没有办法同步给从节点。

如果集群中定义了哨兵节点,此时哨兵节点也会发现主节点A失联了,那么就认为主节点A挂了,然后重新选举一个新的 主节点B,但是因为之前的主节点A并没有下线,此时集群中就有两个主节点了,A和B,--- 脑裂发生了

某一个时刻后,网络又恢复了正常,此时,哨兵节点会将旧的主节点A降级为从节点A,然后从节点A去同步主节点B上的 数据,因为第一次同步是全量同步,A节点会首先清空自己的本地数据,这样之前客户端往A节点写的数据就丢失了,发生了脑裂导致的数据丢失问题

如何解决redis中的脑裂问题呢?

主节点发现从节点下线或者通信超时的总数量小于阈值时,那么禁止主节点进行写数据,直接把错误返回给客户端

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

  1. min-slaves-to-write x,主节点必须要有至少 x 个从节点连接,如果小于这个数,主节点会禁止写数据。
  2. min-slaves-max-lag x,主从数据复制和同步的延迟不能超过 x 秒,如果超过,主节点会禁止写数据。
     

总结:可以看出,zk和redis 为了防止脑裂,或者解决脑裂导致的数据丢失问题,都是将集群变成不可用状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值