目录
ZooKeeper特性
Session的基本原理
启动命令行操作
ls命令
ls2命令
stat命令
get命令
状态信息的含义
Create命令
set命令
delete命令
Watcher命令行
watcher机制
watcher简单使用
watcher父节点事件类型
watcher子节点事件类型
watcher使用场景
ACL(access control lists)权限控制
ACL命令行简单使用
ACL的构成
ACL命令行使用
1.word:anyone:cdrwa
2.auth:user:pwd:cdrwa、digest:user:BASE64(SHA1(pwd)):cdrwa、addauth digest user:pwd
3.ip:192.168.1.1:cdrwa
4.超级用户的设置
ACL使用场景
ZooKeeper四字命令 Four Letter Words
stat命令
ruok命令
dump命令
conf命令
cons命令
envi命令
mntr命令
wchs命令
1.客户端与服务端之间存在的连接也就是会话 session
2.每一个会话都可以设置一个超时时间
3.心跳结束,session则过期
4.session过期,则临时节点znode会被抛弃
5.心跳机制:客户端向服务端的ping包请求
通过./zkCli.sh打开ZooKeeper的客户端进入命令行平台
connected 表示已连接2181这个端口,表示已经进入到zookeeper自己的控制台
ls path [watch ] 指可以查看某一个路径下有哪些目录列表 watch是一个监督者
子目录相当于节点,zookeeper这里就是以节点来说,所以说 / 就是根节点,zookeeper就是父节点, quota就是子节点
ls2 path [watch ]
/ 就是根节点,zookeeper是根节点下的节点 下面一堆的数据就是它的状态信息
它会将上边的状态信息全部抄出来
所以可以看出 ls2命令 相当于ls + stat命令
它会将当前的目录(节点),每个节点都会存储数据,它会将当前节点我们存储的数据取出来
因为现在为空,所以现在是没有任何的数据。下面的一堆数据也是状态信息。
cZxid = 0x0 代表zookeeper创建后为这个节点所分配的ID
ctime = Thu Jan 01 08:00:00 CST 1970 代表zookeepe这个节点r创建时间(createtime)
mZxid = 0x0 代表修改(modify)后 zookeepe分配的一个ID
mtime = Thu Jan 01 08:00:00 CST 1970 代表修改(modify)后的时间 如果该节点没有被修改 它的修改时间和创建时间是一样的
pZxid = 0x0 代表子节点的一个ID
cversion = -1 代表的是子节点的版本(version) 子节点发生变化子节点版本就会发生变化
dataVersion = 0 代表当前节点数据的一个版本号 如果当前节点数据修改版本号会自动累加1
aclVersion = 0 代表一个权限模型 acl代表权限 当节点权限发生变化的时候 权限的版本会自动累加1
ephemeralOwner = 0x0
dataLength = 0 代表的是数据 长度
numChildren = 1 代表的是它下面的子节点有几个
create [-s] [-e] path data acl
如果不写 -s -e则会进行默认的创建,是非顺序的也就是没有顺序的并且是持久化的。
当我们创建的时候在指令上加上 -e 我们会创建一个临时的节点
我们可以看到之前创建的子节点的版本号cversion变为1
在tmp创建的子节点 ephemeralowner不是0X0了,而是一个字符了,代表的这个该节点是一个临时节点,运用这个属性值我们可以判断我们的节点是否为临时节点
我们按住ctrl +c 重新进入我们命令行控制台,进入我们的wj子节点会看到我们之前创建的tmp临时节点已经被删除掉了,根据心跳机制的时效性将其删除
当我们创建的时候在指令上加上 -s 我们会创建一个顺序节点
set path data [version] 设定某一目录,给某一个值 修改我们的节点操作
我们可以看到 cversion版本号由0变为1 了
如果在修改之前我们获取当前版本号为1 进行修改并且已修改成功,这时候另一个人还去进行对这个版本号为1的进行修改,会报错
delete path [version] 删除某个节点 如果不加版本号则会删除这个节点 如果加上版本号节点则会只会去删除掉对应的版本号
我们可以看到不带有version直接将sec00**01那个子节点进行了删除操作
当我们的子节点版本变为1时,我们删除该子节点的版本还是0的话则会进行一个报错,提示我们删除对应的子节点
1.针对每一个节点的操作,都会有一个监督者 (watcher)相当于一个触发器
2.当监控的某个对象(znode)发生了变化,则触发watcher事件
3. zookeeper中的watcher是一次性的,触发后立即销毁,通过某些手段我们也可以将其设置为永久性的
4.父节点、子节点 增删改都能触发其watcher
5.针对不同类型的操作,触发的watcher事件也不同(节点创建事件、节点删除事件、节点数据变化事件)
1.通过get path [watch] 设置watcher
2.父节点 增删改 操作触发 watcher
3.子节点 增删改 操作触发watcher
1.创建父节点触发:NodeCreated
我们设置一个wjj的事件状态 当我们创建wjj时候可以看到触发了watcher事件 事件类型是NodeCreated path为我们所针对的一个路径目录
2.修改父节点数据触发:NodeDataChanged
当我们不去设置修改的触发事件时,我们修改后不会去触发,当我们设置完修改的触发事件时,我们看到了触发了watcher事件 事件类型为NodeDataChanged path为我们所针对的一个路径目录
3.删除父节点触发:NodeDeleted
我们可以看到设置完成后,当我们删除wjj节点时,watcher被触发 事件类型为NodeDeleted ,path为我们所针对的一个路径目录。
1.ls为父节点设置watcher,创建子节点触发:NodeChildrenChanged
我们创建父节点wjj 对父节点设置watcher事件 当我们在wjj下创建子节点时 触发watcher事件 事件类型为NodeChildrenChanged path为父节点路径 creared为子节点路径
2.ls为父节点设置watcher,删除子节点触发:NodeChildrenChanged
我们在父节点wjj 对父节点设置watcher事件 当我们在wjj下删除子节点a时 触发watcher事件 事件类型为NodeChildrenChanged path为父节点路径
3.ls为父节点设置watcher,修改子节点不触发事件
我们先对wjj创建watcher事件,新增子节点aa时触发新增子节点事件,再对wjj创建watcher事件,但是我们修改子节点时没有触发watcher事件,这是zookeeper的机制,我们需要将子节点当做父节点来设置才可以
当我们用get我们的子节点设置watcher事件时,修改子节点时才会触发 事件类型为NodeDataChanged
1.统一资源配置
如果三台服务器节点相同,我们只需要更新其中一台,根据watcher事件会对其余两台进行更新。
1.针对某一个节点可以设置相关读写等权限,目的是为了保障数据安全性
2.权限permissions可以指定不同的权限范围以及角色(对不同的角色创造出不同的组合)
1.getAcl:获取某个节点的acl权限信息
2.setAcl:设置某个节点的acl权限信息
3.allauth:输入认证授权信息,注册时输入明文密码(登录)但是在zookeeper的系统里,密码是以加密的形式存在的
1.zookeeper的acl通过[scheme:id:permissions]来构成权限列表
scheme:代表采用的某种权限机制 (四到五种权限机制 一般常用的为四种)
(1)word:word下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是world:anyone:[permissions]
也就是我们常说的默认的权限
(2)auth:代表认证登录,需要注册用户有权限就可以,形式为auth:user:password:[permissions]
(3)digest:需要对密码加密才能访问,组合形式为digest:username:BASE64(SHA1(password)):[permissions]
简单的来说,auth与digest的区别就是,前者明文,后者密文 setAcl /path auth:lee:lee:cdrwa 与setAcl /path digest:lee:BASE64(SHA1(lee)):cdrwa是等价的,再通过addauth digest lee:lee后都能操作指定节点的权限
(4)ip:当设置为ip指定的ip的地址,此时限制ip进行访问,比如ip:192.168.1.1:[permissions] 因为我们是进行分布式的部署,所以可以对某些IP设定访问某个节点
(5)super:代表超级管理员,拥有所有的权限 它的修改需要我们修改一下文档配置
id:代表允许访问的用户
permissions;权限组合字符串
权限字符串缩写:crdwa
create:创建子节点
read:获取当前节点/当前节点下子节点
write:设置当前节点数据
delete:删除子节点
admin:设置权限
我们可以看到我们在wjj节点下创建的abc子节点拥有的是默认的权限
我们将我们的wjj下abc的子节点设置一个不能删除的权限 crwa 没有d
再abc下创建子节点ab 当我们删除ab这个子节点时,会告诉我们没有权限无法进行删除
我们这时候重新将abc节点权限设置为rda,这时候我们删除abc下子节点ab就不会报错,可以删除
当我们将权限只设置为a的时候,我们去读取它发现也没有读取的权限了,而且也没有更改数据的权限
我们先创建一个test子节点 在test下创建abc子节点 ,我们可以看到abc子节点下是默认的权限,这时候我们对abc节点设置权限,提示我们需要进行注册才可以使用
我们先对wj进行注册后,继续上面的命令行,可以看到权限设置成功
我们查看一下,发现是成功的,密码被加密了
我们可以继续使用功能,因为我们权限是都开放的是都可以使用的,我们这时候用aaa来进行重新设置权限,然后查看权限 发现还是我们之前设置的wj 是因为不管后续我们输入的什么都是根据第一个设置的
创建一个a节点,在创建a的子节点b,权限是默认的权限
digest与auth的区别一个密文,一个是明文,但是保存的时候都是密文的。查看权限已经设置成功了
这时候我们查看是不可以的,因为我们还没有进行登录
我们进行登录的时候都是按照明文的方式进行登录,然后可以成功的查看子节点信息
因为权限设置的时候没有设置修改的权限,所以不能修改,但是删除该节点是可以操作的,并且成功删除掉
在a节点下创建子节点ip 权限为默认权限
更改权限 ,可以看到权限已经更改为我们设置的ip地址
因为我们还没有设置客户端,所以现在无权限来进行访问
1.修改 zkServer.sh增加super管理员
加入 "-Dzookeeper.DigestAuthenticationProvider.superDigest=wj:64ibjjwm94195LPhuzhUdkIjOl0=" \
2.重启zkServer.sh
配置文件修改完成后,我们重启zkServer
我们看我之前设置的子节点ip还是无法访问,当我们登陆超级管理员帐号后,我们就可以查看ip子节点了
1.开发/测试环境分离,开发者无权操作测试库的节点,只能看
2.生产环境上控制指定ip的服务可以访问相关节点,防止混乱
1.ZooKeeper可以通过自身提供的简写命令来和服务器进行交互
2.需要使用到nc命令,安装: yum install nc
3.echo [commond] | nc [ip] [port] commond代表命令 ip及port代表ZooKeeper的ip及port
查看zk的状态信息,以及是否mode (集群还是单例)
mode 中standalone 属于单机运行
查看当前zkServer是否启动,返回imok 可以理解为are you ok?
说明是启用的
列出未经处理的会话和临时节点
我们可以看到当前会话和临时节点都是0 因为我们没有连接客户端
查看服务器配置
展示连接到服务器的客户端信息
查看zk的环境变量
监控zk健康信息
展示watch的信息