一、Zookeeper的特点:
1,zookeeper中存在一个leader和多个follower
2,集群中只要有半数以上的节点存活,zookeeper集群就能正常服务
3,全局数据一致:每天zookeeper的server中保存同一份相同的副本
4,更新顺序性:来自同一个client的更新请求按其发送顺序依次执行
5,数据原子性,一次数据更新要么成功,要么失败
6,实时性:在一定时间范围内,client能读取到数据
二、Zookeeper的选举机制
LOOKING : 寻找Leader状态,处于该状态需要进入选举流程
LEADING : 领导者状态,表明当前角色为Leader
FOLLOWING: 跟随者,Leader已经选举出来,表明当前服务角色为Follower
OBSERVER: 观察者状态。 接收客户端请求,将客户端写请求转发给Leader,不参与投票过程,只同步Leader状态,目的是为了扩展系统,提高读取速度
选举中服务器1比服务器2的大是根据:1,zxid(事务谁更靠后);2,myid(当zxid相同就比较myid谁大)
(1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;
(2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的ID比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING
(3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;
(5)服务器5启动,同4一样当小弟。
三、ZAB协议
Zookeeper的核心是原子广播机制,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式和广播模式。
(1) 恢复模式:
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。
(2) 广播模式:
一旦Leader已经和多数的Follower进行了状态同步后,他就可以开始广播消息了,即进入广播状态。这时候当一个Server加入ZooKeeper服务中,它会在恢复模式下启动,发现Leader,并和Leader进行状态同步。待到同步结束,它也参与消息广播。ZooKeeper服务一直维持在Broadcast状态,直到Leader崩溃了或者Leader失去了大部分的Followers支持。
Broadcast模式极其类似于分布式事务中的2pc(two-phrase commit 两阶段提交):即Leader提起一个决议,由Followers进行投票,Leader对投票结果进行计算决定是否通过该决议,如果通过执行该决议(事务),否则什么也不做。
四、监听器原理
五、写数据流程
六、常用命令
help 显示所有操作命令
create 普通创建
-s 含有序列
-e 临时(重启或者超时消失)
set 设置节点的具体值
stat 查看节点状态
delete 删除节点
rmr 递归删除节点
get path [watch] 获得节点的值
ls path [watch] 使用 ls 命令来查看当前znode中所包含的内容
ls2 path [watch] 查看当前节点数据并能看到更新次数等数据
七、stat结构体
1)czxid-创建节点的事务zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
2)ctime - znode被创建的毫秒数(从1970年开始)
3)mzxid - znode最后更新的事务zxid
4)mtime - znode最后修改的毫秒数(从1970年开始)
5)pZxid-znode最后更新的子节点zxid
6)cversion - znode子节点变化号,znode子节点修改次数
7)dataversion - znode数据变化号
8)aclVersion - znode访问控制列表的变化号
9)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
10)dataLength- znode的数据长度
11)numChildren - znode子节点数量
八、Zookeeper的节点类型:
1,持久节点(PERSISTENT):
持久节点,创建后一直存在,直到主动删除此节点。
2,持久顺序节点(PERSISTENT_SEQUENTIAL):
持久顺序节点,创建后一直存在,直到主动删除此节点。在ZK中,每个父节点会为它的第一级子节点维护一份时序,记录每个子节点创建的先后顺序。
3,临时节点(EPHEMERAL):
临时节点在客户端会话失效后节点自动清除。临时节点下面不能创建子节点。
4,顺序临时节点(EPHEMERAL_SEQUENTIAL):
临时节点在客户端会话失效后节点自动清除。临时节点下面不能创建子节点。父节点getChildren会获得顺序的节点列表。