博客园  :: 首页  :: 联系 :: 管理

Zookeeper中的角色

Posted on 2021-07-26 08:23  天戈朱  阅读(1353)  评论(0编辑  收藏  举报

在zookeeper集群中,节点也有不同的角色,承担着不同角色。

zookeeper有三种角色:

  • 老大:Leader   (领导者)   : 客户端提供读服务和写服务。
  • 老二:Follower(跟随者)  : 为客户端提供读服务,参与Leader选举过程
  • 老三:Observer(观察者)  : 为客户端提供读服务,不参与Leader选举过程

    其中:Follower 和 Observer 归类为 Learner(学习者)

集群管理图如下:

 

Leader


 

Leader在集群中只有一个节点,可以说是老大No.1,是zookeeper集群的中心,负责协调集群中的其他节点。从性能的角度考虑,leader可以选择不接受客户端的连接

所有的跟随者Follower与观察者Observer节点的写请求都会转交给领导者Leader执行。Leader接受到一个写请求后,首先会发送给所有的Follower,统计Follower写入成功的数量。当有超过半数的Follower写入成功后,Leader就会认为这个写请求提交成功,通知所有的Follower commit这个写操作,保证事后哪怕是集群崩溃恢复或者重启,这个写操作也不会丢失。

Leader的作用

  • 在ZAB崩溃恢复之后,消息广播之前,进行集群中的数据同步;
  • 维持与Learner的心跳,接收Learner请求消息,并据不同的消息类型,进行不同的处理;
  • Learner处理的消息类型包括:PING消息、REQUEST消息、ACK消息、REVALIDATE消息等。

其中:

  • PING消息:指Learner的心跳信息;
  • REQUEST消息:是Follower发送的提议信息,包括写请求及同步请求;
  • ACK消息:是Follower的对提议的回复,超过半数的Follower通过,则commit该提议;
  • REVALIDATE消息:是用来延长SESSION有效时间。

Leader的工作流程简图如下所示,实际上流程要比下图复杂得多,启动了三个线程来实现功能:

 

Follower


Follow在集群中有多个,主要的作用有:

  • 与老大Leader保持心跳连接
  • 当Leader挂了的时候,经过投票后成为新的leader。leader的重新选举是由老二Follower们内部投票决定的。
  • 向Leader发送请求(PING请求、REQUEST消息、ACK请求、REVALIDATE消息)
  • 处理leader发来的消息与请求
  • 接收Client的请求,如果为写请求,发送给Leader进行投票;
  • 返回Client请求结果。

Follower的工作流程简图:

 

 

其中:

  • UPTODATE消息:表示同步完成;
  • REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;
  • SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的数据更新。

 

Observer


Observer角色除了不参与Leader选举和Proposal投票外,与Follower的作用相同

可以说Observer是zookeeper集群中最边缘的存在。Observer的主要作用是提高zookeeper集群的读性能。通过leader的介绍我们知道zookeeper的一个写操作是要经过半数以上的Follower确认才能够写成功的。那么当zookeeper集群中的节点越多时,zookeeper的写性能就 越差。为了在提高zookeeper读性能(也就是支持更多的客户端连接)的同时又不影响zookeeper的写性能,zookeeper集群多了一个儿子Observer,只负责:

  • 与leader同步数据
  • 不参与leader选举,没有投票权。也不参与写操作的提议过程。
  • 数据没有事务化到硬盘。即Observer只会把数据加载到内存。

 

参考资料