• 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 为了防止脑裂,或者解决脑裂导致的数据丢失问题,都是将集群变成不可用状态。

  • 相关阅读:
    强化学习论文分析4---异构网络_强化学习_功率控制《Deep Reinforcement Learning for Multi-Agent....》
    无障碍阅读他人开源项目结构:看完本文,你将信心满满
    分销商城小程序开发运营逻辑是什么?
    数仓开发常用hive命令
    6235. 逐层排序二叉树所需的最少操作数目
    vue nextTick源码分析
    微信小程序的tabbar怎么配置
    不用 Spring 居然连最基本的接口都不会写了
    数说故事《汽车行业全场景数字化解决方案》之产品管理解决方案
    杭电oj 2049 不容易系列之(4)——考新郎 C语言
  • 原文地址:https://blog.csdn.net/qq_43325216/article/details/134254809