【集群】脑裂是什么?Zookeeper是如何解决的?

这篇具有很好参考价值的文章主要介绍了【集群】脑裂是什么?Zookeeper是如何解决的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是脑裂

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

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

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

Zookeeper集群中的脑裂场景

对于一个集群,想要提高这个集群的可用性,通常会采用多机房部署,比如现在有一个由6台zkServer所组成的一个集群,部署在了两个机房:
【集群】脑裂是什么?Zookeeper是如何解决的?,# zookeeper,zookeeper,分布式,云原生

正常情况下,此集群只会有一个Leader,那么如果机房之间的网络断了之后,两个机房内的zkServer还是可以相互通信的,如果不考虑过半机制,那么就会出现每个机房内部都将选出一个Leader。
【集群】脑裂是什么?Zookeeper是如何解决的?,# zookeeper,zookeeper,分布式,云原生

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

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

刚刚在说明脑裂场景时,有一个前提条件就是没有考虑过半机制,所以实际上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了,这样比较快,所以叫快速领导者选举算法呗。

那么再来想一个问题,过半机制中为什么是大于,而不是大于等于呢?
这就是更脑裂问题有关系了,比如回到上文出现脑裂问题的场景:
【集群】脑裂是什么?Zookeeper是如何解决的?,# zookeeper,zookeeper,分布式,云原生

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

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

如果假设我们现在只有5台机器,也部署在两个机房:
【集群】脑裂是什么?Zookeeper是如何解决的?,# zookeeper,zookeeper,分布式,云原生

此时过半机制的条件是set.size() > 2,也就是至少要3台服务器才能选出一个Leader,此时机房件的网络断开了,对于机房1来说是没有影响的,Leader依然还是Leader,对于机房2来说是选不出来Leader的,此时整个集群中只有一个Leader。
所以,我们可以总结得出,有了过半机制,对于一个Zookeeper集群,要么没有Leader,要没只有1个Leader,这样就避免了脑裂问题。文章来源地址https://www.toymoban.com/news/detail-575604.html

到了这里,关于【集群】脑裂是什么?Zookeeper是如何解决的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【zookeeper】zookeeper集群安装

    实际的生产使用中,我们一般推荐搭建奇数多节点的zookeeper集群,如3/5/7。在本次测试中,我使用了centos7 三台服务器搭建,复用了我搭建k8s集群的环境,如下表。 IP hostname 192.168.2.140 k8s-m1 192.168.2.141 k8s-m2 192.168.2.142 k8s-m3 此次部署的zookeeper版本为3.7.1 由于zookeeper服务需要java,

    2024年02月10日
    浏览(59)
  • 解决ZooKeeper集群的启动报错,出现Error contacting service. It is probably not running问题

    输入ZooKeeper启动命令zkServer.sh start之后,显示STARTED 我们使用jps查看状态: 这里面看起来好像是启动了,但是我们用上面的再用命令zkServer.sh status查看状态时,出现报错: 报错显示:JMX enabled by default Using config: /usr/ocal/soft/zookeeper-3.4.6/bin/…/conf/zoo.cfgError contacting service. It is

    2024年02月05日
    浏览(54)
  • Zookeeper集群搭建记录 | 云计算[CentOS7] | Zookeeper集群搭建

    本系列文章索引以及一些默认好的条件在 传送门 在配置Zookeeper之前,建议先配置Hadoop集群,具体的操作流程博主已更新完成,链接 Zookeeper的安装包版本不太相同,大致分为有编译过的和没有编译过的(如有错请留言指正 一般情况下对于我们在解压配置就能使用的情况下,我

    2024年02月01日
    浏览(67)
  • Zookeeper集群 + Kafka集群

    目录 一、概述 (一)Zookeeper概述 1.Zookeeper 定义 2.Zookeeper 工作机制 3.Zookeeper 特点 (1)组成 (2)全局数据一致 (3)更新请求顺序执行 (4)数据更新原子性 (5)实时性 4.Zookeeper 数据结构 5.Zookeeper 应用场景 (1)统一命名服务 (2)统一配置管理 (3)统一集群管理 (4)服

    2024年01月24日
    浏览(39)
  • Zookeeper集群 + Fafka集群

    目录 第一章Zookeeper 概述 1.1.Zookeeper 定义 1.2.Zookeeper 工作机制 1.3.Zookeeper 特点 1.4.Zookeeper 数据结构 1.5.Zookeeper 应用场景 1.6.Zookeeper 原理之选举机制 1.7.部署 Zookeeper 集群 总结 第二章消息队列概述 2.1消息队列需求原因 2.2消息队列的优点 2.3消息队列的两种模式 第三章Kafka 概念以

    2023年04月15日
    浏览(38)
  • zookeeper集群+kafka集群

    Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已

    2024年02月16日
    浏览(38)
  • zookeeper的介绍和用docker搭建zookeeper集群,以及Go语言使用zookeeper

    typora-copy-images-to: imgs 2.1、Docker官方镜像 Docker Zookeeper 2.2、Docker安装zookeeper 下载zookeeper最新版的镜像 docker inspect zookeeper用来查看zookeeper的详细信息 在/root/docker/目录下新建一个zookeeper挂载点文件夹 挂载本地文件夹并启动服务 参数解释 2.3、进入zookeeper容器客户端 方式一 运行上

    2024年02月10日
    浏览(39)
  • zookeeper1==zookeeper源码阅读,源码启动ZK集群

    下载源码 Tags · apache/zookeeper · GitHub https://codeload.github.com/apache/zookeeper/zip/refs/tags/release-3.9.1 JDK8 MAVEN3.8.6 mvn -DskipTests=true package 配置ZK1 zkServer.cmd中指出了启动类是 QuorumPeerMain QuorumPeer翻译成集群成员比较合理,Quorum集群Peer成员 在代码目录下新建data文件夹和log文件夹 并在dat

    2024年02月05日
    浏览(47)
  • 在Linux上安装Zookeeper集群(zookeeper-3.5.9)

    记录 :455 场景 :在CentOS 7.9操作系统上,使用zookeeper-3.5.9版本,在三台机器上,安装Zookeeper集群。 版本 :zookeeper-3.5.9,CentOS 7.9,Linux kernel-5.4.218。 1.主机规划 目标:使用三台主机部署Zookeeper集群。 主机app161;IP:192.168.19.161;端口:22181,28001,28501。 主机app162;IP:192.168.

    2024年02月10日
    浏览(37)
  • 【ZooKeeper高手实战】ZooKeeper 集群读写性能及生产环境参数配置

    🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景 、 中间件系列笔记 和 编程高频电子书 ! 文章导读地址:点击查看文章导读!

    2024年02月21日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包