一、简介
1.概述
ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper 通过其简单的架构和API解决了这个问题。ZooKeeper 允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。
应用场景
- 分布式协调组件
在分布式系统中,需要有zookeeper作为分布式协调组件,协调分布式系统中的状态。
- 分布式锁
zk在实现分布式锁上,可以做到强一致性。
- 无状态化的实现
2.特点
1) Zookeeper: 一个领导者(Leader) ,多个跟随者(Follower) 组成的集群。
2) 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
3)全局数据一致: 每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。
5)数据更新原子性,一次数据更新要么成功,要么失败。
6)实时性,在一.定时间范围内,Client能读到最新数据。
二.数据结构
ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个 ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
1.zk中znode的结构
zk中的znode包含了四个部分:
- data:保存数据
- acl:权限,定义了什么样的用户能够操作这个节点,且能够进行怎么样的操作
- c : create创建权限,允许在该节点下创建子节点
- w :write跟新权限,允许更新该节点的数据
- r:read 读取权限,允许读取该节点的内容以及子节点的列表信息
- d:delete删除权限,允许删除该节点的子节点
- a:admin管理者权限,允许对该节点进行acl权限设置
- stat:描述当前znode的元数据(指的是节点的事务id,创建时间,修改时间等)
- child:当前节点的子节点
2.zk中节点znode的类型
- 持久节点:创建出的节点,在会话结束后依然存在。保存数据(例如:create /test1 )
- 持久序号节点:创建出的节点,根据先后顺序,会在节点之后带上一个数值,越后执行数值越大,适用于分布式锁的应用场景-单调递增(例如:create -s /test2)
- 临时节点:临时节点是在会话结束后,自动被删除的,通过这个特性,zk可以实现服务注册与发现的效果。
- 临时序号节点:跟持久序号节点相同,适用于临时的分布式锁。
- Container节点(3.5.3版本新增) : Container容器节点, 当容器中没有任何子节点,该容器节点会被zk定期删除(60s)。(例如:create -c /mycontainer)
- TTL节点:可以指定节点的到期时间,到期后被zk定时删除。只能通过系统配置zookeeper.extendedTypesEnabled=true开启
3.zk的数据持久化
zk的数据是运行在内存中,zk提供了两种持久化机制:
- 事务日志
zk把执行的命令以日志形式保存在dataLogDir指定的路径中的文件中(如果没有指定dataLogDir, 则按dataDir指定的路径) 。
- 数据快照
zk会在一定的时间间隔内做一次内存数据的快照,把该时刻的内存数据保存在快照文件中。
zk通过两种形式的持久化,在恢复时先恢复快照文件中的数据到内存中,再用日志文件中的数据做增量恢复,这样的恢复速度更快。