天天看点

zookeeper面试题汇总(选举机制,读写流程,监控原理,常用命令)

作者:Linux云计算架构

ZooKeeper 服务器有哪几种工作状态?

1. LOOKING:寻找 Leader 状态。当服务器处于该状态时,它会认为当前服务器没有 Leader,因此需要进入 Leader 选举状态。

2. FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。

3. LEADING:领导者状态。表明当前服务器角色是 Leader。

4. OBSERVING:观察者状态。表明当前服务器角色是 Observer。

zookeeper有几种角色?

Leader (领导者) : 客户端提供读服务和写服务。

Follower(跟随者) : 为客户端提供读服务,参与Leader选举过程

Observer(观察者) : 为客户端提供读服务,不参与Leader选举过程

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

ZooKeeper的常用命令?

help:显示所有操作命令

ls path [watch] :使用 ls 命令来查看当前znode中所包含的内容

ls2 path [watch]:查看当前节点数据并能看到更新次数等数据

create普通创建-s 含有序列-e 临时(重启或者超时消失)

get path [watch]: 获得节点的值

set:设置节点的具体值

stat:查看节点状态

delete:删除节点

rmr :递归删除节点

ZooKeeper的监听原理是什么?

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

(2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener) 。

(3)通过connect线程将注册的监听事件发送给Zookeeper。

(4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。

(5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。

(6) listener线程内部调用了process()方法。

常见的监听

(1)监听节点数据的变化

get path [ watch]

(2)监听子节点增减的变化

ls path [watch]

ZooKeeper的选举机制?

1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。

2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。

3)以一个简单的例子来说明整个选举的过程。

假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如下图:

zookeeper面试题汇总(选举机制,读写流程,监控原理,常用命令)

(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,所以它的选举状态一直是LOOKING状态。

(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。

(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。

(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。

(5)服务器5启动,同服务器4。

Leader

Leader在集群中只有一个节点,是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的工作流程简图如下所示,实际上流程要比下图复杂得多,启动了三个线程来实现功能:

zookeeper面试题汇总(选举机制,读写流程,监控原理,常用命令)

Follower

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

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

Follower的工作流程简图:

zookeeper面试题汇总(选举机制,读写流程,监控原理,常用命令)

其中:

  • 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只会把数据加载到内存。

Zookeeper客户端向服务端写数据流程

一、写流程之写入请求直接发送给Leader节点

zookeeper面试题汇总(选举机制,读写流程,监控原理,常用命令)
  • 1)客户端给Leader节点发送了一个写数据的请求,Leader会马上开始写操作,并通知第二台服务器进行写操作;
  • 2)服务器进行完写操作之后,发送回应告知Leader节点已完成写操作,Leader节点检测完成写操作的服务器是否超过半数(例如上面三台服务器,只要有两台完成),超过半数立即给客户端发送通知已完成写操作;
  • 3)后续Leader节点继续通知未完成写操作的服务器进行写操作,服务器写完则回答Leader节点已完成写操作。

二、写流程之写入请求直接发送给follower节点

zookeeper面试题汇总(选举机制,读写流程,监控原理,常用命令)
  • 1)客户端给follower节点发送了 一个写操作请求,follower没有写权限,会马上把写操作请求发送给Leader节点;
  • 2)Leader节点接收到follower节点转发的写操作请求,会马上开始写操作,并通知其他服务器开始写操作;
  • 3)当Leader服务器检测到超过半数的机器完成了写操作,就会通知之前收到写请求的follower节点已完成写操作,这个follower节点整理信息后再通知客户端已完成写操作。