脑裂是什么?Zookeeper是如何解决的?

什么是脑裂

脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,我们都知道,如果一个人有多个大脑,并且相互独立的话,那么会导致人体“手舞足蹈”,“不听使唤”。

脑裂通常会出现在集群环境中,比如ElasticSearch、Zookeeper集群,而这些集群环境有一个统一的特点,就是它们有一个大脑,比如ElasticSearch集群中有Master节点,Zookeeper集群中有Leader节点。

本篇文章着重来给大家讲一下Zookeeper中的脑裂问题,以及是如果解决脑裂问题的。

Zookeeper集群中的脑裂场景

对于一个集群,想要提高这个集群的可用性,通常会采用多机房部署,比如现在有一个由6台zkServer所组成的一个集群,部署在了两个机房:

正常情况下,此集群只会有一个Leader,那么如果机房之间的网络断了之后,两个机房内的zkServer还是可以相互通信的,如果不考虑过半机制,那么就会出现每个机房内部都将选出一个Leader。

这就相当于原本一个集群,被分成了两个集群,出现了两个“大脑”,这就是脑裂。

对于这种情况,我们也可以看出来,原本应该是统一的一个集群对外提供服务的,现在变成了两个集群同时对外提供服务,如果过了一会,断了的网络突然联通了,那么此时就会出现问题了,两个集群刚刚都对外提供服务了,数据该怎么合并,数据冲突怎么解决等等问题。

刚刚在说明脑裂场景时,有一个前提条件就是没有考虑过半机制,所以实际上Zookeeper集群中是不会出现脑裂问题的,而不会出现的原因就跟过半机制有关。

过半机制

在领导者选举的过程中,如果某台zkServer获得了超过半数的选票,则此zkServer就可以成为Leader了。

过半机制的源码实现其实非常简单:

public class QuorumMaj implements QuorumVerifier {    private static final Logger LOG = LoggerFactory.getLogger(QuorumMaj.class);        int half;        // n表示集群中zkServer的个数(准确的说是参与者的个数,参与者不包括观察者节点)    public QuorumMaj(int n){        this.half = n/2;    }    // 验证是否符合过半机制    public boolean containsQuorum(Set<Long> set){        // half是在构造方法里赋值的        // set.size()表示某台zkServer获得的票数        return (set.size() > half);    }    }

大家仔细看一下上面方法中的注释,核心代码就是下面两行:

this.half = n/2;return (set.size() > half);

举个简单的例子:
如果现在集群中有5台zkServer,那么half=5/2=2,那么也就是说,领导者选举的过程中至少要有三台zkServer投了同一个zkServer,才会符合过半机制,才能选出来一个Leader。

那么有一个问题我们想一下,选举的过程中为什么一定要有一个过半机制验证?
因为这样不需要等待所有zkServer都投了同一个zkServer就可以选举出来一个Leader了,这样比较快,所以叫快速领导者选举算法呗。

那么再来想一个问题,过半机制中为什么是大于,而不是大于等于呢?

这就是更脑裂问题有关系了,比如回到上文出现脑裂问题的场景:

当机房中间的网络断掉之后,机房1内的三台服务器会进行领导者选举,但是此时过半机制的条件是set.size() > 3,也就是说至少要4台zkServer才能选出来一个Leader,所以对于机房1来说它不能选出一个Leader,同样机房2也不能选出一个Leader,这种情况下整个集群当机房间的网络断掉后,整个集群将没有Leader。

而如果过半机制的条件是set.size() >= 3,那么机房1和机房2都会选出一个Leader,这样就出现了脑裂。所以我们就知道了,为什么过半机制中是大于,而不是大于等于。就是为了防止脑裂。

如果假设我们现在只有5台机器,也部署在两个机房:

此时过半机制的条件是set.size() > 2,也就是至少要3台服务器才能选出一个Leader,此时机房件的网络断开了,对于机房1来说是没有影响的,Leader依然还是Leader,对于机房2来说是选不出来Leader的,此时整个集群中只有一个Leader。

所以,我们可以总结得出,有了过半机制,对于一个Zookeeper集群,要么没有Leader,要没只有1个Leader,这样就避免了脑裂问题。

有痛点才有创新,一个技术肯定都是为了解决某个痛点才出现的。

请帮忙转发一下,如果想第一时间学习更多的精彩的内容,请关注微信公众号:1点25

(0)

相关推荐

  • (实验三) Hadoop之Zookeeper安装

