Zookeeper基础

一、概述

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。

应用场景:
  • 分布式协调

  • 分布式锁

  • 元数据/配置信息管理(选举):kafka,storm

  • HA高可用:hdfs

软件版本:
  • jdk-8u231-linux-x64.tar.gz
  • apache-zookeeper-3.6.3-bin.tar.gz
官方网站:

下载地址:https://zookeeper.apache.org/releases.html#download

# 下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/apache-zookeeper-3.5.5-bin.tar.gz
配置文件:
# 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

二、服务端

查看状态
[root@VM-4-11-centos apache-zookeeper-3.6.3-bin]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/software/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower # 从节点

三、客户端

启动客户端
# 1.客户端连接
bin/zkCli.sh
zkCli.sh -server 192.168.0.1:2181
查看节点
# 查看命令help

# ls path 查看目录
ls /test
# ls -R /path 递归查看
ls -R /test
# ls / : 查看根目录下有一个zookeeper的目录。 目录就是一个节点。
[zk: localhost:2181(CONNECTED) 3] ls /
[admin, brokers, cluster, config, consumers, controller_epoch, isr_change_notification, latest_producer_id_block, log_dir_event_notification, test, zookeeper]

# 查看状态
[zk: localhost:2181(CONNECTED) 8] stat /
cZxid = 0x0 # Zookeeper为节点分配的Id
ctime = Thu Jan 01 08:00:00 CST 1970 # 节点创建时间
mZxid = 0x0 # 修改后的id
mtime = Thu Jan 01 08:00:00 CST 1970 # 修改时间
pZxid = 0x10000043a # 子节点id
cversion = 41 # 子节点的version
dataVersion = 0 # 当前节点数据的版本号
aclVersion = 0 # 权限Version
ephemeralOwner = 0x0 # 创建临时节点的事务的ID,持久节点事务为0
dataLength = 0 # 数据长度
numChildren = 11 # 子节点个数
创建节点
# 创建znode节点
create /test mytest
语法:create [-s] [-e] [-c] [-t ttl] path [data] [acl]
参数:使用[]包含的是可选参数。
[-s] : 创建有序节点。
[-e] : 创建临时节点。
[-c] : 创建一个容器节点。
[t ttl] : 创建一个TTL节点, -t 时间(单位毫秒)。
path: 路径 ,因为没有中括号,所以是必须参数。
[data]:节点的数据,可选,如果不使用时,节点数据就为null。
[acl] :权限相关


# 获取数据
get /test
# 查看节点数据加元信息
get -s /path

# 修改数据
set /test hello

# 删除路径
delete /test
# 递归删除
deleteall path

四、节点类型

无序持久节点(默认)
[zk: localhost:2181(CONNECTED) 26] create /siap
Created /siap
[zk: localhost:2181(CONNECTED) 27] create /siap/mc_node "无序持久节点"
Created /siap/mc_node
[zk: localhost:2181(CONNECTED) 28] ls -R /siap/mc_node
/siap/mc_node
[zk: localhost:2181(CONNECTED) 29] get -s /siap/mc_node
中国
cZxid = 0x10000044d
ctime = Tue Nov 16 09:00:05 CST 2021
mZxid = 0x10000044d
mtime = Tue Nov 16 09:00:05 CST 2021
pZxid = 0x10000044d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
有序持久节点
  • 有序节点名称=有序节点路基+10位顺序号
  • -s:sequence
[zk: localhost:2181(CONNECTED) 30] create -s /siap/sequence_node "有序持久节点"
Created /siap/sequence_node0000000001
[zk: localhost:2181(CONNECTED) 31] ls /siap
[mc_node, sequence_node0000000001]
[zk: localhost:2181(CONNECTED) 32] create -s /siap/sequence_node "有序持久节点"
Created /siap/sequence_node0000000002
[zk: localhost:2181(CONNECTED) 33] ls /siap
[mc_node, sequence_node0000000001, sequence_node0000000002]
无序临时节点
  • 临时节点在客户端断开以后自动删除
  • -e: temp
[zk: localhost:2181(CONNECTED) 34] create -e /siap/temp_node "无序临时节点"
Created /siap/temp_node
[zk: localhost:2181(CONNECTED) 35] ls /siap
[mc_node, sequence_node0000000001, sequence_node0000000002, temp_node]
[zk: localhost:2181(CONNECTED) 36] quit
[zk: localhost:2181(CONNECTED) 0] ls /siap
[mc_node, sequence_node0000000001, sequence_node0000000002]
有序临时节点
  • 通常用来做竞争选举。

  • 临时节点是与会话关联的,一点创建该临时节点的会话结束,与之会被自动删除,无需应用方人工删除。

  • 同一个目录下,顺序节点的序号是共用的。

