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编码
     
     
     
     
     
  • 相关阅读:
    js中有哪些是循环遍历的方法?
    堆内存和栈内存
    Html5和Css3
    PyCharm IDE 的使用
    python基础语法
    数据挖掘书籍简介
    寄存器-2
    汇编基础
    Std::bind()
    手游页游和端游的服务端框架
  • 原文地址:https://www.cnblogs.com/756623607-zhang/p/7088006.html
Copyright © 2011-2022 走看看