为什么需要Zookeeper
- 例如namenode,如果没有zk,namenode读写请求要同时向主从namenode发起请求,增加额外开销
Zookeeper是什么
- 分布式应用程序协调服务
- 集群的管理者,监控着集群中各个节点的状态,根据节点节点提交的反馈进行下一步合理的操作
Zookeeper提供了什么
- 文件系统
- 通知机制
Zookeeper文件系统
- 分层的文件存储目录树结构,不同于文件存储系统的目录,文件存储系统目录只能存储目录,而zk的节点可以存储数据,但不适合存储大量数据,最多1m
ZNode的四种类型
- 概述:
- 节点类型在创建时就要确定,一旦创建,无法改变
- 当多个session都要使用一份相同的数据,数据共享,这时要用持久化节点,一份就可以
- 当每个session都要不同的数据,并且会话结束就要删除,用临时节点,例如高可用配置
- 持久化存储节点
- 客户端(session会话)与zk断开,该节点依旧存在
- 顺序持久化存储节点
- 客户端(session会话)与zk断开,该节点依旧存在,只是zk给该节点名称进行顺序编号
- 临时存储节点
- 客户端(session会话)与zk断开,该节点删除
- 顺序临时存储节点
- 客户端(session会话)与zk断开,该节点删除,只是zk会给该节点名称进行顺序编号
Zookeeper的通知机制
- 客户端注册监听(watch)他关心的目录节点,当该目录节点发生变化(增删改查),就会触发watch所关联的操作,zk会向客户端发送且仅发送一条通知给客户端,这些客户端会根据接到的znode的变化做出业务上的改变,如namenode,用于集群多节点一致性事务处理
Zookeeper都能做什么
- 分布式命名服务
- 创建一个路径后,节点路径全局唯一,可作为全局名称使用。这个名字可指向集群中的节点,提供服务的地址, 或是一个远程对象
- 配置管理
- 程序分布式部署在不同的机器上,将程序的配置放在zk的znode下,当有配置(znode)发生改变时,利用watcher通知给各个客户端,从而实现更改配置
- 集群管理
- 集群是否有机器加入、删除
- 每个加入集群的机器都会在父目录注册一个节点,并写入自己的状态。监控父节点的用户接到通知进行相应的处理。这个机器离开时也会删除节点,监控节点的用户也会接到通知
- 选举master
- 集群是否有机器加入、删除
- 分布式锁
- ZK能保证数据的强一致性,用户任何时候都可以相信集群中的每个节点的数据都是相同的
- 两种形式锁
- 独占锁 ,例如ZKFC
- 一个用户创建一个节点作为锁,另一个用户检测到该节点,代表别的用户已经锁住,如果不存在,则可以创建一个节点,代表拥有锁
- 时序锁
- 有一个节点作为父节点,其地下都是带有编号的子节点。所有想要获取锁的用户,需要在父节点下获取带有编号的子节点,编号最小的会或得锁,当编号最小的锁被释放,在重新找一个最小编号获取锁,保证或得锁的有序性
- 独占锁 ,例如ZKFC
- 队列管理
- 同步队列
- 当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。例如在约定目录下创建临时目录节点,监听节点目录树是否是我们要求的目录数
- FIFO队列
- 与时序锁原理类似
- 同步队列
-
Zookeeper的工作原理
- 最核心: 原子广播(zab协议),全称zookeeper原子消息广播协议,是一种崩溃可恢复的原子消息广播算法
- zab协议之恢复模式(选主)
- 当系统启动或者leader崩溃后,Zab进入恢复模式,恢复模式时是不接受客户端请求的,当领导者被选出来,且大多数server完成了和leader的状态同步后,接触恢复模式。保证了leader和server的相同状态同步
- zab协议之广播模式(同步)
- leader选举出来后进入消息广播模式
-
Zab协议三个阶段
- Leader选举
- 哪台服务器上的数据较新(ZXID较大),哪台就最有可能成为leader,通过选举线程依次比较,如果ZXID相同,则比SID,最终的服务器就是leader
- 同步
- follower连接leader,发送给它最大的事务id,leader确认同步点,发送需要同步的消息
- Leader服务器会为每个Follower服务器都准备一个队列,并将那些没有被各个Follower同步的事务以消息的形式逐个发给Follower服务器,然后leader在发送一个commit消息给follower,表示该事物已被提交,等到Follower服务器消息同步完整后,leader才真正将follower加入到follower列表中
- 广播
- Leader会为每个follower服务器分配一个FIFO的队列,follower收到事务消息后以事务日志的形式写入到磁盘,写入成功后,会给leader服务器回复一个ACK
- 名词:
- ZXID:事务id,标记唯一一次服务器状态的变更,64位的数字
- SID:服务器标识id
- Leader选举