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

  • 相关阅读:
    java毕业设计-基于springboot+vue的在线婚纱定制系统设计与实现,基于java的在线婚纱摄影预定系统,基于web的婚纱影楼管理系统设计,基于web婚纱影楼管理系统设计(附源码和配套资料)
    湖仓一体电商项目(八):业务实现之编写写入ODS层业务代码
    windows2012R2 ffmpeg 无法启动此程序,计算机丢失MFPlat.Dll
    【实践】随机森林算法与决策树的效果对比(含Python代码)
    C++ 类和对象
    RK3588 Android13 TvSetting 中性能浮窗RAM显示bug
    【算法基础】筛质数
    2021-10《信息资源管理 02378》真卷(独家文字版),圈定章节考点+统计真题分布
    mysql存储过程
    卷积神经网络提取图像特征的操作是怎样完成的
  • 原文地址:https://blog.csdn.net/qq_43325216/article/details/134254809