zookeeper学习笔记-基本用法进阶
程序员文章站
2022-05-28 15:32:40
...
数据节点
数据节点Znode:
– 是机器的意思
– zk树形结构中的数据节点,用于存储数据
– 持久节点(PERSISTENT)一旦创建,除非主动调用删除操作,否则一直存储在zk上
– 临时节点(EPHEMERAL):与客户端的会话绑定,一旦客户端会话失效,与个客户端创建的所有临时节点都会被移除
– PERSISTENT _SEQUENTIAL 创建子节点时,如果不置属性SEQUENTIAL,则会自动在节点名称后面面追加一个整型数字,上限是整形的最大值
创建顺序节点1,节点数据为test1
创建顺序节点2,节点数据内容为test2
查看所有创建的顺序子节点
创建顺序节点,带前缀
zk-watcher
问题
– 集群中有多个机器,当某个通用的配置发生变化后,怎么让所有服务器的配置都统一生效?
– 当某个集群节点宕机,其它节点怎么知道?
Watcher组成
– 客户端
– 客户端watchManager
– zk服务器
Watcher机制
– 客户端向zk服务器注册watcher的同时时,会将watcher对象存储在
客户端的watchManager
– Zk服务器触发watcher事件后,会
向客户端发送通知,客户端线程从
watchManager中调起watcher执行
Watcher接口
– public class ZLock implements Watcher
– public void process(WatchedEvent event)
Watcher事件
– 通知状态:org.apache.zookeeper.Watcher.Event.KeeperState
– 事件类型:org.apache.zookeeper.Watcher.Event.EventType
NodeDataChanged事件
– 无论节点数据发生变化还是数据版本发生变化都会触发
– 即使被更新数据更新数据一样,数据版本都会发生变化
NodeChildrenChanged
– 新增节点或者删除节点
AuthFailed
– 重点不是客户端会话没有权限而是授权失败(后面详细讲)
创建zk客户端对象实例时注册
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly)
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd)
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean
canBeReadOnly)
通过这种方式注册的watcher将会作为整个zk会话期间的默认watcher,会一直被
保存在客户端ZKWatchManager的defaultWatcher中,如果有其它的配置置,则这个
watcher会被覆盖
其它注册api
– getChildren(String path, Watcher watcher)
– getChildren(String path, boolean watch)
• Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher
– getData(String path, boolean watch, Stat stat)
• Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher
– getData(String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx)
– exists(String path, boolean watch)
• Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher
– exists(String path, Watcher watcher)
客户端只能收到相关事件通知,但是并不能获取到对应数据节点的原始数据内容以
及变更更的新数据内容;因次,如果业务需要知道变更前的数据或者变更后的新数据,
需要业保存变更前的数据和调用接口获取新的数据
针对子节点的删除增加会触发事件,注册一次只能触发一次(非常重要),触发一次就会失效
判断调用是否需要注册watcher
如果需要注册,则传入对象cnxn
ServerCnxn类及cnxn对象
– Zk客户端与服务器之间的tcp连接
– 实现了watcher接口
– 总结:即包含了连接信息又包含watcher信息
watchManager
– Zk服务器端Watcher的管理者
– 从两个维度维护watcher
• watchTable:从数据节点的粒度来维护
• watch2Paths从watcher的粒度来维护
– 负责watcher事件的触发
Watcher触发
– DataTree类
• 维护节点目录树的数据结构
客户端回调watcher步骤
– 反序列化,将字节流转换成WatcherEvent对象
– 处理chrootPath
– 原watchedEvent:把WatcherEvent对象转换成WatchedEvent
– 回调Watcher:把WatchedEvent对象交给EventThread线程
EventThread
– 从客户端的ZKWatchManager中取出Watcher,并放入waitingEvents队列中
Acl组成
– Scheme:id:permission 比如:world:anyone:crdwa
– Scheme:验证过程中使用的检验策略
– Id:权限被赋予的对象,比如ip或者某个用户
– Permission:权限,上面的crdwa,表示五个权限组合
– 通过setAcl命令设置节点的权限
– 节点的acl不具有继承关系
– getAcl可以查看节点的Acl信息
Scheme类型--world
– Scheme:id:permission
– Id:固定值:anyone,表示任何用户
– world:anyone:crdwa表示任何用户都具有crdwa权限
Scheme类型---auth
– Scheme:id:permission ,比如: auth:username:password:crdwa
– 表示给认证通过的所有用户设置acl权限
– 时可以添加多个用户
– 通过addauth命令进行认证用户的添
• addauth digest <username>:<password>
– Auth策略的本质就是digest
– 如果通过addauth创建多组用户和密码,当使用setAcl修改权限时,所有的用户和密码的权限都会跟
着修改
– 通过addauth新创建的用户和密码组需要重新调用setAcl才会加入到权限组中去
Scheme类型---auth
Scheme类型---digest
– Scheme:id:permission ,比如:digest:username:password:crdwa
– 指定某个用户及它的密码可以访问
– 处的username:password必须经过SHA-1和BASE64编码
• BASE64(SHA1(username:password))
– 通过addauth命令进行认证用户的添加
• addauth digest <username>:<password>
Scheme类型---digest
Scheme类型---IP
– Scheme:id:permission ,比如: ip:127.0.0.1:crdwa
– 指定某个ip地址可以访问
Scheme类型---super
客户端通过super级别的用户admin授权
即可以访问任何节点
数据节点Znode:
– 是机器的意思
– zk树形结构中的数据节点,用于存储数据
– 持久节点(PERSISTENT)一旦创建,除非主动调用删除操作,否则一直存储在zk上
– 临时节点(EPHEMERAL):与客户端的会话绑定,一旦客户端会话失效,与个客户端创建的所有临时节点都会被移除
– PERSISTENT _SEQUENTIAL 创建子节点时,如果不置属性SEQUENTIAL,则会自动在节点名称后面面追加一个整型数字,上限是整形的最大值
创建顺序节点1,节点数据为test1
创建顺序节点2,节点数据内容为test2
查看所有创建的顺序子节点
创建顺序节点,带前缀
zk-watcher
问题
– 集群中有多个机器,当某个通用的配置发生变化后,怎么让所有服务器的配置都统一生效?
– 当某个集群节点宕机,其它节点怎么知道?
Watcher组成
– 客户端
– 客户端watchManager
– zk服务器
Watcher机制
– 客户端向zk服务器注册watcher的同时时,会将watcher对象存储在
客户端的watchManager
– Zk服务器触发watcher事件后,会
向客户端发送通知,客户端线程从
watchManager中调起watcher执行
Watcher接口
– public class ZLock implements Watcher
– public void process(WatchedEvent event)
Watcher事件
– 通知状态:org.apache.zookeeper.Watcher.Event.KeeperState
– 事件类型:org.apache.zookeeper.Watcher.Event.EventType
NodeDataChanged事件
– 无论节点数据发生变化还是数据版本发生变化都会触发
– 即使被更新数据更新数据一样,数据版本都会发生变化
NodeChildrenChanged
– 新增节点或者删除节点
AuthFailed
– 重点不是客户端会话没有权限而是授权失败(后面详细讲)
创建zk客户端对象实例时注册
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly)
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd)
– ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean
canBeReadOnly)
通过这种方式注册的watcher将会作为整个zk会话期间的默认watcher,会一直被
保存在客户端ZKWatchManager的defaultWatcher中,如果有其它的配置置,则这个
watcher会被覆盖
其它注册api
– getChildren(String path, Watcher watcher)
– getChildren(String path, boolean watch)
• Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher
– getData(String path, boolean watch, Stat stat)
• Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher
– getData(String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx)
– exists(String path, boolean watch)
• Boolean watch表示是否使用上下文中默认的watcher,即创建zk实例时设置的watcher
– exists(String path, Watcher watcher)
客户端只能收到相关事件通知,但是并不能获取到对应数据节点的原始数据内容以
及变更更的新数据内容;因次,如果业务需要知道变更前的数据或者变更后的新数据,
需要业保存变更前的数据和调用接口获取新的数据
针对子节点的删除增加会触发事件,注册一次只能触发一次(非常重要),触发一次就会失效
判断调用是否需要注册watcher
如果需要注册,则传入对象cnxn
ServerCnxn类及cnxn对象
– Zk客户端与服务器之间的tcp连接
– 实现了watcher接口
– 总结:即包含了连接信息又包含watcher信息
watchManager
– Zk服务器端Watcher的管理者
– 从两个维度维护watcher
• watchTable:从数据节点的粒度来维护
• watch2Paths从watcher的粒度来维护
– 负责watcher事件的触发
Watcher触发
– DataTree类
• 维护节点目录树的数据结构
客户端回调watcher步骤
– 反序列化,将字节流转换成WatcherEvent对象
– 处理chrootPath
– 原watchedEvent:把WatcherEvent对象转换成WatchedEvent
– 回调Watcher:把WatchedEvent对象交给EventThread线程
EventThread
– 从客户端的ZKWatchManager中取出Watcher,并放入waitingEvents队列中
Acl组成
– Scheme:id:permission 比如:world:anyone:crdwa
– Scheme:验证过程中使用的检验策略
– Id:权限被赋予的对象,比如ip或者某个用户
– Permission:权限,上面的crdwa,表示五个权限组合
– 通过setAcl命令设置节点的权限
– 节点的acl不具有继承关系
– getAcl可以查看节点的Acl信息
Scheme类型--world
– Scheme:id:permission
– Id:固定值:anyone,表示任何用户
– world:anyone:crdwa表示任何用户都具有crdwa权限
Scheme类型---auth
– Scheme:id:permission ,比如: auth:username:password:crdwa
– 表示给认证通过的所有用户设置acl权限
– 时可以添加多个用户
– 通过addauth命令进行认证用户的添
• addauth digest <username>:<password>
– Auth策略的本质就是digest
– 如果通过addauth创建多组用户和密码,当使用setAcl修改权限时,所有的用户和密码的权限都会跟
着修改
– 通过addauth新创建的用户和密码组需要重新调用setAcl才会加入到权限组中去
Scheme类型---auth
Scheme类型---digest
– Scheme:id:permission ,比如:digest:username:password:crdwa
– 指定某个用户及它的密码可以访问
– 处的username:password必须经过SHA-1和BASE64编码
• BASE64(SHA1(username:password))
– 通过addauth命令进行认证用户的添加
• addauth digest <username>:<password>
Scheme类型---digest
Scheme类型---IP
– Scheme:id:permission ,比如: ip:127.0.0.1:crdwa
– 指定某个ip地址可以访问
Scheme类型---super
客户端通过super级别的用户admin授权
即可以访问任何节点