[梁山好汉说IT] 如何理解脑裂问题

本文通过梁山好汉的例子来加深理解脑裂问题。

1. 问题描述

Split-brain, 就是在集群环境中,因为异常情况发生后,产生两个子集群。每个子集群都选出一个leader(master)节点。最后互相竞争资源导致故障。

2. 如何解决?

概括起来有几种常见的办法(包括软件,硬件),比如上级干预,内部联络,自己反省,延时处理.

我们假设梁山好汉108人失散了,各54人,宋江卢俊义各率领一半,都以为另外一半挂了,就分别成立了梁山忠义堂。那么双方见面之后,怎么决定谁是老大呢?

a. 上级干预: 使用额外的探测节点,当双方直连断开之后,使用一个约定好的共同节点来探测是否是直连故障。 回到梁山这里,就是两帮好汉都去九天玄女庙,让玄女娘娘指定谁是老大.

b. 专线直连 假如宋江这伙里面有解珍,卢俊义这里有解宝。哥俩之间有特殊心跳联系。所以两帮人知道大家实际都没挂,所以不会分别内部选举而是等待重聚时候再选老大

c. 过半机制 只有某个子集群超过原集群数目一半,才允许选出老大 梁山这里,因为都是54人,都不超过一半,所以都不能选举,只能等待重聚时候选老大

d. 延长选举时间 比如es有参数,据此参数决定从节点访问主节点后如果n秒之内没有回复则默认主节点挂了。这个参数可以调大。 梁山这里,就是约好了如果失散之后1个月联系不上,才能选举老大。现在调整为1年之后才能选举。那么1年之内其实重聚的可能性很大。

3. 具体案例

a. Zookeeper采用“过半机制”解决

在领导者选举过程中,如果某台zkserver获得了超过半数的选票,则此zkServer就可以成为leader了。 关键代码:

return (set.size() > n/2);
n 表示旧集群中zkServer参与者的数目
set标是故障之后,本子集群的参与者个数。

关键点是:必须超过原集群的半数才能成为leader。这就保证了无论怎么出现故障分裂,所以子集群中或者都没有leader,或者只有一个leader(该子集群超过半数了)。比如原来6台,n/2=3。如果分裂成两个3台的子集群,则都没有leader,如果一个4台,一个2台,则4台的会成为leader.

b. ElasticSearch有调节参数

 discovery.zen.ping_timeout:3    

此参数指定从节点访问主节点后如果3秒之内没有回复则默认主节点挂了,我们可以适当的把它改大,改成5到6秒这样可以减少出现脑裂的概率。

discovery.zen.minimum_master_nodes:1

该参数的意思是,当具备成为主节点的从节点的个数满足这个数字且都认为主节点挂了则会进行选举产生新的主节点。 例如:es集群有三个从节点有资格成为主节点,这时这三个节点都认为主节点挂了则会进行选举,此时如果这个参数的值是4则不会进行选举。 我们可以适当的把这个值改大,减少出现脑裂的概率,官方给出的建议是(n/2)+1。

4. 参考:

https://my.oschina.net/u/236698/blog/525413

https://mp.weixin.qq.com/s/VlkK_Lb-ZlGcYi-QfHC22Q

https://blog.csdn.net/ty4315/article/details/52491799

