zookeeper数据模型:
我们的zookeeper是以节点的形式存在的,这样的形式和数据结构中的树的形式很像。同时也很像我们的linux的结构,例如linux的/user/local目录下可以有我们的/usr/local/tomcat目录。这样的节点形式。
我们的zookeeper中的每一个节点都称之为我们的zNode。另外我们的zookeeper中包含我们的acl属性,acl是我们学习zookeeper中特别重要的一个内容,它是我们的权限,我们可以给zookeeper节点设置相应的权限。另外我们zookeeper包含两个节点类型:永久节点和临时节点。
zookeeper常用命令之zkCli:
这里我们先来说一点,我们上次笔记是直接就启动了zookeeper,但是实际上我们应该先切到我们的用户,然后再去启动我们的zookeeper:
接着我们再进入到我们的zookeeper的bin目录中去:
然后我们去启动我们的zookeeper:
然后我们就来学我们的zkCli脚本:
./zkCli.sh h
我们用这个命令可以打开我们的帮助文档:
我们知道我们的zookeeper是一个节点的形式。/usr/local。
那么我们怎么去在zookeeper里去创建一个节点呢?
我们文档里的这句话就是我们创建节点的方式:
-s是我们的顺序节点,-e是我们的临时节点,path是我们的路径,data是我们节点中存放的数据,acl是权限(我们这里暂时用不到)。
我们直接这样就可以启动我们虚拟机中的zkCli.
我们这样就创建了我们的一个有序节点。
我们的路径必须要带/,不然会报错。
然后我们再去创建一个节点:
我们可以获取我们节点的子节点:
ls path
我们现在来查看一下节点里的数据:
get path
我们还可以查看到节点的状态:
stat path
那么这些信息都是什么含义呢?
查看获取节点的子节点以及当前的状态:
ls2 path
我们这里没有创建子节点,所以我们查看不到我们的子节点。
我们现在就来创建一下我们的子节点:
然后我们再去查一下:
我们就可以看到包含我们的一个子节点wiggin。
修改节点的数据 set path data[version]:
这是我们原来节点里的数据:
然后我们再去查看:
我们的数据就发生了改变了。
我们这里修改了之后,我们的dataVersion就+1了。
那我们语法中的version是干什么的呢?
如果我们自己定义的版本和我们的dataVersion不一样,那么我们就无法设置成功。
如果我们设置的版本和我们的dataVersion一样:
我们的dataVersion就自增了。
这就是我们最后的值了。
然后我们去看看怎么去删除一个节点:
delete path[version] | rmr path
我们发现因为我们这个节点下是有我们的根节点的,所以我们无法直接使用delete语句进行删除。
我们使用rmr 递归删除就可以成功删除了。
那我们到这里就结束了。我们的zookeeper zkCli语句基本上就是我们的对节点的增删改查操作。
深入理解zookeeper的session机制:
我们可以看到这里是有一个节点的。
那么我们按住ctrl+C去强制退出一下:
再去打开我们的zookeeper,那我们的这个节点还会存在么?
我们发现这个节点还存在,这是什么原因呢?
这是因为心跳机制还没有过期。
那么我们退出以后等比较长的一段时间看一下呢?
如果我们的服务端长期没有收到我们的客户端,那么它会认为我们的客户端死亡了。
我们现在再去登录看一下:
就会没有了。
我们再把它创建出来。
我们也可以强制断开使用close命令:
深入理解zookeeper watcher机制:
watcher主要是监控节点的变更。
我们现在没有任何节点。
现在我们来创建一个节点:
不带任何修饰,我们这里创建的就是我们永久的节点。
我们可以这样去查看到它的状态。
然后我们打开另一个终端:
我们在这个终端中去变更这个节点的数据:
我们的另一个终端马上开启了watch。
我们第二次变更发现,没有再次触发我们的watcher。在zookeeper中watcher是不会重复使用的。
get和state可以去对所有节点进行watch。
我们还有一个针对子节点的。
那我们先来去创建一个子节点:
然后我们在另一个终端去变更这个子节点:
我们发现这边并没有什么作用。也就是说get和state不会针对我们的子节点。
现在我们使用这个命令。
再去变更子节点:
我们发现ls和ls2针对于子节点的数据变化是不会触发watch事件的。
对于增加和删除会触发watch事件。
那么我们现在来去创建一个子节点:
马上就开启了我们的watch事件。
然后我们再去创建一个子节点的子节点:
这时候没有触发watch。也就是说只有针对直接子节点会触发watch,对于子节点的子节点是不会去触发的。
zookeeper的acl权限控制:
现在我们创建了一个新的节点。
我们可以这样查看到权限。
但是它显示的信息是什么意思呢?
我们去设置它的权限,发现我们还没有注册这个用户。
那么我们来去增加一个用户:
然后我们再去设置它的权限:
我们再去查看一下它的权限:
如果 我们在另一个终端直接去访问,是访问不到的。
我们就要去获取权限:
我们现在来更改一下它的权限:
然后现在我们给它去创建一个子节点:
我们可以看到它里面包含一个子节点。
我们直接删除的话肯定是没有权限的。
我们现在来获取权限:
显示我们还是不能删除。
因为这个用户是没有删除权限的。
现在我们给它增加了一个删除权限。
这样我们就可以正常去删除了。
这节课为止,我们关于zookeeper的一些基本的节点操作就掌握了。