zookeeper概述
在分布式系统中,每个服务都可看作是一个节点,会产生很多节点的协调问题,如:
- 每天的定时任务由谁哪个节点来执行?
- RPC调用时的服务发现?
- 如何保证并发请求的幂等
- …
ZooKeeper是用于分布式应用程序的协调服务。它公开了一组简单的API,分布式应用程序可以基于这些API用于同步,节点状态、配置等信息、服务注册等信息。zookeeper用于协调各个节点间的工作。
zookeeper安装
1.zookeeper由Java编写,需要有Java的运行环境,需要下载JDK
2.下载:wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/apache-zookeeper-3.6.2-bin.tar.gz
2.解压: tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz
3.进入配置文件目录 cd ./apache-zookeeper-3.6.2-bin/conf
4. 拷贝配置文件 cp zoo_sample.cfg zoo.cfg
zookper配置文件说明,zookeeper默认端口:2181
# zookeeper时间配置中的基本单位 (毫秒)
tickTime=2000
# 允许follower初始化连接到leader最大时长,它表示tickTime时间倍数 即:initLimit*tickTime
initLimit=10
# 允许follower与leader数据同步最大时长,它表示tickTime时间倍数
syncLimit=5
#zookeper 数据存储目录
dataDir=/tmp/zookeeper
#对客户端提供的端口号
clientPort=2181
#单个客户端与zookeeper最大并发连接数
maxClientCnxns=60
# 保存的数据快照数量,之外的将会被清除
autopurge.snapRetainCount=3
#自动触发清除任务时间间隔,小时为单位。默认为0,表示不自动清除。
autopurge.purgeInterval=1
- 启动zookeeper需要进入bin目录: cd …/bin/
- 启动zookeeper服务端: ./zkServer.sh start
启动成功 - 启动客户端连接zookeeper: ./zkCli.sh
连接成功!!
节点的概念
zookeeper 中节点叫znode存储结构上跟文件系统类似,以树级结构进行存储。不同之外在于znode没有目录的概念,不能执行类似cd之类的命令。znode结构包含如下:
- path:唯一路径
- childNode:子节点
- stat:状态属性
- type:节点类型
节点之下可包含子节点,最后以树级方式程现。每个节点拥有唯一的路径path。客户端基于PATH上传节点数据,zookeeper 收到后会实时通知对该路径进行监听的客户端。
节点属性
使用get -s 路径 指令,可以得到这个节点的详细信息
#创建节点的事物ID
cZxid = 0x385
#创建时间
ctime = Tue Sep 24 17:26:28 CST 2019
#修改节点的事物ID 本节点发生改变
mZxid = 0x385
#最后修改时间
mtime = Tue Sep 24 17:26:28 CST 2019
# 子节点变更的事物ID 子节点的增加或删除
pZxid = 0x385
#这表示对此znode的子节点进行的更改次数(不包括子节点) 子节点增加或删除
cversion = 0
# 数据版本,变更次数
dataVersion = 0
#权限版本,变更次数
aclVersion = 0
#临时节点所属会话ID
ephemeralOwner = 0x0
#数据长度
dataLength = 17
#子节点数(不包括子子节点)
numChildren = 0
节点类型
类型 | 描述 |
---|---|
PERSISTENT | 持久节点 |
PERSISTENT_SEQUENTIAL | 持久序号节点 |
EPHEMERAL | 临时节点(不可在拥有子节点) |
EPHEMERAL_SEQUENTIAL | 临时序号节点(不可在拥有子节点) |
客户端操作
-
ls [-s][-w] [-R] path 列出子节点 -s状态 -R 递归查看所有子节点 -w 添加监听
-
create [-s][-e] [-c][-t ttl] path [data][acl] 创建节点。
-s 创建节点序号 -e 创建临时节点
创建一个持久节点:
持久节点会永久保存
创建一个持久序号节点:
序号节点会自动给节点编号,适合批次创建
创建一个临时节点和临时序号节点:
临时节点只存在于当前会话,
-
delete [-v version] path 删除节点,(不能存在子节点)
先在/course 创建/course/java 节点
删除/course节点:
删除失败,因为/course节点下有子节点 -
deleteall path 删除路径及所有子节点
删除/course
删除成功 -
set [-s] [-v version] path data 给节点设置值
-
get [-s][-w] path 查看节点数据 -s 包含节点状态 -w 添加监听
-
stat [-w] path 也可以查看节点状态,但不可查看节点数据 -w 添加监听
其他的操作指令:
close 关闭当前会话
connect host:port 重新连接指定Zookeeper服务
setquota -n|-b val path 设置节点限额 -n 子节点数 -b 字节数
listquota path 查看节点限额
delquota [-n|-b] path 删除节点限额
getAcl [-s] path 查看路径权限
printwatches on|off 是否打印监听事件
quit 退出客户端
history 查看执行的历史记录
redo cmdno 重复 执行命令,history 中命令编号确定
removewatches path [-c|-d|-a] [-l] 删除指定监听
setAcl [-s] [-v version] [-R] path acl 为节点设置ACL权限
sync path 强制同步节点