wacher和acl
一、wacher
问题
1.集群中有多个机器,当某个通用的配置发生变化 ,怎么让所有服务器的配置都统一生效?
2.当某个集群节点宕机,其它节点怎么知道?
Zk中引入了watcher机制来实现了发布/订阅功能,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所 有订阅者
Watcher组成
– 客户端
– 客户端watchManager
– Zk服务器
Watcher机制
– 客户端向zk服务器注册watcher的同时,会将watcher对象存储在客户端的watchManager
– Zk服务器触发watcher事件后,会向客户端发送通知,客户端线程从 watchManager中掉起watcher执行
1.java接口
public interface Watcher;
只有一个抽象方法:abstract public void process(WatchedEvent event);
Watcher事件:
接口中有两个枚举类型:– 通知状态 org.apache.zookeeper.Watcher.Event.KeeperState
– 事件类型 org.apache.zookeeper.Watcher.Event.EventType
NodeDataChanged事件
– 无论节点数据发生变化还是数据版本发生变化都会触发
– 即使被更新数据和新数据一样,数据版本都会发生变化
NodeChildrenChanged事件
– 新增节点或者删除节点
AuthFailed事件
– 重点不是客户端会话没有权限而是授权失败
2.创建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)
e.g.:
/**
* Created by zhangboqing on 2017/6/2.
*/
public class WatcherObject implements Watcher {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("state:"+watchedEvent.getState());
System.out.println("type:"+watchedEvent.getType());
System.out.println("path:"+watchedEvent.getPath());
}
}
@Test
public void run( ) throws IOException, KeeperException, InterruptedException {
WatcherObject watcherObject = new WatcherObject();
ZooKeeper zooKeeper = new ZooKeeper("localhost:2181",10000,watcherObject);
zooKeeper.getChildren("/zode1",watcherObject);
Thread.sleep(1000000);
}
注意:Watcher设置后,一旦触发一次即会失效,如果需要一直监听,就需要再注册
3.客户端Watcher注册流程
4.服务端处理Watcher请求
二、acl
1.Scheme类型—world
– Scheme:id:permission
– Id为固定值:anyone,表示任何用户
– world:anyone:crdwa表示任何用户都具有crdwa权限
2.Scheme类型—auth
– Scheme:id:permission ,比如:auth:username:password:crdwa
– 表示给认证通过的所有用户设置acl权限
– 同时可以添加多个用户
– 通过addauth命令进行认证用户的添加
• addauth digest <username>:<password>
– Auth策略的本质就是digest
– 如果通过addauth创建多组用户和密码,当使用setAcl修改权限时,所有的用户和密码的权限都会跟着修改
– 通过addauth新创建的用户和密码组需要重新调用setAcl才会加入到权限组中去
3.Scheme类型—digest
– Scheme:id:permission ,比如 digest:username:password:crdwa
– 指定某个用户及它的密码可以访问
– 此处的username:password必须经过SHA-1和BASE64编码
• BASE64(SHA1(username:password))
– 通过addauth命令进行认证用户的添加
• addauth digest <username>:<password>
4.Scheme类型—IP
– Scheme:id:permission ,比如:ip:127.0.0.1:crdwa
– 指定某个ip地址可以访问
5.Scheme类型—super
– 供运维人员维护节点使用
– 有权限操作任何节点
– 启动时,在命令参数中配置
• -Dzookeeper.DigestAuthenticationProvider.superDigest=admin:015uTByzA4zSglcmseJsxTo7n3c=
• 打开zkServer.sh,第109行,在java命令后面增加以上配置
– 用户名和密码也需要通过sha1和base64编码
你投入得越多,就能得到越多得价值