[zk: localhost:2181(CONNECTED) 1] create -s -e /siap/temp_node "有序临时节点"
Created /siap/temp_node0000000004
[zk: localhost:2181(CONNECTED) 2] ls /siap
[mc_node, sequence_node0000000001, sequence_node0000000002, temp_node0000000004]
[zk: localhost:2181(CONNECTED) 3] create -s -e /siap/temp_node "有序临时节点"
Created /siap/temp_node0000000005
[zk: localhost:2181(CONNECTED) 4] quit
[zk: localhost:2181(CONNECTED) 0] create -s -e /siap/temp_node "有序临时节点"
Created /siap/temp_node0000000006
[zk: localhost:2181(CONNECTED) 1] ls /siap
[mc_node, sequence_node0000000001, sequence_node0000000002, temp_node0000000006]

五、监听器

事件机制:

Watcher 监听机制是 Zookeeper 中非常重要的特性,我们基于 zookeeper 上创建的节点,可以对这些节点绑定监听事件,比如可以监听节点数据变更、节点删除、子节点状态变更等事件,通过这个事件机制,可以基于 zookeeper实现分布式锁、集群管理等功能。

监听测试:
  • 每个路径节点都有一个watcher监控,当该节点数据改变时(CRUD),自动触发watcher,zookeeper的watcher机制是一次性的,触发一次后即销毁,watcher可以用来统一资源配置。
# 新版本中监听器使用 -w
# 'ls path [watch]' has been deprecated. Please use 'ls [-w] path' instead.

# 监听节点【路径】变化
ls -w path 
# 监听节点【值】变化
get -w path
######################## 节点路径监听 ########################
# zk 物理节点1
[zk: localhost:2181(CONNECTED) 0] ls -w /siap
[mc_node, mc_watch, sequence_node0000000001, sequence_node0000000002]
# zk 物理节点2
[zk: localhost:2181(CONNECTED) 0] create /siap/mc_node2
Created /siap/mc_node2
# zk 物理节点1
[zk: localhost:2181(CONNECTED) 1]
WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/siap
######################## 节点路径监听 ########################

######################## 节点值监听 ########################
# zk 物理节点1
[zk: localhost:2181(CONNECTED) 0] get -w /siap/mc_node
复兴2
# zk 物理节点2
[zk: localhost:2181(CONNECTED) 0] set /siap/mc_node 复兴
# zk 物理节点1
[zk: localhost:2181(CONNECTED) 1]
WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/siap/mc_node
######################## 节点值监听 ########################

六、权限控制

ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限每个znode支持设置多种权限控制方案和多个权限子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点。

ZK的访问控制列表(Access Control Lists,ACL)。由schema:id:permission来定义。

  • scheme:授权策略
  • id:授权对象
  • permission:授予权限
scheme:
  • digest:Client端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式
  • auth:不使用任何id,代表任何已确认用户。
  • ip:Client端由IP地址验证,譬如172.2.0.0/24
  • world:固定用户为anyone,为所有Client端开放权限(默认)。
  • super:在这种scheme下,对应的id拥有超级权限,可以做任何事情(cdrwa)。

注意, exists 操作和 getAcl 操作并不受 ACL 许可控制,因此任何客户端可以查询节点的状态和节点的 ACL 。

permission:

cdwra分别表示create, delete,write,read, admin。其中admin表示具有对节点设置ACL的权限。

其中CREATE和DELETE这两种权限都是针对子节点的权限控制。

  • Create 允许对子节点 Create 操作
  • Read 允许对本节点 GetChildren 和 GetData 操作
  • Write 允许对本节点 SetData 操作
  • Delete 允许对子节点 Delete 操作
  • Admin 允许对本节点 setAcl 操作
world模式
# 查看权限(节点权限是world(默认),为所有client端开放,不安全。
[zk: localhost:2181(CONNECTED) 0] getAcl /siap
'world,'anyone
: cdrwa
auth模式
# 1. 创建认证用户
addauth digest username:password
# 2. 授予节点权限
setAcl /path auth:username:cdwra
#################### 实测 #####################
[zk: localhost:2181(CONNECTED) 0] create /siap/mc_node
Created /siap/mc_node
# 查看节点权限:此时默认权限是开放
[zk: localhost:2181(CONNECTED) 1] getAcl /siap/mc_node
'world,'anyone
: cdrwa
# 此时可以查看节点数据
[zk: localhost:2181(CONNECTED) 2] get /siap/mc_node
null
[zk: localhost:2181(CONNECTED) 3] addauth digest wangfugui:123456
[zk: localhost:2181(CONNECTED) 4] setAcl /siap/mc_node auth:wangfugui:cdwra
# 查看节点权限(getAcl命令不受ACL控制)
[zk: localhost:2181(CONNECTED) 5] getAcl /siap/mc_node
'digest,'wangfugui:dbcImPIXETIzD8YpOEOERkQb9jk=
: cdrwa
# 再次登录,需要验证权限
[zk: localhost:2181(CONNECTED) 6] quit
[zk: localhost:2181(CONNECTED) 0] get /siap/mc_node
Insufficient permission : /siap/mc_node
digest模式

