zookeeper简介及简单示例

260 阅读2分钟
ZooKeeper 服务的使用及数据模型

应用使用ZooKeeper客户端库使用ZooKeeper服务。 ZooKeeper客户端负责和ZooKeeper集群的交互。

image.png ZooKeeper的数据模型是层次模型。层次模型常见于文件系统。层次模型和key-value模型是两种主流的数据模型。ZooKeeper使用文件系统模型主要基于以下两点考虑:

  1. 文件系统的树形结构便于表达数据之间的层次关系。
  2. 文件系统的树形结构便于为不同的应用分配独立的命名空间(namespace)。 ZooKeeper 的层次模型称作 data tree。Datatree的每个节点叫作znode。znode不同于文件系统的地方是每个节点都可以保存数据。每个节点都有一个版本(version)。版本从0开始计数。

image.png

data tree接口

ZooKeeper对外提供一个用来访问data tree的简化文件系统API:

  • 使用UNIX风格的路径名来定位znode,例如/A/X表示znode A的子节点X。
  • znode的数据只支持全量写入和读取,没有像通用文件系统那样支持部分写入和读取。
  • data tree的所有API都是wait-free的。正在执行中的API调用不会影响其他API的完成。
  • data tree的API都是对文件系统的wait-free操作,不直接提供锁这样的分布式协同机制。但是data tree的API非常强大,可以用来实现多种分布式协同机制。
znode分类

一个znode可以使持久性的,也可以是临时性的:

  1. 持久性的znode (PERSISTENT):这样的znode在创建之后即使发生ZboKeeper集群宕机或clien宕机也不会丢失。
  2. 临时性的znode(EPHEMERAL): client宕机或者client在指定的timeout时间内没有给ZooKeeper集群发消息,这样的znode就会消失。 znode也可以是顺序性的。每一个顺序性的znode关联一个唯一的单调递增整数。这个单调递增整数是 znode名字的后缀。如果上面两种znode具备顺序性,又有以下两种znode:
  3. 持久顺序性的 znode(PERSISTENT_SEQUENTIAL):znode 除了具备持久性 znode 的特点之外,znode的名字具备顺序性。
  4. 临顺序性的 znode(EPHEMERAL_SEQUENTIAL):znode 除了具备持久性 znode 的特点之外,znode的名字具备顺序性。
zookeeper简单示例

zookeeper的目录如下所示:

image.png 配置文件在./conf/zoo.cfg中

image.png 配置文件中两个最重要的参数,data和clientPort
简单配置一下path,方便命令使用:

export ZOOKEEPER_HOME="$HOME/application/apache-zookeeper-3.7.0-bin"
export ZOOBINDIR="$ZOOKEEPER_HOME/bin"
export PATH="$ZOOBINDIR:$PATH"

启动后通过zkCli.sh连接,查看znode节点信息:

[zk: localhost:2181(CONNECTED) 0] ls -R /
/
/watch
/workers
/zookeeper
/zookeeper/config
/zookeeper/quota

实现一个简单的分布式锁:

image.png