ZooKeeper
简介
Zookeeper是一种分布式协调服务,用于管理大型主机。
应用场景:
- 分布式协调组件
- 分布式锁(zk可以实现强一致性)
- 无状态化实现,将分布式系统的数据保存在zk,无论访问的是哪个系统都不影响
ZK内部的数据模型
zk的数据保存在节点上,类似树的结构也很像目录结构。zk的数据存在Znode节点上,Znode的引用方式是路径引用,跟文件类似
/spring/springboot
Znode节点组成
Znode包含四个部分
- data:保存数据
- acl:权限,定义什么样的用户能够操作这个节点,并且能够进行怎样的操作
- c:create 创建权限,允许在该节点下创建子节点
- w:write 更新权限,允许更新该节点的数据
- r:read 读取权限,允许读取该节点的内容以及子节点的列表信息
- d:delete 删除权限,允许删除该节点的子节点
- a:admin 管理者权限,允许对该节点进行acl权限设置
- stat:描述当前znode的元数据,也就是当前节点的详细信息
- child:当前节点的子节点
Znode节点类型
- 持久节点:创建出的节点在会话结束之后依然存在,保存数据
- 持久序号节点:创建出的节点会根据先后顺序,在节点之后带上一个数值,越后执行数值越大,使用于分布式锁应用场景,数值单调递增
- 临时节点:在会话结束后会自动删除,可以用来实现服务的注册与发现
- 临时序号节点:跟持久序号节点相同,适用于临时的分布式锁
- Container节点:容器节点,当容器中没有任何子节点,该节点会被zk定期删除(60S)
- TTL节点:可以指定节点的到期时间,到期被zk定时删除,只能通过系统配置zookeeper.extendedTypeEnabled=true开启
zk的数据持久化
zk数据运行在内存之中,zk提供了两种持久化机制
-
事务日志
把执行的命令以日志形式保存在dataLogDir指定的路径中的文件中
-
数据快照
zk会在一定时间间隔内做一次内存数据的快照,把该时刻的内存数据保存在快照文件中。
zk通过两种形式的持久化,在恢复时先恢复快照文件中的数据到内存中,再用日志文件的数据做增量恢复,这样恢复速度更快。