digest加密模式相对于auth麻烦,需要对要设置的密码进行BASE64(SHA1(password))的处理

# 1.linux命令生成一个符合degist的密码
# 语法:echo -n user:password | openssl dgst -binary -sha1 | openssl base64
echo -n user:password | openssl dgst -binary -sha1 | openssl base64
# 2.授权(digest与auth区别:digest可以直接设置节点权限,而auth需要先添加认证用户。)
setAcl /path digest:username:加密后的密码:crdwa
# 3.添加认证用户进行访问
addauth digest username:明文密码

#################### 实测 #####################
[root@VM-4-11-centos apache-zookeeper-3.6.3-bin]# echo -n wangfugui:123456 | openssl dgst -binary -sha1 | openssl base64
dbcImPIXETIzD8YpOEOERkQb9jk=

[zk: localhost:2181(CONNECTED) 0] ls -R /siap
/siap
[zk: localhost:2181(CONNECTED) 1] create /siap/mc_node 中国
Created /siap/mc_node
[zk: localhost:2181(CONNECTED) 2] get /siap/mc_node
中国
[zk: localhost:2181(CONNECTED) 3] setAcl /siap/mc_node digest:wangfugui:dbcImPIXETIzD8YpOEOERkQb9jk=:crdwa
[zk: localhost:2181(CONNECTED) 4] get /siap/mc_node
Insufficient permission : /siap/mc_node
[zk: localhost:2181(CONNECTED) 5] addauth digest wangfugui:123456
[zk: localhost:2181(CONNECTED) 6] get /siap/mc_node
中国
ip模式
# 设置固定IP可访问
setAcl /siap/mc_node ip:192.168.0.2:crdwa

#################### 实测 #####################
# localhost连接
[root@VM-4-11-centos apache-zookeeper-3.6.3-bin]# bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] deleteall /siap
[zk: localhost:2181(CONNECTED) 1] ls -R /siap
Node does not exist: /siap
[zk: localhost:2181(CONNECTED) 2] create /siap
Created /siap
[zk: localhost:2181(CONNECTED) 3] create /siap/mc_node China
Created /siap/mc_node
[zk: localhost:2181(CONNECTED) 4] getAcl /siap/mc_node
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 5] setAcl /siap/mc_node ip:192.168.0.2:crdwa
[zk: localhost:2181(CONNECTED) 6] get /siap/mc_node
Insufficient permission : /siap/mc_node
[zk: localhost:2181(CONNECTED) 7] quit
# 远程连接
# zk 物理节点1(IP:192.168.0.1)
[root@VM-4-11-centos apache-zookeeper-3.6.3-bin]# bin/zkCli.sh -server 192.168.0.2:2181
[zk: 192.168.0.2:2181(CONNECTED) 0] get /siap/mc_node
Insufficient permission : /siap/mc_node
# zk 物理节点2(IP:192.168.0.2)
[root@VM-4-11-centos apache-zookeeper-3.6.3-bin]# bin/zkCli.sh -server 192.168.0.2:2181
[zk: 192.168.0.2:2181(CONNECTED) 0] get /siap/mc_node
China

八、其他

基础命令
命令描述
connect host:port连接到某台服务器上
create [-s] [-e] [-c] [-t ttl] path [data] [acl]创建一个新的znode节点,-s表示顺序节点,-e表示临时节点,acl访问控制列表
delete [-v version] path删除某一节点,只能删除无子节点的节点。-v 表示节点版本号
deleteall path递归的删除某一节点及其子节点,同rmr命令
get [-s] [-w] path获取节点数据信息,-s表示获取节点信息,包括时间戳、版本号、数据大小等
getAcl [-s] [-w] path获取节点的访问控制列表,-s表示顺序节点
ls [-s] [-w] [-R] path获取节点列表,-s表示获取节点信息,相当于ls2,-R表示递归的获取
ls2 path [watch]获取节点列表及节点信息,该命令在最新版本中已弃用
set [-s] [-v version] path data设置节点数据,-s表示节点为顺序节点,-v 指定版本号
setAcl [-s] [-v version] [-R] path acl设置节点的访问控制列表,-s表述顺序节点,-v指定版本号,-R递归的设置
state [-w] path查看节点信息
setquota -n|-b val path设置节点的quota(限制),-n表示子节点个数,-b表示空间大小
delquota [-n|-b] path删除节点的quota(限制)
listquota path列出节点的quota信息
printwatches设置和显示监视状态,on开启,off关闭
history列出本次会话中的历史操作命令
redo cmdno再次执行某一命令,cmdno为前一次改名执行是的ID,可通过history命令查看
rmr递归的删除某一节点及其子节点,该命令在最新版本中已弃用
sync强制同步所有的更新操作到所有节点
addauth schema auth增加节点认证
close关闭连接,但是客户端不退出
quit关闭连接并退出客户端
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值