美文网首页
ZooKeeper篇:Watcher机制与ACL权限控制

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

作者: 东方明珠脚下的流浪猫 | 来源:发表于2020-07-16 18:41 被阅读0次

    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分布式一致性原理与实践》

    相关文章

      网友评论

          本文标题:ZooKeeper篇:Watcher机制与ACL权限控制

          本文链接:https://www.haomeiwen.com/subject/wajmhktx.html