zookeeper是一个分布式协调服务系统。
分布式协调服务系统就是一个动物园。

通常用于提供以下功能:

  • 命名服务
  • 发布/订阅
  • 配置管理
  • 分布式同步/分布式锁
  • 组服务/服务注册

1. zookeeper基础

1.1 文件系统

zookeeper维护一个类似文件目录的结构(znode),和通常的文件目录不同的是,每个目录节点可以存储数据。

目录结构有4种:

  1. 永久目录,创建后永久存在
  2. 永久顺序目录,创建后永久存在,且按序号顺序创建
  3. 临时目录,创建者离线后将删除
  4. 临时顺序目录,创建者离线后将删除

1.2 监听通知机制

zookeeper还提供监听通知机制,客户端注册监听感兴趣的目录节点后,若感兴趣节点发生变化(被修改、被删除、增加子节点)将通知客户端。

2. zookeeper应用场景

zk的文件系统和监听机制,可以在很多应用场景中使用到。

1.1 命名服务

永久顺序目录的应用

如何创建一个全局唯一ID?

  1. UUID
  2. 数据库自增ID
  3. redis自增ID

除了上面这三种方法,zk也可以使用永久顺序目录创建唯一ID,而且创建的唯一ID语义明确。

1.2 数据发布/订阅

监听机制的应用

客户端注册监听目录节点,节点变动后通知客户端,客户端再获取节点信息(push+pull模式)。

1.3 服务注册

临时顺序目录的应用

同一服务集群注册到同一服务目录下的顺序临时目录,服务上线自动增加顺序临时目录,服务离线自动删除服务临时目录。

1.4 Leader/Master选举

临时目录的应用

创建同一临时目录,抢到的为Leader/Master,其他非Leader/Master的节点监听次临时目录,目录删除后再创建次目录来选主。

1.5 配置管理

永久目录加监听机制的应用

在分布式系统启动时从zk的节点读取配置信息,配置改动后通知客户端。

1.6 分布式锁

1.6.1 简单分布式锁

临时目录加监听机制的应用

若客户端想获得锁,可尝试创建锁的临时目录,若创建成功则获得锁;若创建失败则监听此锁目录,若目录被删除则再次尝试创建锁的临时目录。

这种方式很简单,但如果有很多客户端都在抢占同一个锁时,当此临时目录被删除,锁被释放,则需要通知所有客户端,这可能会导致zk的性能突然下降(羊群效应)。

1.6.2 改进的分布式锁

临时顺序目录加监听机制的应用

首先在zk中创建一个永久Lock节点。想要获取锁的客户端在此Lock节点下创建临时顺序节点,并获取Lock节点下所有的子节点;若自身的节点是第一个节点,则获取到锁;若自身非第一个节点,则监听前一个节点,等待前一个节点被删除,再重新获取Lock节点下的所有节点,判断自身是否为第一个节点。