1.什么是zookeeper?
ZooKeeper是一个开放源码的分布式应用程序协调服务,主要为了解决分布式架构下数据一致性问题,典型的应用场景有分布式配置中心、分布式注册中心、分布式锁、分布式队列、集群选举、分布式屏障、发布/订阅等场景。
2.zookeeper的数据结构
zooKeeper的视图数据结构,很像Unix文件系统,也是树状的,这样可以确定每个路径都是唯一的。zookeeper的节点统一叫做znode,它是可以通过路径来标识,结构图如下:
3.zookeeper服务器的角色
- Leader
- Leader服务器是整个ZooKeeper集群工作机制中的核心,其主要工作:事务请求的唯一调度和处理者,保证集群事务处理的顺序性 集群内部各服务的调度者。
- Follower
- Follower服务器是ZooKeeper集群状态的跟随者,其主要工作:处理客户端非事务请求,转发事务请求给Leader服务器 参与事务请求Proposal的投票 参与Leader选举投票。
- Observer
- Observer是3.3.0 版本开始引入的一个服务器角色,它充当一个观察者角色------观察ZooKeeper集群的最新状态变化并将这些状态变更同步过来。其工作:处理客户端的非事务请求,转发事务请求给 Leader 服务器 不参与任何形式的投票。
4.zookeeper下Server工作状态
- Looking
- 寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
- Following
- 跟随者状态。表明当前服务器角色是Follower。
- Leading
- 领导者状态。表明当前服务器角色是Leader
- Observering
- 观察者状态。表明当前服务器角色是Observer。
5.znode的4种类型
- 持久节点(PERSISTENT)
- 这类节点被创建后,就会一直存在于Zk服务器上。直到手动删除。
- 持久顺序节点(PERSISTENT_SEQUENTIAL)
- 它的基本特性同持久节点,不同在于增加了顺序性。父节点会维护一个自增整性数字,用于子节点的创建的先后顺序。
- 临时节点(EPHEMERAL)
- 临时节点的生命周期与客户端的会话绑定,一旦客户端会话失效(非TCP连接断开),那么这个节点就会被自动清理掉。zk规定临时节点只能作为叶子节点。
- 临时顺序节点(EPHEMERAL_SEQUENTIAL)
- 基本特性同临时节点,添加了顺序的特性。
6.zookeeper的特性
- 顺序一致性
- 从同一个客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到Zookeeper中去。
- 原子性
- 所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,即整个集群要么都成功应用了某个事务,要么都没有应用。
- 单一视图
- 无论客户端连接的是哪个 Zookeeper 服务器,其看到的服务端数据模型都是一致的。
- 可靠性
- 一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会一直被保留,除非有另一个事务对其进行了变更。
- 实时性
- Zookeeper 保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。
7.znode里存储的内容
Znode包含了存储数据、访问权限、子节点引用、节点状态信息,如图:
8.zookeeper watch机制
zookeeper 允许客户端向服务端的某个Znode注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据 Watcher通知状态和事件类型做出业务上的改变。
理解: 客户端注册在某个Znode上的触发器,当这个Znode节点发生变化时(增删改查),就会触发Znode对应的注册事件,注册的客户端就会收到异步通知,然后做出业务的改变。
8.1 watch机制的工作
ZooKeeper的Watcher机制主要包括客户端线程、客户端 WatcherManager、Zookeeper服务器三部分。客户端向ZooKeeper服务器注册Watcher的同时,会将Watcher对象存储在客户端的WatchManager中。当zookeeper服务器触发watcher事件后,会向客户端发送通知, 客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。
8.2 watcher特性总结
- 一次性:一个Watch事件是一个一次性的触发器。一次性触发,客户端只会收到一次这样的信息。
- 异步的: Zookeeper服务器发送watcher的通知事件到客户端是异步的,不能期望能够监控到节点每次的变化,Zookeeper只能保证最终的一致性,而无法保证强一致性。
- 轻量级: Watcher 通知非常简单,它只是通知发生了事件,而不会传递事件对象内容。
变化,Zookeeper只能保证最终的一致性,而无法保证强一致性。 - 轻量级: Watcher 通知非常简单,它只是通知发生了事件,而不会传递事件对象内容。
- 客户端串行: 执行客户端 Watcher 回调的过程是一个串行同步的过程。