ZooKeeper介绍
ZooKeeper是一种分布式协调服务,用于管理大型分布式集群。在分布式环境中协调和管理服务是一个复杂的过程,但是ZooKeeper通过其简单的架构和API解决了这个问题。
应用场景
分布式协调组件
在分布式系统中,需要zookeeper作为分布式协调组件,协调分布式系统中的状态。如下图,用户更改了一台服务器A-2上的状态,但是另一台主机A-1上的flag没有做出及时的更改,这就需要zookeeper进行协调,更改A-1的状态,以协调分布式系统中所有服务器的状态。
分布式锁
zookeeper在实现分布式锁上,可以做到强⼀致性。
分布式锁就是将锁放在zookeeper上,当需要上锁时到zookeeper中获取锁。
无状态化的实现
对于分布式系统,将Session或者Cookie等状态信息保存在各个主机上是不现实的。可以利用zookeeper实现分布式系统的无状态化,将登录信息统一保存在zookeeper中,各个分布式主机在zookeeper中获取状态信息。
配置文件说明
zookeeper中配置文件zoo.cfg
说明:
1 | # zookeeper时间配置中的基本单位 (毫秒) |
ZooKeeper内部数据模型
zookeeper是如何保存数据的
在zookeeper中,数据保存在节点上,节点即znode,多个znode之间构成了一棵树形结构,类似于文件系统:
znode的引用方式是路径引用,与文件系统相同/动物/狗
,这样的结构让每一个znode节点拥有唯⼀的路径。
znode结构
zookeeper中的znode,包含四个部分:
- data:保存的数据
- acl:权限,定义了什么样的⽤户能够操作这个节点,且能够进⾏怎样的操作。
- c:create创建,允许在该节点下创建子节点
- w:write更新,允许更新该节点的数据
- r:read读取,允许读取该节点的内容及其子节点的列表信息
- d:delete删除,允许删除该节点及其子节点
- a:admin管理,允许对该节点进行权限设置
- stat:描述当前znode的元数据
- clild:当前节点的子节点
znode的类型
- 持久节点:创建出的节点,在会话结束后依然存在,保存数据。
- 持久序号节点:创建出的节点,根据先后顺序,会在节点之后带上⼀个数值,越后执行数值越⼤,适⽤于分布式锁的应用场景 - 单调递增。
- 临时节点:临时节点在会话结束后,自动被删除。临时节点通过zookeeper客户端不断PING服务器持续会话,续约
session id
的时间来维持心跳:
- 临时序号节点:跟持久序号节点相同,适⽤于临时的分布式锁。
- Container节点(3.5.3版本新增):容器节点,当容器中没有任何⼦节点,该容器节点会被zookeeper定期删除(60s)。
- TTL节点:可以指定节点的到期时间,到期后被zookeeper定期删除。
zook的服务注册与发现是通过临时节点实现的:服务提供者将服务信息注册在zookeeper的临时节点中,若服务提供者断开了那么临时节点会被删除。
zookeeper的数据持久化
zookeeper的数据是在内存中的,zk提供了两种持久化的机制:
- 事务日志:zookeeper把执行的命令以日志的形式保存在在dataLogDir指定的路径中的文件中。
- 数据快照:zookeeper在一定的时间间隔内做一次内存数据的快照,把该时刻的内存数据保存在快照文件中。
zookeeper在恢复时先恢复快照文件中的数据到内存中,再用日志文件中的数据做增量恢复,这样的恢复速度更快。