目录
zk的选举机制
zk的集群个数为啥最好是奇数个?
zk的节点类型
zk的监听器原理
向zk集群中注册服务的原理
我们已经知道只有zk集群半数以上处于正常启动时,zk才会提供服务。现在让我们来说说zk的选举机制。
假设有zk集群中有5台服务器。id为1-5,如果它们都同时启动,选举机制是怎么产生leader和follower的呢?
1.即使同时启动,总有一个是最先启动成功的。这台服务器假设编号为1,此时它检测到集群中没有半数以上的服务器启动,此时它的选举状态是LOOKING(代表寻找leader的状态)。
2.紧接着启动的是2,它与最开始的1进行通信,互相交换自己的选举结果。由于两者都没有历史数据,所以id值较大的2胜出,但由于没有达到半数以上的服务器统一选举他。因此1和2都继续保持着LOOKING状态。
3.然后服务器3也启动了,根据前面的理论,3成为了1,2,3中的老大,此时3台服务器都选举了它,leader诞生了!
4.第4个服务器启动时,因为老大已经诞生了,所以即使id编号更大,4也只能作为小弟
5.最后一个服务器启动原理也和4一样,都是弟弟~
注意,如果3号leader服务器挂掉了,重新选举时zk集群会暂停服务,重新选leader比的是ZXid(事务id)
zk集群提供服务有一个特点:一是必须有超过半数集群正常工作,集群才能提供服务。
现在假设有3台集群:最大只能容忍1台机器宕机,集群还能正常工作。
如果假设有4台集群:最大也只能容忍一台机器宕机,集群还能正常工作。因此多一台无法影响整体集群是否能提供服务,因此技术台会较少不必要的zk节点
分为持久和短暂
监听器常用于监听节点数据的变化以及子节点增减的变化,其工作原理如下
1.首先要有一个main()线程
2.main线程中创建zk客户端。zk客户端包含两个线程:负责网络通信的connect和负责监听的listener
3.通过connect线程将注册的监听事件发给zk
4.将注册监听事件添加到zk的监听器列表中
5.当zk监听到数据或路径有变化,就会将这个消息发送给listener线程
6.listener线程内部调用了process()方法对监听的结果进行处理