Zookeeper的工作原理

    技术2025-02-28  12

    目录

    zk的选举机制

    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的集群个数为啥最好是奇数个?

     

    zk集群提供服务有一个特点:一是必须有超过半数集群正常工作,集群才能提供服务。

    现在假设有3台集群:最大只能容忍1台机器宕机,集群还能正常工作。

    如果假设有4台集群:最大也只能容忍一台机器宕机,集群还能正常工作。因此多一台无法影响整体集群是否能提供服务,因此技术台会较少不必要的zk节点

     

     

    zk的节点类型

     

    分为持久和短暂

     

     

    zk的监听器原理

     

    监听器常用于监听节点数据的变化以及子节点增减的变化,其工作原理如下

    1.首先要有一个main()线程

    2.main线程中创建zk客户端。zk客户端包含两个线程:负责网络通信的connect和负责监听的listener

    3.通过connect线程将注册的监听事件发给zk

    4.将注册监听事件添加到zk的监听器列表中

    5.当zk监听到数据或路径有变化,就会将这个消息发送给listener线程

    6.listener线程内部调用了process()方法对监听的结果进行处理

     

     

    向zk集群中注册服务的原理

     

    Processed: 0.009, SQL: 9