zookeeper

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 回调的过程是一个串行同步的过程。
相关推荐
分布式存储与RustFS1 小时前
群晖 NAS 被 C3RB3R 锁了:本地备份一起被加密,RustFS 对象锁为什么删不掉
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
lsc_blog2 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构
江华森5 小时前
4 台华为云 ECS 从零到一:我用 AI Agent 搭了一套 K3s 多节点集群,全自动、免运维、翻车实录
云原生
时间售卖铺6 小时前
Chrony与SSH实战:精准时间同步与安全远程登录
运维·安全·云原生·ssh
分布式存储与RustFS7 小时前
OpenObserve 的日志别堆本地盘:用 RustFS 当它的对象存储底座
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
阿里云云原生1 天前
11月14日杭州见丨COSCon’26 第十一届中国开源年会,阿里云四场 Agent 技术分享
云原生
阿里云云原生1 天前
关于 DeepSeek 的 SuperAgent,以及我们的实践
云原生·agent
mengge.cloud1 天前
prometheus+k8s+弹性伸缩,综合项目
云原生·容器·kubernetes·prometheus
Z21-X1 天前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
Lansonli1 天前
大数据Spark(八十七):Spark-Submit 参数详解
大数据·分布式·spark