zookeeper是一个分布式协调服务系统。
分布式协调服务系统就是一个动物园。
通常用于提供以下功能:
- 命名服务
- 发布/订阅
- 配置管理
- 分布式同步/分布式锁
- 组服务/服务注册
1. zookeeper基础
1.1 文件系统
zookeeper维护一个类似文件目录的结构(znode),和通常的文件目录不同的是,每个目录节点可以存储数据。
目录结构有4种:
- 永久目录,创建后永久存在
- 永久顺序目录,创建后永久存在,且按序号顺序创建
- 临时目录,创建者离线后将删除
- 临时顺序目录,创建者离线后将删除
1.2 监听通知机制
zookeeper还提供监听通知机制,客户端注册监听感兴趣的目录节点后,若感兴趣节点发生变化(被修改、被删除、增加子节点)将通知客户端。
2. zookeeper应用场景
zk的文件系统和监听机制,可以在很多应用场景中使用到。
1.1 命名服务
永久顺序目录的应用
如何创建一个全局唯一ID?
- UUID
- 数据库自增ID
- 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节点下的所有节点,判断自身是否为第一个节点。