• Zookeeper session机制、watcher机制、acl权限控制


    session机制

    zkCli、zkServer之间的连接有3种状态

    • connecting  正在连接。如果zkServer集群了,会连接到集群的某个节点上
    • conneted  已连接
    • closed  关闭连接

    zkCli连接上zkServer后会开启一个session(会话),如何维持session?通过心跳。

    zkCli每隔一定时间(默认2000ms)发送一个心跳包给zkServer,如果zkServer连续多少次没有收到某个zkCli的心跳包(默认10次),就认为该zkCli挂了,自动断开连接、销毁对应的session,销毁session时会销毁本次会话中创建的临时节点(-e)。

    zkCli使用close、quit命令或者Ctrl+C也会断开连接,等10个心跳包时间(默认20s)之后zkServer会自动销毁对应的session。

    所谓心跳包就是ping一下zkServer,告诉zkServer我还活着。

    watcher机制

    可以给节点添加watcher,当节点发生某种变化时,自动触发WatchedEvent事件。

    watcher有2种

    #给/mall添加watcher,只监听/mall本身的数据变化,当/mall本身的数据变化时自动触发WatchedEvent事件。get|stat这2种设置方式等效
    get  -w /mall
    stat -w /mall
    
    #只监听/mall的子节点的增删,当/mall增删子节点(子节点数量变化)时自动触发WatchedEvent事件。只对子节点的增删有效,对孙节点无效 ls
    -w /mall

    以前的写法: get|stat|ls  /mall  watch    官方不推荐

    watcher是观察者模式,观察到某种现象发生时自动做一些事情

    某个zkCli给zkServer的某个节点添加watcher后,第一次触发WatchedEvent后watcher会通知注册监听的zkCli,之后这个watcher就被销毁,不再有效,如果后续还需要监听,需要再次添加watcher。

    哪个zkCli添加的watcher,触发WatchedEvent事件后就只通知哪个zkClient,且watcher是一次性的。

    acl权限控制

    可以给节点设置用户权限,来限制用户对节点可以进行的操作,保证数据安全性。

    查看某个节点的acl权限配置

    getAcl /mall

    默认是:

    'world,'anyone
    : cdrwa

    world下面只有1个用户anyone,表示所有用户,权限是cdrwa。

    acl权限

    • c   create,可创建子节点
    • d  delete,可删除子节点
    • r  read,可读取节点数据
    • w   write,可写入|更新节点数据
    • a   admin,可管理此节点,配置acl权限

    没有某个字母,就说明没有该项权限。

    设置权限

    #统一设置所有用户的权限,world:anyone:权限
    setAcl world:anyone:cdrwa



    #设置某个用户的权限
    #auth:用户名:密码:权限
    auth:chy:abcd:cdrwa

    #digest:用户名:BASE64(SHA1(密码)):权限
    digest:chy:BASE64(SHA1(abcd)):cdrwa
    #auth、digest的区别:
    #auth的密码使用明文,保存在zkServer上时会先自动使用BASE64(SHA1(明文密码))转换为密文;digest的密码使用密文,保存在zkServer上时直接使用密文
    #digest密码要写一长串,麻烦,一般都是使用auth来设置



    #根据ip来设置权限
    ip:192.168.1.2:cdrwa

    设置超级用户

    超级用户具有acl所有权限,可以操作所有的znode。

    现在IDEA中获取密文:

        //用户名:密码,我设置的用户名、密码都是super
        String str = DigestAuthenticationProvider.generateDigest("super:super");
        System.out.println(str);

    在bin/zkServer.sh中配置超级用户:

    vim zkServer.sh

    找到下面的代码

    nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" 
        "-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" 

    在第二行末尾的之前加上

    "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:gG7s8t3oDEtIqF6DM9LlI/R+9Ss="

    红色部分是IDEA输出的密文。

    说明:超级用户可以管理所有的znode,但如果在设置超级用户之前,就已创建了某些znode、并手动给这些znode设置了acl权限,则超级用户对这些之前创建的znode没有管理权限。

    流程示例

    #设置权限。默认是anyone,具有所有权限,包括a,所以可配置acl权限
    setAcl /mall auth:chy:abcd:cdrwa

    #验证用户名、密码,相当于以某个用户身份登录
    addauth digest chy:abcd

    acl使用场景

    分离zk的开发环境跟测试环境,开发只能操作开发环境中的节点,测试只能操作测试环境中的节点。

    生产环境,限制服务节点(通过ip来指定)只能访问、操作相关的节点。

  • 相关阅读:
    转载 jenkins执行selenium 测试 浏览器不显示解决方法
    jmeter用beanshell调用自己写的jar进行MD5加密
    深入理解Spring MVC 思想
    springmvc和json整合配置方法
    getFragmentManager和getChildFragmentManager
    android
    HTTP 请求头与请求体
    Android中ImnageView 中如何让图片拉伸显示?
    ExecutorService 的理解与使用
    SpringMVC源码分析系列
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12732769.html
Copyright © 2020-2023  润新知