Zookeeper--Watcher 和 ACL
Watcher (观察)
Zookeeper中的znode可以被监控,这是zk的核心特性。
通过exists,getChildren和getData这些读操作可以设置观察,通过create,delete和setData这些写操作触发观察。当一个观察被触发时会产生一个事件,这个观察和触发它的操作共同决定了观察事件的类型。
1.当所观察的znode被创建,删除或其数据被更新时,设置在exists操作上的观察被触发。
2.当所观察的znode被删除或其数据被更新时,设置在getData操作上的观察被触发。创建znode不会触发getData上的观察。
3.当所观察的znode的子节点被创建或删除,或所观察的znode被删除时,设置在getChildren上的观察会被触发。通过观察事件的类型来判断被删除的是znode还是其子节点:NodeDelete或NodeChildrenChanged。
观察和触发映射表:
创建节点 创建子节点 删除节点 删除子节点 setData
exists NodeCreated NodeDeleted NodeDataChanged
getData NodeDeleted NodeDataChanged
getChildren NodeChildrenChanged NodeDeleted NodeChildrenChanged
观察事件参数中可获取到被观察节点的路径,因此对于NodeCreated和NodeDeleted事件可获取到是哪个节点被创建和获取。
对于NodeChildrenChanged事件则需要使用getChildren方法获取新创建的节点。
对于NodeDataChanged事件则需要调用getData方法获取更新后的数据。注意:观察被触发后和获取数据之间节点可能又发生了变化。
ACL相关的操作不触发任何观察。
ACL (访问控制表)
每个znode被创建时都需要指定一个ACL列表,定义了该节点被执行各种操作的权限。
ACL依赖于Zookeeper的客户端身份验证机制。zk提供了以下几种验证方式:
Digest 通过用户名和密码来识别客户端
sasl 通过Kerberos来识别客户端
IP 通过客户端IP地址来识别客户端
每个ACL都是验证方式和赋予权限的组合,如 new ACL(Perms.READ, new ID("ip", "10.11.19.18")); 使用IP验证方式赋予READ权限
注意exists操作不需要任何权限,因此任何客户端都可以调用。
ACL权限表:
CREATE 允许create
READ 允许getChildren getData
WRITE 允许setData
DELETE 允许delete
ADMIN 允许setACL
在ZookDefs.Ids中定义了一些ACL,如OPEN_ACL_UNSAFE,将除ADMIN外的其他权限赋予每个客户端。
end