一、Zookeeper基本概念
Zookeeper是一个分布式协调服务的框架,主要解决分布式集群中应用系统的一致性问题。本质上是一个分布式的小文件存储系统,类似于Linux文件系统目录树结构,即分层命名空间,但Zookeeper并不是一个专门做文件存储数据的,主要作用是维护和监控存储的数据状态变化,通过监控这些状态的变化进而达到基于数据的集群管理,其节点的数据上限是1MB。
1.1、ZooKeeper特性
1)全局数据一致性:集群中每台机器的数据都是一样的
2)可靠性:请求被一台服务器接收,就会被所有的服务器接收
3)顺序性:请求先到达就行被执行,后面的按顺序执行
4)数据更新原子性:数据更新要么成功,要么失败,不存在中间状态
5)实时性:集群各个机器的消息信息会在一定间隔内全部被执行
1.2 、Zookeeper的数据模型
Zookeeper的数据模型与Linux的文件系统非常相似,拥有一个层次的命名空间,都是采用的树形层次结构,其中每一个节点被称为Znode,Znode可以拥有相应的子节点
Znode有两种节点类型,分别是临时节点和永久节点,节点的类型在创建的时候就被确定,一旦确定就不可以改变。
临时节点:该节点的生命周期依赖于他们创建的会话。当会话结束以后,临时节点将会被自动删除。临时节点不允许创建子节点。
永久节点:该节点的生命周期不依赖会话。当会话结束以后,创建的节点不会被删除。改节点只能在客户端进行删除。
Znode还有一个序列化的特性,如果在创建的时候指定,该节点名字后面回自动追加一个不断增加的序列号。序列号对于此节点的父节点来说是唯一的,这样便会记录每个子节点创建的先后顺序。所以Znode一共有四种类型的节点 (永久节点) 、(临时节点) 、(永久节点、序列化 )、(临时节点、序列化)。
1.3、Zookeeper集群角色
1)leader(主角色)
Zookeeper集群工作的核心,整个集群的领导者,老大。
事务请求(写操作)的唯一调度和处理着,保证集群事务处理的顺序性,是所有服务器的调度者。
对于create,setData,delete等有写操作的请求,则需要统一转发给leader处理,leader需要决定编号、执行操作,这个过程称为一个事务。
2)follower(从角色)
小弟,跟随者。参与集群选举。
负责处理客户端非事务(读操作)请求,转发事物请求给leader
3)observer(观察者角色)
不会参与选举投票。观察Zookeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器进行处理。
不参与选举,只会提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。
二、Zookeeper选举机制
当集群第一次启动时。或者是服务运行期间leader故障挂了,需要进行选举。
2.1、概念:
myid:服务器id,每个服务器都有自己的myid,myid越大,在选举时权重越大。
zxid:事务id,服务器中存放的数据的事务ID,值越大说明数据越新,zxid越大,在选举时权重越大。
选举过程:先判断zxid,再判断myid,当zxid相同时候,zk集群谦让(推选)制选举,优先选择myid大者为leader。
2.2、举例
Zookeeper集群搭建的时候一般选用2N+1(奇数台),假设有五台服务器,从1-5编号,没有历史数据,假设服务器依次启动。Paxos算法(分布式选举算法)
1)服务1启动,此时只有一台服务器启动,它发出去的消息没有响应,所以他的选举状态一直是LOOKING状态;
2)服务2启动,2会与1进行通信,交换自己的选举结果,由于二者都没有历史数据,id值较大的服务器胜出,但是没有达到半数以上的服务器的同意,所以1、2都是LOOKING状态;
3)服务3启动,会与1、2进行通信,(跟第2)步一样),所以将会选举出3作为leader;
4)服务4启动,跟第3)步一样,但是由于前面已经有半数的服务器选取了3,所以3任然是leader,4作为3的follower
5)服务5启动,跟4一样,成为3的follower
2.3、总结:
-
当集群第一次启动时,因为所有人的事务id相同,所以选myid大者为leader。
-
当服务运行期间leader故障挂掉时触发新一轮选举,其他服务器互相通信,将事务id最大且myid最大者为leader。
三、Zookeeper Watcher(监听机制)
3.1监听机制
总的来说可以概括Watcher为以下三个过程:
1)客户端向服务端注册Watcher;
2)服务端事件发生触发Watcher;
3)客户端回调Watcher得到触发事件情况
3.2watch机制特点
1)一次性触发:事件发生触发监听,一个watcher event就会被发送到设置监听的客户端,这种效果是一次性的,后续再次发生同样的事件,不会再次触发。
2)事件封装:ZooKeeper使用WatchedEvent对象来封装服务端事件并传递。
WatchedEvent包含了每一个事件的三个基本属性:
通知状态(keeperState),事件类型(EventType)和节点路径(path)
3)event异步发送:watcher的通知事件从服务端发送到客户端是异步的。
4)先注册再触发:Zookeeper中的watch机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端。