一、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编码

 
 
 
 
 

wacher和acl的更多相关文章

  1. haproxy利用ACL规则封禁自定义IP地址拒绝访问

    现在有一个需求就是在发版的时候希望除公司IP外的外网访问服务的时候都是拒绝访问的 现在利用haproxy 的acl规则作出限制 errorfile       403 /etc/haproxy/err ...

  2. HAProxy的日志配置以及ACL规则实现负载均衡

    HAProxy配置日志策略 默认情况下,HAProxy是没有配置日志的在centos6.3下默认管理日志的是rsyslog,可以实现UDP日志的接收,将日志写入文件,写入数据库先检测rsyslog是否 ...

  3. CISCO VLAN ACL

    对于cisco VLAN ACL 首先得定义 standard ACL或 extented ACL用于抓取流量 注意这里的抓取流量不是最终的对流量的操作,而是决定什么样的流量用VLAN ACL 来处理 ...

  4. MAC OS X的ACL扩展权限设置

    在WEB开发时,网站是以_www的用户运行的,而我在本地是以liuwencan的用户编辑的.这就带来一个问题:如果所有文件属于liuwencan,那么网站运行需要写文件时就因无权限而失败:如果所有文件 ...

  5. linux ACL权限规划:getfacl,setfacl使用

    ACL即Access Control List 主要的目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置,ACL可以针对单一用户.单一文件 ...

  6. ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表

    zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...

  7. Centos下ACL(访问控制列表)介绍(转)

    我们知道,在Linux操作系统中,传统的权限管理分是以三种身份(属主.属組以及其它人)搭配三种权限(可读.可写以及可执行),并且搭配三种特殊权限(SUID,SGID,SBIT),来实现对系统的安全保护 ...

  8. ACL权限设置命令setfacl和getfacl命令

    ACL权限设置命令setfacl和getfacl命令 setfacl命令是用来在命令行里设置ACL(访问控制列表).在命令行里,一系列的命令跟随以一系列的文件名. [TOC] 选项 |参数|说明|   ...

  9. ZooKeeper设置ACL权限控制

    ZK的节点有5种操作权限:CREATE.READ.WRITE.DELETE.ADMIN 也就是 增.删.改.查.管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)注:这5种权限中,del ...

随机推荐

  1. 20155227 2016-2017-2 《Java程序设计》第九周学习总结

    20155227 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联 ...

  2. tablix“Tablix1”有一个具有内部成员的详细信息成员

    做报表的时候出现了这个错误: 错误 1 tablix“Tablix1”有一个具有内部成员的详细信息成员.详细信息成员只能包含静态内部成员.  解决方案: 原因:在一个报表里面插入两个表格的时候:会出现 ...

  3. 公司里面用的iTextSharp(教程)---生成一个简答的PDF的语法

    本来打算先写一个项目大家一起练习的,但是后来发现不懂一些基本的语法,几乎做了之后也有些不明白,下面我们一起简简单单的看一下哈~~ 语法1:Document document = new Documen ...

  4. maven intall在target文件夹中自动生成的war包部署服务器时缺斤少两

    1.问题描述,本地改动特别大或者升级系统操作,打war包部署服务器上程序时候,页面或者后台总是报错,原因就是比本地少东西. 2.问题排查解决:maven clean然后maven intall在tar ...

  5. 【手把手教你树莓派3 (二)】 启动wifi模块

    概述 树莓派3内置了wifi和蓝牙模块,我们不用像以前的版本那样,再去购买一个外接的模块练到raspberry上. 当我们第一次启动了树莓派的时候,必然使用了网线,但是之后的每一次使用,我们当然更希望 ...

  6. Core Java 2

    p267~p270: 1.一个方法不仅需要告诉编译器将要返回什么值, 还要告诉编译器有可能发生什么错误(以便在错误发生时用妥善的方式处理错误). 2.方法应该在首部声明所有可能抛出的异常. 3.方法抛 ...

  7. Web负载均衡学习笔记之四层和七层负载均衡的区别

    0x00 简介 简单理解四层和七层负载均衡: ① 所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. ...

  8. Python装饰器的高级用法(翻译)

    原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇 ...

  9. Java中字符转int

    Java中字符转int 方法一代码: //直接使用静态方法,不会产生多余的对象,但会抛出异常 //parseInt 方法都有两个参数, 第一个参数就是要转换的对象, 第二个参数是进制基数, 可以是 2 ...

  10. 使用wireshark分析tcp/ip报文之报文头

    以太网报文的结构如下: 其中,以太网的帧头: 14 Bytes:MAC目的地址48bit(6B),MAC源地址48bit(6B),Type域2B,一共14B. IP头部: TCP头部: http:// ...