ZooKeeper入门

ZooKeeper入门

Scroll Down

cropped-1366-768-108045

今天打算系列回顾一下 Zookeeper,把相关知识点做个记录,方便查阅。今年的5月份,我给自己定的目标,就是要系统回顾所学的知识,废话不多说,开始搞起。

什么是ZooKeeper

ZooKeeper 是一个分布式的,开源分布式应用程序协同服务。

ZooKeeper 应用场景

典型应用场景:

  • 配置管理
  • DNS服务
  • 组成员管理
  • 各种分布式锁

ZooKeeper 适用于存储和协同相关的关键数据,不适合用于大数据量存储

为什么不适合大数据存储?
Zookeeper 为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这个特性使得 Zookeeper不能用于存放大量的数据,每个节点数据存放上限为1M。

ZooKeeper 数据模型

ZooKeeper的数据模型是层次模型,可以叫做文件系统模型。还有一种主流的模型是K-V模型,那为什么ZooKeeper要采用树模型呢?

理由有以下两点:

  1. 文件系统的树型结构便于表达数据之间的层次关系
  2. 文件系统的树形结构便于为不同的应用分配独立的命名空间

结构类似以下简图
Zk节点示例

ZooKeeper把节点节点叫做 Znode,每一个 Znode 都有一个版本号,版本号在同一层级单调递增。

Znode的分类

Znode分为4类:

  1. 持久化节点:不管 ZooKeeper 是否宕机,或者 Client 宕机,只要这个节点创建出来就不会丢失。
  2. 临时节点:ZooKeeper 宕机,或者 Client 在指定的 timeout 时间内没有连接 server,这个节点会丢失。
  3. 持久有序节点:除了具备持久化节点的特性外,节点间还有顺序。
  4. 临时有序节点:除了具备临时性节点的特性外,节点间还有顺序。

Zookeeper 的watcer 机制

Zookeeper 允许客户端像服务端注册watch 事件来监听 znode 的变化,当服务器完成数据处理时,会通过事件通知的形式来告诉客户端,客户端可以根据服务端返回来的WatchEvent 来做进一步的业务处理。

watcer 机制有什么好处?
watch 提供一个让客户端获取最新数据的机制。如果没有watch 机制,客户端需要不断的轮询 Zookeeper 来查看数据是否更新,这种方式在分布式环境中十分耗时,效率也不高。

有了这个 water 机制,我们可以用它来实现分布式锁、统一的配置管理、统一的命名服务。

Zookeeper保证的分布式一致性特性

  1. 顺序一致性
    从同一个客户端发起的事务请求,最终将会严格按照其发起顺序被应用到 ZooKeeper 中。
  2. 原子性
    所有事务请求的结果在集群中所有机器上的应用情况都是一致的,也就是说整个集群要么全部成功应用某一个事务,要么都没有应用。
  3. 单一视图
    无论客户端连接的是哪个 ZooKeeper 服务器,其看到的数据端数据模型都是一致的
  4. 可靠性
    一旦服务端成功应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更会被一致保留下来,除非有另一个事务对其进行了修改
  5. 最终一致性
    Zookeeper 仅仅保证在一定时间内,客户端最终一定能够从服务端上读取到最新的数据状态。

ZooKeeper 数据快照

数据快照是 ZooKeeper 数据存储中一个非常核心的运行机制。数据快照用来记录 Zookeeper 服务器上某一时刻的全量内存数据内容,并将其系欸入道指定的磁盘文件中,可以配置 dataDir 的路径来自行决定存放位置。
配置文件还有个参数叫 snapCount,表示的是两次快照之间的事务操作个数,ZooKeeper 节点记录完事务日志后,会统计判断是否需要做数据快照,判断条件是距离上次快照,事务操作次数等于snapCount/2~snapCount中的某个值,会触发快照生成操作,随机值是为了避免所有节点同时生成快照,导致集群响应缓慢。

Master-Worker架构

master-worker 是一个广泛使用的分布式架构。master-worker 架构中有一个master负责监控 worker 的状态,并为 worker 分配任务

Master-Worker架构有如下特点

  1. 在任何时刻,系统最多只能有一个 master,不可以出现两个 master 的情况,多个 master 共存会导致脑裂。
  2. 系统除了处于 active 状态的 master 还有一个backup master,如果 active master 失败了,backup master 可以很快的进入active状态。
  3. master实时监控 worker 的状态,能够及时收到 worker 成员变化的通知。master 在收到 worker 成员变化的时候,通常重新进行任务的分配。

ps:脑裂就是说存在两个master或者存在两个leader,彼此之间数据同步,数据冲突都不好解决,会导致数据乱套。

像 Kafka 里面就有用到这个 Master-Worker 架构,Kafka 里面的 broker 就相当于Worker,它会从broker中选出一个 controller 作为 master,进行 worker的 topic partion 的分配。
kafka-mater-worker

Zookeeper实现Master-Worker协同

  1. 使用一个临时节点/master表示 master。master 在行使 master 的职能之前,首先要创建这个 znode。如果能创建成功,进入active状态,开始行使master职能。否则,进入 backup 状态,使用 watch 机制监控 master。假设系统中有一个 active master 和一个 backup master。如果 active master失败,它创建的/master就会被 Zookeeper 自动删除,这是 backup master 就会收到通知,通过再次创建。/master节点成功为新的 active master。
  2. worker 通过在/workers节点下面创建临时节点来加入集群。
  3. 处于 active 状态的 master 会通过 watch 机制监控/workers下面 znode 列表来实时获取 worker 成员的变化。