Dawn's Blogs

分享技术 记录成长

0%

ZooKeeper学习 (1) 介绍

ZooKeeper介绍

ZooKeeper是一种分布式协调服务,用于管理大型分布式集群。在分布式环境中协调和管理服务是一个复杂的过程,但是ZooKeeper通过其简单的架构和API解决了这个问题。

应用场景

分布式协调组件

在分布式系统中,需要zookeeper作为分布式协调组件,协调分布式系统中的状态。如下图,用户更改了一台服务器A-2上的状态,但是另一台主机A-1上的flag没有做出及时的更改,这就需要zookeeper进行协调,更改A-1的状态,以协调分布式系统中所有服务器的状态。

zk作为分布式协调组件

分布式锁

zookeeper在实现分布式锁上,可以做到强⼀致性

分布式锁就是将锁放在zookeeper上,当需要上锁时到zookeeper中获取锁。

无状态化的实现

对于分布式系统,将Session或者Cookie等状态信息保存在各个主机上是不现实的。可以利用zookeeper实现分布式系统的无状态化,将登录信息统一保存在zookeeper中,各个分布式主机在zookeeper中获取状态信息。

zk作为无状态化的实现

配置文件说明

zookeeper中配置文件zoo.cfg说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# zookeeper时间配置中的基本单位 (毫秒)
tickTime=2000
# 允许follower初始化连接到leader最⼤时⻓,它表示tickTime时间倍数
即:initLimit*tickTime
initLimit=10
# 允许follower与leader数据同步最⼤时⻓,它表示tickTime时间倍数
syncLimit=5
#zookeper 数据存储⽬录及⽇志保存⽬录(如果没有指明dataLogDir,则⽇志也保存在这个
⽂件中)
dataDir=/tmp/zookeeper
#对客户端提供的端⼝号
clientPort=2181
#单个客户端与zookeeper最⼤并发连接数
maxClientCnxns=60
# 保存的数据快照数量,之外的将会被清除
autopurge.snapRetainCount=3
#⾃动触发清除任务时间间隔,⼩时为单位。默认为0,表示不⾃动清除。
autopurge.purgeInterval=1

ZooKeeper内部数据模型

zookeeper是如何保存数据的

在zookeeper中,数据保存在节点上,节点即znode,多个znode之间构成了一棵树形结构,类似于文件系统:

zk中节点组成树形结构

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在恢复时先恢复快照文件中的数据到内存中,再用日志文件中的数据做增量恢复,这样的恢复速度更快。