zookeeper集群搭建非常简单,准备三台安装好zookeeper服务器,在其zoo.cfg配置中分表添加如下配置

initLimit 10 集群中的follower与leader之间完成初始化同步连接时能容忍的最多心跳数(tickTime的数量)。如果zk集群环境数据量很大,同步数据时间会变长,这种情况下可以适当调大改参数
syncLimit 2 集群中的follower与leader的请求应答时间之间最多能容忍的心跳数
server.1=node1:2881:3881
server.2=node2:2881:3881
server.3=node3:2881:3881
其中1、2、3是服务id,通过在各自的dataDir目录下创建一个名为myid的文件为每一台服务器赋予一个服务器id,myid文件,一行只包含机器id的文本,id必须唯一,数值在1-255之间,
两个端口号 第一个是follower连接leader的端口号 第二个是选举leader的端口号,node1、node2、node3对应三台服务器的ip

  配置好后,分别启动三台机器上的zookeeper,一个最小版的集群便搭建完成,可以通过日志看到相关leader和follower的信息,集群中的所有节点都可以提供服务,客户端连接时,连接串可以可以指定多个或者集群全部节点的连接地址,当一个节点不通时,客户端将自动切换到另一个节点。

  凡是涉及到集群就必然会出现数据一致性问题,ZAB协议 (原子消息广播协议)就是专门为zookeeper设计的数据一致性协议。为了保证数据一致性,客户端所有的读取在任何节点都可以,写操作只能转发给lead节点去执行。zookeeper集群中写操作流程如下

  leader服务器出现崩溃或者网络原因导致与过半的follower失去连接,zk集群就会进入崩溃修复模式,此时集群不可用,所以zookeeper集群是一个CP服务。ZAB协议规定如果一个事物proposal(提议)在一台机器上处理成功,那么所有的机器上都应该被处理成功,确保那些在leader服务器上提交的事物最终被所有服务器都提交,确保丢弃那些只在lead服务器被提出的proposal。

  为了满足ZAB的要求,在zookeeper leader选举时就必须保证选举出来的leader服务器拥有集群中所有机器的最高ZXID的事物proposal。

  ZXID(事务编号)是一个64位数字,低32位单调递增的计数器,leader每产生一个事物proposal,都会对计数器加1操作,高32位是leader纪元周期的编号,每当选举一个新leader,就会从这个leader服务器中取出最大的事物proposal的zxid,并从zxid中提取出对应的纪元值,在此基础上加1,之后此编号作为新的纪元,并将低32位从0开始重新计数。基于这样的规则可以解决事物proposal丢弃的问题,当一个包含了上一个leader周期内尚未提交的事物proposal的服务器重新加入集群,发现集群中已经存在leader,则follower的身份加入集群,此时leader服务器会根据自己服务器最后提交的事务proposal和follower上proposal比较,发现follower中有上一个leader周期内的事务proposal,leader会要求follower进行一个回退操作,回退到一个已经确实被集群中过半机器提交的最新的事务proposal

  zookeeper leader选举时确保选出的leader符合两个要求:选出的leader上有最高的zxid以及过半节点同意,内置算法有:LeaderElection FastLeaderElection AuthFastLeaderElection

  选举中的概念:服务器id,事务id,逻辑时钟(发起的投票轮数技术),选举状态 looking(竞选)、following、observing(观察,只同步不选举)、leading。

  选举算法的具体步骤:

  1、每个服务器都发起投票选举自己位lead,选举信息中包含上面的4个信息
  2、其它服务器收到投票邀请后,比较发起者的zxid是否比自己大,大则投一票,相同的话则比较服务器id,比自己大则投一票
  3、发起者收到投票反馈后,看投票数是否大于集群半数,大于则胜出称为lead,否则发起下一轮投票

  leader选举出来后 需完成follower与新leader的同步,当半数的follower同步完成后,则可以提供服务。同步过程如下:

  leader服务器会为每一个follower都准备一个队列,并将那些没有被各follower同步的事物以proposal消息的形式发送到各个follower,并在每一个proposal后跟一个comiit,follower收到消息后将其在本地应用,与leader同步后leader就会真正将该follower加入可用列表,超过半数后就可以提供服务。

  

