Zookeeper

Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式

Zookeeper:一个领导者(leader),多个跟随者(follower)组成的集群。

Leader负责进行投票的发起和决议,更新系统状态

Follower用于接收客户请求并向客户端返回结果,在选举Leader过程中参与投票

集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。

全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。

更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行。

数据更新原子性,一次数据更新要么成功,要么失败。

实时性,在一定时间范围内,client能读到最新数据。

ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。很显然zookeeper集群自身维护了一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,我们称之为"znode",每一个znode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识

Zookeeper的事件通知机制

我们可以把 Watch 理解成是注册在特定 Znode 上的触发器。当这个 Znode 发生改变,也就是调用了 create,delete,setData 方法的时候,将会触发 Znode 上注册的对应事件,请求 Watch 的客户端会接收到异步通知。

具体交互过程如下:

客户端调用 getData 方法,watch 参数是 true。服务端接到请求,返回节点数据,并且在对应的哈希表里插入被 Watch 的 Znode 路径,以及 Watcher 列表。
Zookeeper_mysql

当被 Watch 的 Znode 已删除,服务端会查找哈希表,找到该 Znode 对应的所有 Watcher,异步通知客户端,并且删除哈希表中对应的 Key-Value。

Zookeeper_mysql_02

Zookeeper的ZAB协议

Zookeeper Atomic Broadcast,有效解决了 Zookeeper 集群崩溃恢复,以及主从同步数据的问题。

Zookeeper集群的节点状态

Looking :选举状态。

Following :Follower 节点(从节点)所处的状态。

Leading :Leader 节点(主节点)所处状态。

最大事务id 最大 ZXID 也就是节点本地的最新事务编号,包含 epoch 和计数两部分。epoch 是纪元的意思,相当于 Raft 算法选主时候的 term。