zoukankan      html  css  js  c++  java
  • 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编码
     
     
     
     
     
  • 相关阅读:
    几种常用的曲线
    0188. Best Time to Buy and Sell Stock IV (H)
    0074. Search a 2D Matrix (M)
    0189. Rotate Array (E)
    0148. Sort List (M)
    0859. Buddy Strings (E)
    0316. Remove Duplicate Letters (M)
    0452. Minimum Number of Arrows to Burst Balloons (M)
    0449. Serialize and Deserialize BST (M)
    0704. Binary Search (E)
  • 原文地址:https://www.cnblogs.com/756623607-zhang/p/7088006.html
Copyright © 2011-2022 走看看