ZooKeeper篇:Watcher机制与ACL权限控制

Watcher(数据变更通知)


        ZooKeeper提供了分布式数据的发布/订阅功能。引入了Watcher机制来实现分布式通知功能。ZooKeeper允许客户端向服务端注册一个Watcher监听,当服务端的一些指定事件出发了这个Watcher,那么就会向指定客户端发送一个事件通知来实现分布式通知功能。


        ZooKeeper的Watcher的Watcher机制主要包括客户端线程、客户端WatchManager和ZooKeeper服务器三部分。客户端在向ZooKeeper服务器注册Watcher的同时,会将Watcher对象存储在客户端的WatchManager中。当ZooKeeper服务端触发Watcher时间后,会向客户端发送通知,客户端线程从WatchManager中取出对应的Watcher对象来执行回调逻辑。

客户端注册Watcher

        创建一个ZooKeeper客户端对象实例是,可以向构造方法中传入一个默认的Watcher,会一直被保存在客户端ZKWatchManager的DefaultWatcher中。另外,ZooKeeper客户端也可以通过getData、getChildren和exist三个接口向ZooKeeper服务器注册Watcher。


        在接口注册Watcher后,客户端首先会对当前客户端请求request,将其设置为“使用Watcher监听”,同时会封装一个Watcher的注册信息WatchRegistration,用于暂时保存节点的路径和Watcher的对应关系。


        ZooKeeper中Packet可以被看做一个最小的通信协议单元,用于进行客户端与服务端之间的网络传输,任何需要传输的对象都需要包装成一个Packet对象,因此在ClientCnxn中WatchRegistration又会被封装到Packet中区,然后放入发送队列中等待客户端发送。


        随后,ZooKeeper客户端就会向服务端发送这个请求,同时等待请求返回。完成请求发送后,会由客户端SendThread线程的readResponse方法负责接受来自服务端的响应,finishPacket方法会从Packet中取出对应的Watcher并注册到ZKWatchManager中去。


        客户端将之前暂时保存的Watcher对象转交给ZKWatchManager,并最终保存到dataWatches中去。


        在对Packet对象的序列化中,并没有将WatchRegistration对象完全序列化到底层字节数组中,只会讲requestHeader和request两个属性进行序列化。



服务端注册Watcher

        服务端接收 Watcher 并存储接收到客户端请求,处理请求判断是否需要注册 Watcher,需要的话将数据节点的节点路径和 ServerCnxn(ServerCnxn 代表一个客户端和服务端的连接,实现了 Watcher 的 process 接口,此时可以看成一个 Watcher 对象)存储在WatcherManager 的 WatchTable 和 watch2Paths 中去。WatcherManager是ZooKeeper服务端Watcher的管理者,负责watcher的存储、触发以及移除那些已经被触发的Watcher。


        Watcher的触发逻辑都是一致的,基本步骤如下:

        1.封装WatchedEvent,将通知状态(KeeperState)、事件类型(EventType)以及节点路径(Path)封装成一个WatchedEvent对象。

        2.查询Watcher,根据数据节点的节点路径从watchTable中取出对应的Watcher。同时将其从watchTable和watch2Paths删除。

        3.调用process方法来触发Watcher,在请求头中标记“-1”,表明当前是一个通知,将WatchedEvent包装成WatcherEvent,以便进行网络传输序列化,向客户端发送通知。


客户端回调Watcher

        对于来自服务端的响应,如果响应头replyHdr中标识了XID为-1,表明这是一个通知类型的响应,处理流程为反序列化、处理ChrootPath、还原WatchedEvent、回调Watcher。



ACL(权限控制机制)


        ACL是ZooKeeper中对数据节点的权限控制,分为:权限模式(Scheme)、授权对象(ID)和权限(Permission)


权限模式(Scheme)

        权限模式用来确定权限验证过程中使用的检验策略。使用最多的是四种权限模式:Ip(IP地址)、Digest(用户名密码)、World(全开放)、Super(超级用户)


授权对象(ID)

        授权对象指的是权限赋予的用户或一个指定实体,不同的权限模式下,授权对象是不同的:Ip(IP地址或是IP段)、Digest(自定义)、World(只有一个ID:“anyone”)、Super(与Digest模式一致)


权限(Permission)

        权限就是那些通过权限检查后可以被允许执行的操作。分为五大类:CREATE(创建权限)、DELETE(删除权限)、READ(读取权限)、WRITE(更新权限)、ADMIN(管理权限)



参考:

《从Paxos到ZooKeeper分布式一致性原理与实践》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值