[梁山好汉说IT] 如何理解脑裂问题
[梁山好汉说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] 如何理解脑裂问题的更多相关文章
- [梁山好汉说IT] 如何理解一致性Hash
[梁山好汉说IT] 如何理解一致性Hash 0x00 摘要 用梁山酒店分配客人为例来理解一致性Hash. 0x01. 与经典哈希方法的对比 经典哈希方法:总是假设内存位置的数量是已知且固定不变的.因为 ...
- ES脑裂问题
脑裂:一个集群中的不同节点对于集群的状态有了不一样的理解 ES集群的总体状态是red,本来9个节点的集群在结果中只显示4个节点在线: 正常情况下,集群中的所有节点应该对集群中的master的选择是一致 ...
- centos HA高可用集群 heartbeat搭建 heartbeat测试 主上停止heartbeat服务 测试脑裂 两边都禁用ping仲裁 第三十二节课
centos HA高可用集群 heartbeat搭建 heartbeat测试 主上停止heartbeat服务 测试脑裂 两边都禁用ping仲裁 第三十二节课 heartbeat是Linu ...
- keepalived脑裂问题
一.对脑裂的理解 在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体.动作协调的HA系统,就分裂成为2个独立的个体.由于相互失去了联系,都以为是对方出了故障.两个节点上的HA软件像 ...
- [梁山好汉说IT] 容器概念在北宋社会的应用
[梁山好汉说IT] 容器概念在北宋社会的应用 0x00 摘要 如何对没有软件开发经验的人解释容器? 集装箱真的能够完美解释容器嘛? 除了集装箱还有其他常见实体能够解释容器嘛? 我找到了一个能够 和集装 ...
- [梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树
[梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树 0x00 摘要 记录对概念的理解,用梁山好汉做例子来检验是否理解正确. 0x01 IT概念 1. 事物的信息和信息熵 1.1 事物的 ...
- 脑裂 CAP PAXOS 单元化 网络分区 最终一致性 BASE
阿里技术专家甘盘:浅谈双十一背后的支付宝LDC架构和其CAP分析 https://mp.weixin.qq.com/s/Cnzz5riMc9RH19zdjToyDg 汤波(甘盘) 技术琐话 2020- ...
- 【Redis集群原理专题】分析一下相关的Redis集群模式下的脑裂问题!
技术格言 世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程. 什么是脑裂 字面含义 首先,脑裂从字面上理解就是脑袋裂开了,就是思想分家了,就是有了两个山头,就是有了 ...
- Zookeeper的选举算法和脑裂问题
ZK介绍 ZK = zookeeper ZK是微服务解决方案中拥有服务注册发现最为核心的环境,是微服务的基石.作为服务注册发现模块,并不是只有ZK一种产品,目前得到行业认可的还有:Eureka.Con ...
随机推荐
- Session机制在页面间保持Cookie——大街网
解决Cookie有效期,页面间Cookie传递 解決大规模,长期有效采集. 之前做一个项目,要采集招聘网站的职位信息,智联,拉钩,中华英才,BOOS,大街网,写完了前4个,大街网数据加载方式是AJAX ...
- C++笔记:面向对象编程(Handle类)
句柄类 句柄类的出现是为了解决用户使用指针时须要控制指针的载入和释放的问题. 用指针訪问对象非常easy出现悬垂指针或者内存泄漏的问题. 为了解决这些问题,有很多方法能够使用,句柄类就是当中之中的一个 ...
- SDUT-2133_数据结构实验之栈与队列三:后缀式求值
数据结构实验之栈与队列三:后缀式求值 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运算符的后缀表示式 ...
- HDU-6290_奢侈的旅行(Dijstra+堆优化)
奢侈的旅行 Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Problem De ...
- H3C 路由器的特点
- oracle用>=替代>
如果DEPTNO上有一个索引, 高效: SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3 两 ...
- Logback设置SQL参数打印
一.hibernate中设置SQL参数打印: (主要是第一句) <logger name="org.hibernate.type.descriptor.sql.BasicBinder& ...
- <STL源码剖析> 6.3.6 power
计算power的算法说明 http://www.sxt.cn/u/324/blog/2112 翻译自 http://videlalvaro.github.io/2014/03/the-power-a ...
- Spring Cloud探路(三)REST 客户端Feign
Declarative REST Client: Feign Feign is a declarative web service client. It makes writing web servi ...
- git update-index --assume-unchanged
有的时候,不小心提交了一个配置文件config.php,每次在本地开发测试之后,都需要更改配置文件.相当麻烦. 使用 git update-index --assume-unchanged /pa ...