ZooKeeper‘s Bizarre Adventure——Volume Ⅰ:初识ZooKeeper

ZooKeeper's Bizarre Adventure——Volume Ⅰ:初识ZooKeeper

  • What is ZooKeeper?
    • ZooKeeper的应用场景
  • ZooKeeper的两大核心概念
    • 文件系统数据结构
    • 监听通知机制
  • 结尾

What is ZooKeeper?

在ZooKeeper的官方文档上说,Apache ZooKeeper致力于开发和维护一个能实现高度可靠的分布式协调的开源服务器
那么,开发和维护的这个服务器究竟是什么?能做什么呢?
ZooKeeper顾名思义就是动物园的管理员,所以他做的事情其实就是一个管理员的工作,把这些个不听话的不懂事的“动物们”整理得服服帖帖的,把“动物园”整理得井井有条。这些个“动物们”当然就是这些分布式应用程序,像HBase、Kafka、SorlCloud等众多的知名框架都是使用zookeeper实现分布式协同管理的,它主要就是用来解决分布式应用中经常遇到的数据管理问题如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等等。

ZooKeeper的应用场景

ZooKeeper广泛应用于分布式配置中心、分布式注册中心、分布式锁、分布式队列、集群选举、分布式屏障和发布/订阅等等分布式协调服务中。
但是,协调服务很难做好。它们特别容易出现竞争条件和死锁等错误,所以,ZooKeeper又是怎么实现的呢?

ZooKeeper的两大核心概念

文件系统数据结构

ZooKeeper提供的命名空间很像标准的文件系统,名称是由斜杠 (/) 分隔的一系列路径元素。ZooKeeper 命名空间中的每个节点(znode)都由路径标识。
ZooKeeper‘s Bizarre Adventure——Volume Ⅰ:初识ZooKeeper_第1张图片
基于这种数据结构,我们可以自由地增加、删除znode,在一个znode下增加、删除子znode。
有六种类型的znode:

  1. PERSISTENT(持久化目录节点):客户端与ZooKeeper断开连接后,该节点依旧存在,只要不将该节点删除,它将永久存在;
  2. PERSISTENT_SEQUENTIAL(持久化顺序编号目录节点):客户端与ZooKeeper断开连接后,该节点依旧存在,只是ZooKeeper为该节点名称进行顺序编号;
  3. EPHEMERAL(临时目录节点):客户端与ZooKeeper断开连接后,该节点将会被删除;
  4. EPHEMERAL_SEQUENTIAL(临时顺序编号目录节点):ZooKeeper会为其节点名称进行顺序编号,同时它也会在客户端断开连接时被删除;
  5. Container(容器节点):3.5.3版本新增,如果容器节点下面没有子节点,则在未来会被ZooKeeper自动清除,定时任务默认60s检查一次;
  6. TTL节点:默认禁用,只能通过系统配置zookeeper.extendedTypesEnabled=true开启,可以设置过期时间,不过真正的过期时间不一定是所设置的时间,还会受到定时任务的执行时间的影响,因为节点的关闭是由定时任务轮询关闭的。
    其中,临时节点的生命周期是与session相关的,当sessionid过期,也就是连接断开或者关闭之后,在session-timeout时间内没有重新连接,则会删除:
    ZooKeeper‘s Bizarre Adventure——Volume Ⅰ:初识ZooKeeper_第2张图片

监听通知机制

客户端注册监听它关心的任意节点或者目录节点及递归子目录节点:

  1. 如果注册的是对某个节点的监听,则当这个节点被删除或者被修改时,对应的客户端将被通知;
  2. 如果注册的是对某个目录的监听,则当这个目录有子节点被创建或者被删除时,对应的客户端将被通知;
  3. 如果注册的时是对某个目录的递归子节点进行监控,则当这个目录下面的任意子节点有目录结构变化(有子节点被创建或被删除)或者根节点有数据变化时,对应的客户端将被通知。
    注意:所有的通知都是一次性的,无论是对节点还是对目录进行监听,一旦触发,对应的监听则被移除。对递归子节点的监听,所监听的是对所有子节点的,所以每个子节点下面的事件同样只会被触发一次。

结尾

基础的入门使用推荐大家看官方文档,照着官方文档操作一遍,可以先装一个单机版的先玩玩,ZooKeeper的安装也非常简单,在官方下载安装包之后,解压,然后备份一下conf目录下的zoo_sample.cfg文件,重命名为zoo.cfg,在ZooKeeper的目录下可以选择建一个data的目录和log的目录,然后按照我下面的配置根据实际情况修改配置就行了:

# The number of milliseconds of each tick]
# 服务器之间或客户端之间维持心跳的时间间隔(毫秒)
tickTime=2000
#
# The number of ticks that the initial 
# synchronization phase can take
# 集群中连接到Leader的Follower服务器初始连接时最长能忍受的心跳时间间隔个数
# 当超过10个心跳时间(10*2000ms=20s)Leader还没有收到Follower的返回信息,说明这个Leader连接失败
initLimit=10
#
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
# Leader与Follower之间发送信息请求与应答时间长度,最长不能超过5个心跳时间间隔(5*2000ms=10s)
syncLimit=5
#
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
# Zookeeper的数据保存目录(默认包括日志)
# win下的话文件路径要么使用“\\”要么使用“/”,使用“\”会报错的
dataDir=D:\\apache-zookeeper-3.5.8-bin\\data
# 这里我把日志放在另外的文件夹log下
dataLogDir=D:\\apache-zookeeper-3.5.8-bin\\log
#
# the port at which the clients will connect
# 使用的端口号
clientPort=2181
#
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

启动的话,win下就是双击zkServer.cmd启动服务端,然后双击zkCli.cmd打开客户端就可以使用本机的ZooKeeper了;而Linux下就是通过命令bin/zkServer.sh start conf/zoo.cfg启动服务,然后bin/zkCli.sh ‐server ip:port连接服务器。
可以在客户端使用help命令看看ZooKeeper支持的命令,而且还可以用tab键提示,接下来就靠大家动动手自己实践节点和通知机制啦~

你可能感兴趣的:(分布式,zookeeper,分布式,java)