[梁山好汉说IT] 如何理解脑裂问题的更多相关文章

  1. [梁山好汉说IT] 如何理解一致性Hash

    [梁山好汉说IT] 如何理解一致性Hash 0x00 摘要 用梁山酒店分配客人为例来理解一致性Hash. 0x01. 与经典哈希方法的对比 经典哈希方法:总是假设内存位置的数量是已知且固定不变的.因为 ...

  2. ES脑裂问题

    脑裂:一个集群中的不同节点对于集群的状态有了不一样的理解 ES集群的总体状态是red,本来9个节点的集群在结果中只显示4个节点在线: 正常情况下,集群中的所有节点应该对集群中的master的选择是一致 ...

  3. centos HA高可用集群 heartbeat搭建 heartbeat测试 主上停止heartbeat服务 测试脑裂 两边都禁用ping仲裁 第三十二节课

    centos   HA高可用集群  heartbeat搭建 heartbeat测试  主上停止heartbeat服务  测试脑裂  两边都禁用ping仲裁  第三十二节课 heartbeat是Linu ...

  4. keepalived脑裂问题

    一.对脑裂的理解 在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体.动作协调的HA系统,就分裂成为2个独立的个体.由于相互失去了联系,都以为是对方出了故障.两个节点上的HA软件像 ...

  5. [梁山好汉说IT] 容器概念在北宋社会的应用

    [梁山好汉说IT] 容器概念在北宋社会的应用 0x00 摘要 如何对没有软件开发经验的人解释容器? 集装箱真的能够完美解释容器嘛? 除了集装箱还有其他常见实体能够解释容器嘛? 我找到了一个能够 和集装 ...

  6. [梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树

    [梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树 0x00 摘要 记录对概念的理解,用梁山好汉做例子来检验是否理解正确. 0x01 IT概念 1. 事物的信息和信息熵 1.1 事物的 ...

  7. 脑裂 CAP PAXOS 单元化 网络分区 最终一致性 BASE

    阿里技术专家甘盘:浅谈双十一背后的支付宝LDC架构和其CAP分析 https://mp.weixin.qq.com/s/Cnzz5riMc9RH19zdjToyDg 汤波(甘盘) 技术琐话 2020- ...

  8. 【Redis集群原理专题】分析一下相关的Redis集群模式下的脑裂问题!

    技术格言 世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程. 什么是脑裂 字面含义 首先,脑裂从字面上理解就是脑袋裂开了,就是思想分家了,就是有了两个山头,就是有了 ...

  9. Zookeeper的选举算法和脑裂问题

    ZK介绍 ZK = zookeeper ZK是微服务解决方案中拥有服务注册发现最为核心的环境,是微服务的基石.作为服务注册发现模块,并不是只有ZK一种产品,目前得到行业认可的还有:Eureka.Con ...

随机推荐

  1. 说说iOS与内存管理(上)

    http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...

  2. [软考]之软件过程模型II 标签: 软件工程 2015-11-01 11:52 1612人阅读 评论(22) 收

    上一篇博客总结了瀑布模型/V模型/增量模型这三种软件模型,然而我们还有一个很重要的问题忘了回答,那就是,什么是软件过程模型? 什么是软件过程模型? 软件过程是软件开发与维护的工作流程和工艺流程,是软件 ...

  3. windows 下的 Apache 二级域名 目录绑定配置

    通常我们注册的域名都是顶级域名  如 www.potatog.com,我们希望这个域名可以访问服务器的不同网站或者不同功能等等 可能会这样 www.potatog.com/api 或者 www.pot ...

  4. @noi.ac - 508@ 01背包

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一天你学了一个能解决01背包问题的算法,你决定将这个算法应用到 ...

  5. jqLite

    一.关于DOM导航的jqLite方法 children() 返回一组子元素.这个方法的jqLite实现不支持jQuery所提供的选择器特性 eq(index) 从一个元素集合中返回指定索引下的元素 f ...

  6. DOMjudge配置

    DOMjudge配置补充 系统环境为 Debbian GNU/Linux 9 (stretch) 64-bit 在Web server configuration中, ln -s etc/apache ...

  7. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...

  8. Python--day62--Django安装,配置,web请求流程,views.py总结

    1,安装Django 2,创建Django项目: 3,配置Django项目 1.settinngs.py文件 1.templates文件夹的位置 2.静态文件 1,STATIC_URL   ----- ...

  9. Python--day25--抽象类

    什么是抽象类: 抽象类: #一切皆文件 import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta): all_type='file' ...

  10. JPA 一对多、多对一注解

    1. @OneToMany @OneToMany 是属性或方法级别的注解,用于定义源实体与目标实体是一对多的关系. 参数 类型 描述 targetEntity Class 源实体关联的目标实体类型,默 ...