Zookeeper

Zookeeper是Paxos算法的Java开源实现,配合Hadoop、Pig、Hive等软件使用。它用于保证分布式系统中一份数据的写强一致性、读快速一致性(tick时间内),即该份数据存放于若干台机器上,zookeeper保证无论客户端从哪台机器读取该份数据,值都是一样的;无论从哪台机器更改该份数据,都会一致地同步到其他机器上。也即Zookeeper满足的是CP,在网络不好的情况下会出现不可用情况。

Zookeeper维护的是一份类似文件系统的树形结构,根目录是/,每个节点本身又是文件夹,可以存放子节点,同时又可以存放信息。

1. 基础概念

zookeeper节点ZNode的类型:

  1. 常规节点 Regular ZNode,用户需要显式的创建、删除
  2. 临时节点 Ephemeral ZNode 用户创建它之后,可以显式的删除,也可以在创建它的Session结束后,由ZooKeeper Server自动删除。【ZooKeeper规定,临时节点不能拥有子节点。】
  3. 自增节点(常规和临时都可以)

2. 基本操作

2.1 命令行操作

Linux或Windows都有一个连接到zookeeper的命令行客户端:

bin/zkCli.sh -server 127.0.0.1:2181 # Windows下则用zkCli.cmd

基本操作

help # 显示帮助
ls / # 显示文件目录(节点)
get / # 获取节点的值value
stat / # 获取节点的信息,包括创建修改时间、创建修改事务id、数据版本(每改一次自增1)、cversion子节点版本(当子节点有变化时自增)、子目录个数、数据长度等,如果ephemeralOwner有值,则是一个临时节点,其值就是客户端的sessionid

create /mynode # 创建一个节点(值为null),如节点已存在,则调create会报node已存在错误
create /zk myData # 在根目录创建一个叫/zk的节点,值为myData
set /zk myData2 # 设置节点/zk的值
delete /zk # 删除某个节点

创建临时节点

create -e /mynode1 # 加多一个选项-e,其它都和create一样

临时节点在客户端退出时会自动清理。

创建有序节点

create -s /task # 将返回创建的有序节点的值,例如/task0000000006,一共10位数字

watch某个节点的变化

get -w / # 加上-w参数,当节点有变化时会通知,但只通知一次,接下来需要重新watch

同步节点,相当于强制要获得最新的值

这是因为zk在短时间同步并非实时的,肯定有一点点时间差,这个命令相当于确认一下是否有此类的待同步的数据:

sync / # 同步指定路径

2.2 运维操作命令

查看当前节点是什么角色、最新事务id

echo srvr | nc IP地址 2181

输出内容:

Zookeeper version: 3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 05/04/2020 15:07 GMT
Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x600000000 # 事务id = 当前leader epoch + 事务自增id
Mode: leader # 角色,是leader还是follower
Node count: 5
Proposal sizes last/min/max: -1/-1/-1

在当前节点的服务器上执行zkServer.sh status可以看到输出的Mode是leader还是follower来确定,但没有其他信息了。

还有一个可以输出除上面的信息之外,客户端列表的信息,但要开启4LwCommandsWhitelist,然后用:echo stat | nc IP地址 2181可以看到client客户端连接列表。

3. 客户端

可视化客户端

https://github.com/xin497668869/zookeeper-visualizer

Java编程

详见j2ee代码库中的zookeeper项目。

这份wiki是原wiki zookeeper,从pugwoo.com迁移过来,原来的删除(2019年11月14日 10:16:58)。

文档更新时间: 2020-12-15 23:12   作者:nick