美文网首页
zookeeper的相关操作

zookeeper的相关操作

作者: mr_xl | 来源:发表于2018-08-27 22:35 被阅读0次

    一.watch事件

    1.为父节点设置watch事件(一次性的,借助工具可以弄成可以多次)
    1.用stat为父节点设置watch事件,创建触发NodeCreated事件
        WatchedEvent state:SyncConnected type:NodeCreated path:/testWatch
    
    2.用ls为父节点设置watch事件,创建子节点触发NodeChildrenChanged事件
        WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/testZnode
    
    3.用ls为父节点设置watch事件,修改子节点不触发事件,要用get为它的子节点设置watch事件才行(把子节点当作父节点来看)
        get /testWatch/sonnode watch
    
    4.用stat为父节点设置watch事件,修改触发NodeDataChanged事件
        WatchedEvent state:SyncConnected type:NodeDataChanged path:/testZnode
    
    5.用stat为父节点设置watch事件,删除触发NodeDeleted事件
        WatchedEvent state:SyncConnected type:NodeDeleted path:/testWatch
    
    6.用ls为父节点设置watch事件,删除子节点触发NodeChildrenChanged事件
        WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/testZnode
    
    2、watch使用场景

    为节点设置watch事件,当主配置(主节点上)更新时,客户端(java程序端)监听到watch事件后,就将配置更新为主节点上一样的配置,这样配置就同步了。

    二.acl访问控制权限(access control permission)

    1.acl构成: [scheme:id:permissions]
    例如:world:anyone:cdrwa
    

    scheme: 权限模式(world/auth/digest/id/super)
    id: 用户(username:password)
    permissions: 权限表达式(crdwa分别代表 创建/读取/删除/写入/管理)

    2.操作
    1.setAcl /testNode world:anyone:crdwa 
        [zk: localhost:2181(CONNECTED) 6] setAcl /testZnode/testAcl world:anyone:crda
    
    2.getAcl /testNode
        [zk: localhost:2181(CONNECTED) 8] getAcl /testZnode/testAcl
        'world,'anyone
        : cdra
    
    3.设置用户权限(用户名:myname 密码:password), 提示无效(需要登陆用户)
        [zk: localhost:2181(CONNECTED) 1] setAcl /testZnode/testAcl2 auth:myname:mypassword:crda
        Acl is not valid : /testZnode/testAcl2
    
    4.登陆一下
        [zk: localhost:2181(CONNECTED) 0] addauth digest myname:mypassword
    
    5.在重新设置,成功了
        [zk: localhost:2181(CONNECTED) 1] setAcl /testZnode/testAcl2 auth:myname:password:crda
        cZxid = 0x1900000fc6
        ctime = Mon May 14 12:43:22 CST 2018
        mZxid = 0x1900000fc6
        mtime = Mon May 14 12:43:22 CST 2018
        pZxid = 0x1900000fc6
        cversion = 0
        dataVersion = 0
        aclVersion = 1
        ephemeralOwner = 0x0
        dataLength = 3
        numChildren = 0
    
    6.再去改节点的内容,提示认证无效,不能修改
        [zk: localhost:2181(CONNECTED) 2] set /testZnode/testAcl2 666
        Authentication is not valid : /testZnode/testAcl2
    
    7.其它模式操作类似()
        world: setAcl /testZnode/testAcl2 world:anyone:crdwa
        auth: setAcl /testZnode/testAcl2 auth:myname:mypassword:crda
        digest: setAcl /testZnode/testAcl2 digest:myname:jd2ErFo0AbcSSSfXUZWfus8DYaM=:crda
        id: setAcl /testZnode/testAcl2 ip:192.168.0.16:crdwa
        super: setAcl /testZnode/testAcl2 world:anyone:crdwa
    
        注意点:
        1.auth使用明文
        2.digest使用密文,但使用addauth登陆还是用明文登陆,会自动转换成密文
        3.使用addauth添加用户后,就不能更改用户了
    
    8.使用super有点特别,需要额外操作
        1.修改zkServer.sh,增加super管理员
        找到这行修改 nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
        在${ZOO_LOG4J_PROP}"后 \前添加 "-Dzookeeper.DigestAuthenticationProvider.superDigest=myname:jd2ErFo0AbcSSSfXUZWfus8DYaM="
        (这个类从源码中找到的,这里的意思是设置super用户名为myname,密码为mypassword)
        2.重启zkServer.sh
    

    3.使用场景
    · 1.使用命名空间的概念(不同权限的节点是不同的空间),使用开发/测试环境分离·
    · 2.使用id模在开发时控制指定ip访问指定节点,防止混乱·

    三.四字命令(4个字符缩写的命令)

    1.先安装nc命令 yum install nc
    2.使用格式 echo [commond] | nc [ip][port]


    1.示例操作
    1.查看zk的状态信息和mode
        [root@server src]# echo stat | nc 192.168.8.84 2181
        Zookeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT
        Clients:
         /192.168.8.84:43980[0](queued=0,recved=1,sent=0)
    
        Latency min/avg/max: 0/0/9
        Received: 157
        Sent: 156
        Connections: 1
        Outstanding: 0
        Zxid: 0x1900000fd6
        Mode: follower
        Node count: 54
    2.查看是否启动
        [root@server src]# echo ruok | nc 192.168.8.84 2181
        imok
    3.列出未经处理的会话和临时节点
        [root@server src]# echo dump | nc 192.168.8.84 2181
        SessionTracker dump:
        org.apache.zookeeper.server.quorum.LearnerSessionTracker@3fe135c2
        ephemeral nodes dump:
        Sessions with Ephemerals (0):
    4.查看配置
        [root@server src]# echo conf | nc 192.168.8.84 2181
        clientPort=2181
        dataDir=/usr/local/src/zookeeper-3.4.5/data/version-2
        dataLogDir=/usr/local/src/zookeeper-3.4.5/data/version-2
        tickTime=2000
        maxClientCnxns=60
        minSessionTimeout=4000
        maxSessionTimeout=40000
        serverId=4
        initLimit=10
        syncLimit=5
        electionAlg=3
        electionPort=3888
        quorumPort=2888
        peerType=0
    5.查看zk的健康状况
        [root@itcast04 src]# echo mntr | nc 192.168.8.84 2181
        zk_version      3.4.5-1392090, built on 09/30/2012 17:52 GMT
        zk_avg_latency  0
        zk_max_latency  9
        zk_min_latency  0
        zk_packets_received     161
        zk_packets_sent 160
        zk_num_alive_connections        1
        zk_outstanding_requests 0
        zk_server_state follower
        zk_znode_count  54
        zk_watch_count  0
        zk_ephemerals_count     0
        zk_approximate_data_size        1458
        zk_open_file_descriptor_count   33
        zk_max_file_descriptor_count    4096
    
    

    四.zookeeper分布式锁思路(结合curator)

    1.配置zk客户端bean(里面包含了策略),配置curatorFactorybean(将spring和curator集成在一起)

    1. 创建一个分布式锁类(里面维护了一个countDownLatch),配置成spring的bean
      3.上面分布式锁类包含init初始化方法,getLock,releaseLock,addWatcherToLock方法
      4.在init中用curator创建zk的命名空间和锁的根节点,并使用addWatcherToLock监听这个根节点
      5.使用getLock方法时用curator在上面创建的根节点下创建临时节点(也就是锁,所以创建的节点名要一样,不同的业务锁以这个名称区分),如果创建不成功(其它的线程在用这把锁),就用countDownLatch.await挂起线程
      6.在addWatcherToLock方法中使用PathChildrenCache监听zk节点上的事件,如果监听到节点删除事件(有线程释放了锁),判断删除的节点名是不是上面getLock时创建的节点名,如果是则调用counDownLatch.countDown()方法将前面挂起的线程放开,
      7.使用releaseLock方法时删除上面的临时节点时先判断这个路径(节点)是否存在,存在就删除这个节点
      8.使用这个锁时,在业务类(Service)里注入这个锁类,在进入业务方法时首先调用getLock锁住这个方法,在执行完方法返回前调用releaseLock释放掉这个锁(注意:一定要记得释放,这个业务方法中间出来异常的地方也要调用releaseLock释放掉这个锁)

    相关文章

      网友评论

          本文标题:zookeeper的相关操作

          本文链接:https://www.haomeiwen.com/subject/wilxwftx.html