    Hadoop之Zookeeper安装 实验目的要求 1.完成Zookeeper的完全分布模式的安装 2.Zookeeper服务能够正常启动和连接 3.Zookeeper控制台能够正常进入 4.Zook ...

  • zookeeper三种模式安装详解(centos 7+zookeeper

    zookeeper有单机.伪集群.集群三种部署方式,可根据自己实际情况选择合适的部署方式.下边对这三种部署方式逐一进行讲解. 一 单机模式 1.下载 进入要下载的版本的目录,选择.tar.gz文件下载 ...

  • Zookeeper选举机制和监听原理

    Zookeeper选举机制: ​(1)Zookeeper集群中只有超过半数以上的服务器启动,集群才能正常工作: ​(2)在集群正常工作之前,myid小的服务器给myid大的服务器投票,直到集群正常工作 ...

  • [Hadoop] Zookeeper伪分布式集群部署

    [Hadoop] Zookeeper伪分布式集群部署

  • Zookeeper工作过程详解

    一.Zookeeper工作机制 分布式和集中式系统相比,有很多优势,比如更强的计算能力,存储能力,避免单点故障等问题.但是由于在分布式部署的方式遇到网络故障等问题的时候怎么保证各个节点数据的一致性和可 ...

  • ZooKeeper集群“脑裂”问题处理大全

    加个"星标",每天上午 09:25,干货推送! 本文重点讲解ZooKeeper脑裂问题的处理办法.ZooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内 ...

  • linux下搭建zookeeper集群全流程Centos7.2版本

    linux下搭建zookeeper集群全流程Centos7.2版本

  • 明朝最惨的“替罪羊”:被李自成酷刑折磨5天5夜,脑裂而死

    明王朝的灭亡绝对是中国古代史上最让人震惊的事件之一.这个王朝经历两百多年的历史,曾发展过繁华盛世,也很少出现民不聊生的困境.相比较其他王朝来说,明王朝确实得伤民心很多,哪怕到明朝末期的崇祯帝时期,也没 ...

  • 【语言脑】10.三个妙招解决宝宝说话晚

    首先要了解的是: 宝宝会叫mama不代表懂意思:8个月之后才能真正有意识说话 能理解语言不代表能使用语言:半岁之后的学习和理解能力发展很快,而说话能力慢些,但还是能听懂给他的指令(如告别) 宝宝语不宜 ...

  • 西瓜后期一碰就裂啥原因?该怎么解决这类问题呢?

    西瓜裂果对于果农来说一旦发生,带来的损失往往很大,那么我们怎么施肥管理可以减少果实裂果呢?今天小编就与大家简单说说: 果实裂果往往是因为果肉的生长速度超过了果皮的生长速度,也就是果皮果肉生长不同步了, ...

  • 【Z146】脑裂畸形

    [病因病理] 脑裂畸形是神经元移行.早期缺血等原因使局部脑组织生长.分化障碍所致.主要病理学 改变为大脑半球有一裂隙,皮层灰质沿裂隙内折,达室管膜下,其表面软脑膜与室管膜融合形成软脑膜-室管膜缝(P- ...

  • 方块之王:不一样的30人吃鸡游戏!这个游戏有点脑裂!

    40000+游戏爱好者已加入我们! 每天推荐好玩游戏! 加入我们,沐沐带你发现好游戏! <方块之王>游戏小程序好玩吗? <方块之王>小游戏怎么玩? 只有你想不到, 没有我找不到 ...

  • 脑裂畸形的影像学表现

    脑裂畸形 脑裂畸形(Schizencephaly)是一种神经元移行异常的大脑发育畸形,于 1946 年首先由 Yakovlev 和 Wadsworth 报道,属于罕见疾病. 发病机制 发生于妊娠前 2 ...

  • 脑灰质异位伴脑裂畸形

    来源:东南大学附属中大医院医学影像科 病史 女,29岁,因"四肢活动不灵活20余年"入院 影像学表现 平扫 编辑/校对:郑孝飞 病例结果:脑灰质异位伴脑裂畸形 鼎湖影像 医学影像垂 ...

  • 企业容灾架构选型解析(三):脑裂问题探讨

    [摘要]随着全球IT产业的飞速发展,企业的IT建设逐步成为主导业务发展的核心驱动力,基于企业IT架构容灾建设的各种行业标准以及监管标准也相应提高.提高企业整体容灾体系标准是摆在企业面前的挑战,但是面对 ...