
- 一、概述
- 应用场景:
- 软件版本:
- 官方网站:
- 配置文件:
- 二、服务端
- 查看状态
- 三、客户端
- 启动客户端
- 查看节点
- 创建节点
- 四、节点类型
- 无序持久节点(默认)
- 有序持久节点
- 无序临时节点
- 有序临时节点
- 五、监听器
- 事件机制:
- 监听测试:
- 六、权限控制
- scheme:
- permission:
- world模式
- auth模式
- digest模式
- **ip**模式
- 八、其他
- 基础命令
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:授予权限
- 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(默认),为所有client端开放,不安全。 [zk: localhost:2181(CONNECTED) 0] getAcl /siap 'world,'anyone : cdrwaauth模式
# 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_nodedigest模式
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八、其他 基础命令
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)