目录
一、概述
1.学习背景
注:作者刚刚接触这个内容,要是有错的地方,欢迎大家指出!
再经历spring的一些学习之后,再一次去认识一个框架dubbo,而这个框架是基于zookeeper搭建的,本来在学习框架dubbo的时候觉得zookeeper没那么复杂,就认知是,他作为一个中间代理,有着不让服务提供者消费者产生高耦合的作用,并且名字是叫做注册中心,“注册”这个词很好,就像是一个资源管理中心一样,服务提供者与服务消费者都去注册自己的身份并确立自己的需求(发布/订阅),提供者有发布内容之后告诉zookeeper,zookeeper根据消费者订阅名单通知他们,想想也是特别像是一个中介,但这个中介的实现逻辑却不是那么简单哦,至少不是说起来那么两句话的事情,所以我就开始掉进了这个神奇的坑。
2.简介
zookeeper是一个分布式应用提供一致性服务的软件。
它的功能:配置维护、域名服务(命名)、分布式同步、集群管理等。
功能详解
公式:zookeeper=文件系统+监听通知;
文件系统:具有执行远程文件存取的能力,并以透明方式对分布在网络上的文件进行管理和存取。
监听通知倾向于总结他是如何运作的。
二、zookeeper的基本结构
它本身的结构就跟我们的目录一样,像一颗树。
1.节点
(1)树节点:zNode 可存放数据,但不能放过大的数据,最多放个几M就好啦,可设置权限ACL:增删改查权限
(2)节点类型:
持久性节点(Persistent):需手动删除
临时性节点(Ephemeral):session断开便会自动删除,临时节点不能创建子节点
顺序性节点(Sequential):顺序特性实质是在创建节点的时候,会在节点名后面加上一个数字后缀,来表示其顺序。
(3)节点内容
数据内容
节点状态信息:
cZxid 就是 Create ZXID,表示节点被创建时的事务 ID;
mZxid 就是 Modified ZXID,表示节点最后一次被修改时的事务 ID;
ctime 就是 Create Time,表示节点创建时间;
mtime 就是 Modified Time,表示节点最后一次被修改的时间;
pZxid 表示该节点的子节点列表最后一次被修改时的事务 ID,只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新;
cversion 表示子节点的版本号;
dataVersion 表示内容版本号;(供修改的时候核对版本号)
dataLength 表示数据长度。
numChildren 表示子节点数。
2.常用命令
通过help命令打印出很多可用命令
zookeeper常用命令zkCli(客户端)
- 创建节点create [-s]/[-e] path data acl;
[-s] 顺序节点,[-e] 临时性节点,path 路径,data 数据内容,acl 权限 - 修改节点数据 set path data [version];
- 获取节点数据 get path;
- 删除节点 delete path [version];
有子节点这个命令是无法删除成功的,需要rmr path(递归删除) - 获取节点的子节点以及当前节点的状态 is2 path;
- 查看节点状态 start path
三、zookeeper的session
过程:C/S之间建立,一个TCP长连接来实现的,由客户端发起connecting,尝试连接一个服务器,成功:connected 失败:closed。
客户端能够使用心跳检测与服务器保持有效的会话,也能向服务器发送请求并接收响应,还可接收服务器的Watcher事件通知
ping的机制,发一个ping包。
Session的sessionTimeout,是会话超时时间,如果这段时间内,客户端未与服务器发生任何沟通(心跳或请求),服务器端会清除该session数据,客户端的TCP长连接将不可用,这种情况下,客户端需要重新实例化一个Zookeeper对象。
(心跳结束,session过期,该session所创建的所有临时节点都会被抛弃删除)
四、zookeeper的watcher机制
zookeeper引入了watcher机制来实现发布/订阅功能,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态发生变化时,会通知所有订阅者。
客户端向zk注册watcher的同时,会将客户端的watcher对象存储在客户端的WatchManager中;zk服务器触发watch事件后,会向客户端发送通知,客户端线程从watchManager中取出对应watcher执行。
watcher内容
NodeDataChanged事件:无论节点数据发生变化还是数据版本发生变化都会触发(即使被更新数据与新数据一样,数据版本都会发生变化)。
NodeChildrenChanged事件:新增和删除子节点会触发该事件类型。
注意:一级子节点增删会触发,修改不会,子节点再新增也不会触发,一定要是一级子节点
zookeeper原本加上watcher的话是一次性的,使用了会被立即销毁,若是需要一直监听,还需要注册。
五、zookeeper的权限控制acl
四种实现方式
- world 一个单独的ID,表示任何人都可以访问;
- auth 不使用ID,只有认证的用户可以访问;
- digest 使用username:password生成MD5哈希值作为认证ID;
- ip 使用客户端主机IP地址来进行认证.
六、使用场景
开发环境与测试环境,使用ACL可以进行分离,开发者无权去操作测试的节点
生产环境控制指定ip服务可以访问相关节点。
参考:
1.网课
2.https://www.cnblogs.com/likehua/p/3999610.html
3.https://www.cnblogs.com/IcanFixIt/p/7854114.html
4.https://blog.youkuaiyun.com/zkp_java/article/details/82711810
5.https://blog.51cto.com/welcomeweb/2103292?utm_source=oschina-app