一、简介

1.概述

ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper 通过其简单的架构和API解决了这个问题。ZooKeeper 允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。

应用场景

  • 分布式协调组件



Zookeeper初体验头歌截图_java


在分布式系统中,需要有zookeeper作为分布式协调组件,协调分布式系统中的状态。

  • 分布式锁

zk在实现分布式锁上,可以做到强一致性。

  • 无状态化的实现


Zookeeper初体验头歌截图_Zookeeper初体验头歌截图_02


2.特点

1) Zookeeper: 一个领导者(Leader) ,多个跟随者(Follower) 组成的集群。

2) 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。

3)全局数据一致: 每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。

4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。

5)数据更新原子性,一次数据更新要么成功,要么失败。

6)实时性,在一.定时间范围内,Client能读到最新数据。

二.数据结构

ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个 ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。


Zookeeper初体验头歌截图_java-zookeeper_03


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)


Zookeeper初体验头歌截图_zookeeper_04


  • 临时节点:临时节点是在会话结束后,自动被删除的,通过这个特性,zk可以实现服务注册与发现的效果。


Zookeeper初体验头歌截图_java_05


  • 临时序号节点:跟持久序号节点相同,适用于临时的分布式锁。
  • 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通过两种形式的持久化,在恢复时先恢复快照文件中的数据到内存中,再用日志文件中的数据做增量恢复,这样的恢复速度更快。