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,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如下图:
(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的工作流程简图如下所示,实际上流程要比下图复杂得多,启动了三个线程来实现功能:
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只会把数据加载到内存。
Zookeeper客户端向服务端写数据流程
一、写流程之写入请求直接发送给Leader节点
- 1)客户端给Leader节点发送了一个写数据的请求,Leader会马上开始写操作,并通知第二台服务器进行写操作;
- 2)服务器进行完写操作之后,发送回应告知Leader节点已完成写操作,Leader节点检测完成写操作的服务器是否超过半数(例如上面三台服务器,只要有两台完成),超过半数立即给客户端发送通知已完成写操作;
- 3)后续Leader节点继续通知未完成写操作的服务器进行写操作,服务器写完则回答Leader节点已完成写操作。
二、写流程之写入请求直接发送给follower节点
- 1)客户端给follower节点发送了 一个写操作请求,follower没有写权限,会马上把写操作请求发送给Leader节点;
- 2)Leader节点接收到follower节点转发的写操作请求,会马上开始写操作,并通知其他服务器开始写操作;
- 3)当Leader服务器检测到超过半数的机器完成了写操作,就会通知之前收到写请求的follower节点已完成写操作,这个follower节点整理信息后再通知客户端已完成写操作。