zookeeper集群搭建及ZAB协议
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协议的更多相关文章
- Zookeeper集群搭建以及python操作zk
一.Zookeeper原理简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目 ...
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
- java 学习笔记(三)ZooKeeper集群搭建实例,以及集成dubbo时的配置 (转)
ZooKeeper集群搭建实例,以及集成dubbo时的配置 zookeeper是什么: Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式 ...
- Zookeeper集群搭建及原理
1 概述 1.1 简介 ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分 ...
- 分布式架构中一致性解决方案——Zookeeper集群搭建
当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...
- kafka学习(二)-zookeeper集群搭建
zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是h ...
- 分布式协调服务Zookeeper集群搭建
分布式协调服务Zookeeper集群搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装jdk环境 1>.操作环境 [root@node101.yinzhengjie ...
- Zookeeper 集群搭建--单机伪分布式集群
一. zk集群,主从节点,心跳机制(选举模式) 二.Zookeeper集群搭建注意点 1.配置数据文件 myid 1/2/3 对应 server.1/2/3 2.通过./zkCli.sh -serve ...
- Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建
Zookeeper是一种在分布式系统中被广泛用来作为:分布式状态管理.分布式协调管理.分布式配置管理.和分布式锁服务的集群.kafka增加和减少服务器都会在Zookeeper节点上触发相应的事件kaf ...
随机推荐
- js constructor typeOf 区别
constructor 属性返回对创建此对象的数组函数的引用. 例如:const obj = {a: 1} console.log(obj.constructor) // funct ...
- [SNOI2019]纸牌
传送门 Description 有一副纸牌.牌一共有\(n\)种,分别标有 \(1,2,...,n\),每种有\(C\)张.故这副牌共有\(nC\)张. 三张连号的牌(\(i,i+1,i+2\))或三 ...
- csp退役前的做题计划1(真)
csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさん ...
- 服务器收不到支付宝notify_url异步回调请求的问题排查
小背景 最近在调整支付宝支付的功能时发现,不能够正常接收支付宝付款成功之后的回调通知了,从代码到配置最后到服务器配置都排查了一遍,最终发现问题原因竟然是因为我们的回调地址notify_url是http ...
- conda中重要的三个概念:环境、通道和包
基本使用conda必须要了解的三个概念:虚拟环境.通道和包. conda提供了在python环境下重要的编程环境管理功能,包括环境隔离和依赖包管理. 环境隔离通过虚拟环境实现,与此相关的命令有: co ...
- 第09组 Alpha冲刺(2/4)
队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:http://edu.cnblogs.com/campus/fzu/SoftwareEngineeri ...
- curl抓取页面时遇到重定向的解决方法
用php的curl抓取网页遇到了问题,为阐述方便,将代码简化如下: <?php function curlGet($url) { $ch = curl_init(); curl_setopt($ ...
- 使用良好的自定义X264编码,取得极佳质量!《转》
原帖地址:http://www.xspliter.com/forum.php?mod=viewthread&tid=447 一般直播时使用A设定即可.你尝试设置并找出你最满意的设定 A为最需最 ...
- qemu-img convert -c disk /var/lib/nova/instances/_base/94a107318b54108fc8e76fff21a86d7c390a20bf -O qcow2 hebin.qcow2
- mysql查询列定义,是否自增等
SELECT ORDINAL_POSITION AS Colorder, Column_Name AS ColumnName, data_type AS TypeName, COLUMN_COMMEN ...