zookeeper集群搭建及ZAB协议的更多相关文章

  1. Zookeeper集群搭建以及python操作zk

    一.Zookeeper原理简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目 ...

  2. zookeeper集群搭建及Leader选举算法源码解析

    第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...

  3. java 学习笔记(三)ZooKeeper集群搭建实例,以及集成dubbo时的配置 (转)

    ZooKeeper集群搭建实例,以及集成dubbo时的配置 zookeeper是什么: Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式 ...

  4. Zookeeper集群搭建及原理

    1 概述 1.1 简介 ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分 ...

  5. 分布式架构中一致性解决方案——Zookeeper集群搭建

    当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...

  6. kafka学习(二)-zookeeper集群搭建

    zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是h ...

  7. 分布式协调服务Zookeeper集群搭建

    分布式协调服务Zookeeper集群搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装jdk环境 1>.操作环境 [root@node101.yinzhengjie ...

  8. Zookeeper 集群搭建--单机伪分布式集群

    一. zk集群,主从节点,心跳机制(选举模式) 二.Zookeeper集群搭建注意点 1.配置数据文件 myid 1/2/3 对应 server.1/2/3 2.通过./zkCli.sh -serve ...

  9. Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建

    Zookeeper是一种在分布式系统中被广泛用来作为:分布式状态管理.分布式协调管理.分布式配置管理.和分布式锁服务的集群.kafka增加和减少服务器都会在Zookeeper节点上触发相应的事件kaf ...

随机推荐

  1. vuex如何实现数据持久化,刷新页面存储的值还存在

    1.安装: npm install vuex-persistedstate --save 2.找到store/index.js import Vue from 'vue' import Vuex fr ...

  2. python 获取 一个正整数的二进制

    #coding=utf- def getbin(a): out = "" # 辗转相除法 ): div = a mod = a % out += str(mod) ): break ...

  3. (一)Cisco DHCP Snooping原理(转载)

    采用DHCP服务的常见问题架设DHCP服务器可以为客户端自动分配IP地址.掩码.默认网关.DNS服务器等网络参数,简化了网络配置,提高了管理效率.但在DHCP服务的管理上存在一些问题,常见的有: ●D ...

  4. devops 运维平台相关知识

    1.https://choerodon.io/zh/community/ (代码 https://github.com/choerodon/choerodon) 猪齿鱼 2.https://www.o ...

  5. Windows安装Python3 curses模块

    目录 0.前提 1.pip install wheel 2.下载.whl文件 3.pip install 它 参考 0.前提 确定你已经配置好了Python相关环境,可以正常在命令行使用pip安装. ...

  6. Net core学习系列(三)——Net Core中的依赖注入

    本文通过一个维修工与工具库的例子形象的描述一下为什么要用依赖注入.它的工作原理是什么样的, 然后根据这个类比一下ASP.NET Core 中的依赖注入, 从而深刻了解它的使用方法.注意事项以及回收机制 ...

  7. ttyS 串口名称被占用

    ttyS 的串口设备名称,我一直觉得是没有问题的,今天才想起来,8250驱动命名了 ttyS的名称,需要将 8250 的驱动删除 , ttyS 的串口名称即可正常使用. 如下 这样 ttyS 的名称即 ...

  8. docker安装并运行redis

    拉取镜像: [mall@VM_0_7_centos ~]$ sudo docker pull redis:3.2 [sudo] password for mall: 3.2: Pulling from ...

  9. 2-3 【初识组件】顶部 TabBar

    VsCode中使用Emmet神器快速编写HTML代码 1 根组件下面包含了很多的子组件 组件就是控制屏幕的某一个部分,某一个区域 组件是可以相互包含的 组件是定义在类里面的,类里面有属性和方法 注解会 ...

  10. windows下根据tcp端口查询对应的进程id(端口被占用)

    如下: 查询监听LISTENING的端口1027 netstat -navo|find /i "listen"|find /i ":1027" 结果如下(最后一 ...