选举机制
-
半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
-
Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点 为Leader,其他节点为Follower。Leader是通过内部的选举机制临时产生的。
-
选举机制的流程如下:
假设现在有五台服务器组成的Zookeeper集群,它们的id从1-5。现在这五个都是最新的,没有启动过的。依次启动这五个节点:
- 启动节点1,它给自己投票,然后发送投票信息,此时只有它一台服务器,它发出去的任何报文没有任何响应,所以它的选举状态一直是LOOKING状态。
- 启动节点2,它给自己投票,同时与最开始启动的节点1进行通信,互相交换自己的选举结果,由于两种都是新启动的节点,没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上,所以两个服务器的状态依然是LOOKING状态。
- 启动节点3,它给自己投票,同时与服务器1,2交换信息。由于节点3的编号最大,所以节点3胜出,此时的票数刚好大于半数,所以节点3成为Leader,节点1,2成为Follower。
- 节点4和节点5启动时,依然都投自己一票,找与其他节点交换信息时,发现已经有Leader了,所以它们只能成为Follower。
节点类型
-
持久型
客户端和zookeeper断开连接后,创建的节点不删除
一类是创建的节点没有顺序编号,是唯一的
一类是创建的节点有顺序编号。在创建ZNode时设置顺序标识,ZNode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
-
短暂型
客户端和服务器端断开连接后,创建的节点自己删除
同样有不添加顺序编号和添加顺序编号两种。
顺序编号可用于在分布式系统中为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。
Stat结构说明
#创建节点的事务
cZxid = 0x200000015
#znode被创建的时间
ctime = Wed May 20 22:27:26 CST 2020
#最后更新的事务zxid
mZxid = 0x200000015
#最后修改的毫秒数
mtime = Wed May 20 22:27:26 CST 2020
#最后更新的子节点zxid
pZxid = 0x200000015
#子节点变化号,znode子节点修改次数
cversion = 0
#数据变化号
dataVersion = 0
#访问控制列表的变化号
aclVersion = 0
#如果该节点是临时节点,这个节点拥有着的session id。如果不是临时节点则是0
ephemeralOwner = 0x0
#数据的长度
dataLength = 3
#子节点数量
numChildren = 0