一、简介
1. Zookeeper是什么2. Zookeeper的特性3. Zookeeper主要目录结构4. zoo.cfg文件配置5. Zookeeper数据模型
5.1 Zookeeper数据模型介绍5.2 Zookeeper数据模型基本操作
5.2.1 客户端连接与关闭5.2.2 查看znode结构 6. Zookeeper的使用场景 二、常用命令
1. 查看
1.1 查看该路径下的节点1.2 查看该节点的详细信息1.3 获取该节点的数据 2. 创建
2.1 创建2.2 创建临时节点2.3 创建顺序节点 3. 修改
3.1 修改3.2 指定版本号修改 4. 删除
4.1 删除4.2 指定版本号删除 三、Zookeeper的watcher机制
1. watcher的命令行操作
1.1 父节点 增删改操作 触发watcher1.2 子节点 增删改操作 触发watcher 2. watcher使用场景
2.1 统一资源配置 四、ACL(access control lists)权限控制
1. Zookeeper的ACL的构成
1.1 scheme分类 2. ACL使用场景 五、四字命令
一、简介 1. Zookeeper是什么
中间件,为分布式系统提供协调服务。
2. Zookeeper的特性一致性:按照顺序分批入库原则性:事务要么成功,要么失败单一视图:客户端连接集群任一zk节点,数据都是一致的可靠性:每次对zk的操作状态都会保存在服务端实时性:客户端可以读到服务端的最新数据 3. Zookeeper主要目录结构
bin:主要的一些运行命令conf:存放配置文件docs:文档,一些htmllib:依赖的jar包 4. zoo.cfg文件配置
tickTime:用于计算的时间单元(单位:ms)。比如session超时时间:N * tickTime,zookeeper里所有的时间都以它为倍数来就行计算initLimit:用于集群,允许“从节点”连接并同步到“master节点”的初始化连接时间,以tickTime的倍数来表示syncLimit:用于集群,“master节点”与“从节点”之间发送消息,请求和应答的时间长度(心跳机制)dataDir:数据存储的位置(必须配置)dataLogDir:日志目录,如果没有,则会使用dataDir目录clientPort:服务的端口,默认2181 5. Zookeeper数据模型 5.1 Zookeeper数据模型介绍
是一个树形结构,可理解为Linux/Unix的文件目录每一个节点称为znode,它可以有子节点,也可以有数据每一个节点分为临时节点和永久节点,临时节点在客户端断开后消失每一个zk节点各自的版本号,可以通过命令来显示节点信息每当节点数据发生变化,那么该节点的版本号就会累加(乐观锁)删除/修改过时节点,版本号不匹配则会报错每个zk节点存储的数据不宜过大,几k即可节点可以设置权限acl,可以通过权限来限制用户的访问 5.2 Zookeeper数据模型基本操作 5.2.1 客户端连接与关闭
连接:启动zkCli关闭:Ctrl + C 5.2.2 查看znode结构
ls /6. Zookeeper的使用场景
master节点选举
主节点挂了以后,从节点就会接手工作,并且保证这个节点是唯一的,这也就是“首脑模式”,从而保证集群的高可用
统一配置文件管理
只需要部署一台服务器,就可以把相同的配置文件同步更新到其他所有服务器。这在云计算中使用很多
6.3 发布与订阅
类似消息队列MQ,dubbo发布者会把数据存在znode上,订阅者会读取这数据
提供分布式锁
分布式的环境中不同进程之间相互争夺资源,类似于多线程中的锁
6.5 集群管理
二、常用命令在集群中保证数据的强一致
首先通过zkCli(zookeeper的bin目录下,Windows是.cmd,Linux是.sh)打开客户端命令行后台。
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port -client-configuration properties-file cmd args
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path [-b batch size]
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
version
1. 查看
1.1 查看该路径下的节点
ls [路径]
[zk: localhost:2181(CONNECTED) 8] ls / [zookeeper]1.2 查看该节点的详细信息
stat [路径]
[zk: localhost:2181(CONNECTED) 0] stat / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1
cZxid:节点创建时,zookeeper为其分配的idctime:节点创建的时间mZxid:修改后zookeeper为其分配的idmtime:节点的修改时间pZxid:子节点的idcversion:子节点的versiondataversion:当前节点数据的版本号aclVersion:权限的版本ephemeralOwner:session的id,如果是0x0 就是一个永久节点,否则为临时节点dataLength:数据长度numChildren:子节点个数 1.3 获取该节点的数据
get [路径]
[zk: localhost:2181(CONNECTED) 6] get /zookeeper/config
因为是空,所以没数据。
2. 创建 2.1 创建[zk: localhost:2181(CONNECTED) 0] create /test test-data Created /test [zk: localhost:2181(CONNECTED) 1] ls /test [] [zk: localhost:2181(CONNECTED) 2] get /test test-data2.2 创建临时节点
[zk: localhost:2181(CONNECTED) 3] create -e /test/tmp test-data Created /test/tmp [zk: localhost:2181(CONNECTED) 4] get /test/tmp test-data
session超时与心跳机制
2.3 创建顺序节点[zk: localhost:2181(CONNECTED) 2] create -s /test/sec seq-data Created /test/sec0000000004 [zk: localhost:2181(CONNECTED) 3] create -s /test/sec seq-data Created /test/sec0000000005 [zk: localhost:2181(CONNECTED) 4] create -s /test/sec seq-data Created /test/sec00000000063. 修改 3.1 修改
[zk: localhost:2181(CONNECTED) 22] set /test 12345 [zk: localhost:2181(CONNECTED) 23] get /test 123453.2 指定版本号修改
[zk: localhost:2181(CONNECTED) 21] set /test test-data12 -v 1
只能指定最新的版本号
4. 删除 4.1 删除[zk: localhost:2181(CONNECTED) 33] delete /test/sec00000000044.2 指定版本号删除
[zk: localhost:2181(CONNECTED) 32] delete -v 0 /test/sec0000000003
只能指定最新的版本号
三、Zookeeper的watcher机制1. watcher的命令行操作 1.1 父节点 增删改操作 触发watcher针对每个节点的操作,都会有一个监督者,那就是watcher。
当监控的某个znode节点发生变化,则会触发watcher事件。
zookeeper中的watcher是一次性的,触发后立即销毁。
stat 和 get 命令都可以创建父节点的watcher
创建父节点,触发:NodeCreated
[zk: localhost:2181(CONNECTED) 10] stat -w /test Node does not exist: /test [zk: localhost:2181(CONNECTED) 11] create /test test-data WATCHER:: WatchedEvent state:SyncConnected type:NodeCreated path:/test Created /test
修改父节点数据,触发:NodeDataChanged
[zk: localhost:2181(CONNECTED) 24] create /test test-data Created /test [zk: localhost:2181(CONNECTED) 25] stat -w /test cZxid = 0x55 ctime = Fri Jan 14 15:12:57 CST 2022 mZxid = 0x55 mtime = Fri Jan 14 15:12:57 CST 2022 pZxid = 0x55 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 9 numChildren = 0 [zk: localhost:2181(CONNECTED) 26] set /test change-data WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/test
删除父节点,触发:NodeDeleted
[zk: localhost:2181(CONNECTED) 55] create /test test-data Created /test [zk: localhost:2181(CONNECTED) 56] get -w /test test-data [zk: localhost:2181(CONNECTED) 57] delete /test WATCHER:: WatchedEvent state:SyncConnected type:NodeDeleted path:/test1.2 子节点 增删改操作 触发watcher
ls为父节点设置watcher,创建子节点触发:NodeChildrenChanged
[zk: localhost:2181(CONNECTED) 34] ls -w /test [] [zk: localhost:2181(CONNECTED) 35] create /test/testChildren children-data WATCHER:: WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/test Created /test/testChildren
ls为父节点设置watcher,删除子节点触发:NodeChildrenChanged
[zk: localhost:2181(CONNECTED) 36] ls -w /test [testChildren] [zk: localhost:2181(CONNECTED) 37] delete /test/testChildren WATCHER:: WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/test
ls为父节点设置watcher,修改子节点不触发事件
[zk: localhost:2181(CONNECTED) 40] ls -w /test [testChildren] [zk: localhost:2181(CONNECTED) 41] set /test/testChildren change-data2. watcher使用场景 2.1 统一资源配置
举个栗子:
假设一个zk集群由三台机器构成,每个集群节点都是一致的。主机更新了配置信息以后,会通知到zk节点,并为它设置watcher事件,然后将该节点的数据修改为新的配置信息,触发watcher,客户端会收到一个NodeDataChanged事件来更新客户端的配置。
设置一个watcher事件后zk集群的每一个主机都会有一个watcher事件,当主机更新一个节点后,其他主机的节点数据也会被改变,各自也会触发自己的watcher事件去更新客户端。
针对节点可以设置相关读写等权限,目的是为了保障数据的安全性
权限permission可以指定不同权限范围以及角色
getAcl:获取某个节点的acl权限信息。setAcl:设置每个节点的acl权限信息。addauth:注册一个用户,把用户名密码输入到系统里进行注册。注册(或登录)时输入明文密码,但是在zk的系统里,密码是以加密形式存在的。 1. Zookeeper的ACL的构成
zk的acl通过[scheme : id : permissions]来构成权限列表
scheme:代表采用的某种权限机制id:代表允许访问的用户permissions:权限组合字符串
权限字符串缩写–crdwa。
CREATE:创建子节点READ:获取节点/子节点WRITE:设置节点数据DELETE:删除子节点ADMIN:设置权限 1.1 scheme分类
scheme和id其实是捆绑使用的,针对不同的scheme使用不同的id。
world:world下只有一个id,也就是只有一个用户,那就是anyone,任何人都可以访问,组合写法就是 world:anyone:[permissions]
auth:代表认证登录,需要注册用户有权限就可以,形式为 auth:user:password:[permissions]
digest:需要对密码加密才能访问,组合形式为 digest:username:base64(SHA1(password)):[permissions]
auth和digest的区别就是,一个是明文密码,一个是密文密码。而在真实的开发环境中,更多还是使用加密的方式。
[zk: localhost:2181(CONNECTED) 4] create /test test-data Created /test [zk: localhost:2181(CONNECTED) 5] getAcl /test 'world,'anyone : cdrwa [zk: localhost:2181(CONNECTED) 6] addauth digest demo_user:demo_password [zk: localhost:2181(CONNECTED) 7] setAcl /test auth:demo_user:demo_password:cdrwa [zk: localhost:2181(CONNECTED) 8] getAcl /test 'digest,'demo_user:m+N7RKYXjF5f+O8Ak/o9DDuWZ7A= : cdrwa
断开连接后重连
[zk: localhost:2181(CONNECTED) 0] get /test Insufficient permission : /test [zk: localhost:2181(CONNECTED) 1] getAcl getAcl [-s] path [zk: localhost:2181(CONNECTED) 2] getAcl /test Insufficient permission : /test [zk: localhost:2181(CONNECTED) 3] addauth digest demo_user:demo_password [zk: localhost:2181(CONNECTED) 4] get /test test-data
ip:当设置为ip指定的ip地址,此时限制ip进行访问,比如:ip:192.168.1.1:[permissions]
[zk: localhost:2181(CONNECTED) 0] ls / [test_ip, zookeeper] [zk: localhost:2181(CONNECTED) 1] getAcl /test_ip 'world,'anyone : cdrwa [zk: localhost:2181(CONNECTED) 2] setAcl /test_ip ip:101.33.XXX.XXX:cdrwa [zk: localhost:2181(CONNECTED) 3] getAcl /test_ip Insufficient permission : /test_ip
super:超级管理员,拥有所有权限
如何创建一个超级管理员?
- 修改zkServer.sh 增加super管理员
增加这一行,密码是加密后的密文密码。
- 重启zkServer.sh
开发/测试环境分离生产环境上控制指定IP的服务可以访问相关节点,防止混乱 五、四字命令
zk可以通过他自身提供的简写命令来与服务器交互
需要用到nc命令
yum install nc
用法:
echo [command] nc [ip] [port]
官网:https://zookeeper.apache.org/doc/r3.7.0/zookeeperAdmin.html#sc_4lw
测试一下
[root@VM-8-4-centos bin]# echo stat | nc 10.0.8.4 2181 stat is not executed because it is not in the whitelist.
查了一下原因是因为要在zoo.cfg里添加配置放行指令
然后重启一下,再次尝试就成功了
[root@VM-8-4-centos bin]# echo stat | nc 10.0.8.4 2181 Zookeeper version: 3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT Clients: /127.0.0.1:53736[1](queued=0,recved=1,sent=1) /10.0.8.4:36962[0](queued=0,recved=1,sent=0) Latency min/avg/max: 0/0.0/0 Received: 2 Sent: 1 Connections: 2 Outstanding: 0 Zxid: 0xa4 Mode: standalone Node count: 6
其他操作参见官网。



