ZooKeeper初探

less than 1 minute read

ZooKeeper Overview 内容

ZooKeeper 是一个用于分布式应用的分布式协调服务。它提供了一系列简单的“原语”(primitive),分布式应用可以基于这些原语实现更高层级的同步、配置管理、分组和命名服务。

ZooKeeper的设计目标包括:

  • 简单(simple):数据模型、API、使用方式简单
  • 重复(replicated):在多个(通常是奇数个)节点上重复,保证了其高可用。这些节点的集合叫做 ensemble
  • 有序(ordered):所有的更新操作都是有序的
  • 快速(fast):尤其是在读多写少的场景下

ZooKeeper的数据模型是一个类似于标准文件系统的分层级的树形结构,树中的每个节点叫做znode。znode的名称或者ID是由正斜杠/连接的路径序列,例如/,/app1,/app1/p1 等。每个znode都有相应的数据(data),同时也可以有子节点。znode的数据量一般不大,是byte到kilobyte的量级。数据有相应的版本号,每次更新操作会加一。对数据的读写操作都是原子的。

有两种znode,分别是persistent和ephemeral。后者会在创建该znode的session终止时被删除。

客户端可以watch znode,当该znode发生变化时,客户端会接收到通知。

ZooKeeper提供了一系列的保证:

  • 顺序一致性(Sequential Consistency):从客户端发出的更新操作会以相同的顺序被应用
  • 原子性(Atomicity):更新要么成功,要么失败,不存在中间状态
  • 单一系统镜像(Single System Image):客户端不管是连接到ensemble中的哪个服务器,它看到的服务状态都是一样的
  • 可靠性(Reliability):更新操作会被持久化,直到被覆盖写
  • 及时性(Timeliness):客户端看到的系统状态是最新的(在一定时间范围内)

ZooKeeper提供了非常简约的API。

  • create:创建znode
  • delete:删除znode
  • exists:判断某个znode是否存在
  • get data:读取znode的数据
  • set data:将数据写入znode
  • get children:获取znode的子节点
  • sync:waits for data to be propagated

参考

其他一些视频和幻灯片的摘录

(1)What is Zookeeper?

(2)ZooKeeper explained

Zookeeper存储了一些集群内部必须保持同步和一致的信息,包括:

  • 哪个节点是master节点?
  • 哪些任务被分配给了哪个worker?
  • 哪些worker当前是可用的?

常见的故障模式有:

  • master节点挂了,需要使用一个备用节点作为master
  • worker节点挂了,它的工作需要被重新分配给其他节点
  • 网络故障,集群中部分看不到另一部分

在分布式系统中有一些“原语”(Primitive)操作:

  • 选主
  • 故障感知
  • 组管理
  • 元数据管理

但是ZooKeeper的API没有直接暴露这些原语操作,而是更为通用,使得应用能够更简单地使用它们。

ZooKeeper 实际上是一个小型的分布式文件系统,保证了强一致性。不过使用了znode来代替file的概念。 ZooKeeper的API包括了:create,delete,exists,setData,getData,getChildren。

ZooKeeper的客户端可以针对某个znode注册,这样在该znode发生变化时能够收到通知,这样避免了持续性的轮询。

znode分为persistent和ephemeral两种:

  • persistent znodes会一直保存着,除非被显式地删除
  • ephemeral znodes会在创建它的客户端挂掉或者和ZooKeeper失去连接时被删除

ZooKeeper的整体架构如下:

ZooKeeper quorums: 如果quorum level是3,那么至少需要5个ZooKeeper server。

(3)What is Zookeeper and how is it working with Apache Kafka?

可以看出Kafka在逐渐“去ZooKeeper化”,过渡到自身实现的Raft协议。

Comments