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. 安卓入门教程(十五)- Fragment,Service,WAMP下载

    Fragment概述 Fragment可以被嵌入到Activity中,一个Activity可以有多个Fragment. 创建Fragment public class MyFragment exten ...

  2. dropbox icloud and nustore

    dropbox icloud and nustore 这里只是写一下自己的感受. 曾经搜索无数遍, 想着用哪个比较好, 想来比较一下, 还不如自己直接用用看吧. 于是同时用了很久的 dropbx 和 ...

  3. pgsql 聚合函数array_to_string,ARRAY_AGG

    array_to_string--将sql中的数组转为字符串 ARRAY_AGG--将sql中的数据转为数组处理 以下给大家一个简单的例子即可体会: 1.需求     2.数据库中原数据   1.pn ...

  4. Linux Shell 之 对文件中的行、单词、字符进行迭代

    在进行文本文件进行处理时,对文件件中的行.单词.字符进行迭代和遍历是非常常用的操作.而将一个简单的循环用于迭代,再加上来自stdin或文件的重定向,这就是对文件中的行.单词.和字符进行迭代的基本方法. ...

  5. Python 拼接字符串的几种方式

    在学习Python(3x)的过程中,在拼接字符串的时候遇到了些问题,所以抽点时间整理一下Python 拼接字符串的几种方式. 方式1,使用加号(+)连接,使用加号连接各个变量或者元素必须是字符串类型( ...

  6. 009-MySQL循环while、repeat、loop使用

    一.循环使用 mysql常见的三种循环方式:while.repeat和loop循环.还有一种goto,不推荐使用. 前提1.创建基本表结构 # 创建表结构 drop table if exists ` ...

  7. 改进初学者的PID-初始化

    最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...

  8. TWA那些事儿

    一.参考学习 https://developer.android.google.cn/studio/ https://juejin.im/post/5cf50755e51d455d850d3aa7

  9. lint-staged那些事儿

    一.工具选型 [预提交工具](https://www.npmtrends.com/lint-staged-vs-pre-commit-vs-pretty-quick) 1.lint-staged 检查 ...

  10. [LeetCode] 741. Cherry Pickup 捡樱桃

    In a N x N grid representing a field of cherries, each cell is one of three possible integers. 0 mea ...