• zookeeper简介及基操


    zk的安装:
        1. 下载zk.tar.gz安装包,并解压至/usr/local/devInstall
        2. 在zk的目录下新建文件夹data
        3. 复制zk/config目录下的zoo_sample.cfg,重命名为zoo.cfg,vim zoo.cfg,将其中的dataDir=步骤2中data的目录;dataDir指定的路径用于存储zk中数据的内存快照,及事务文件。
    启动zk:
        1. 进入zk的bin目录
        2. 启动zk:./zkServer.sh start
        3. 查看状态:./zkServer.sh status
        4. 停止zk: ./zkServer.sh stop
    启动zk客户端:
        1. 进入zk的bin目录
        2. 启动:./zkCli.sh
        3. 停止:quit
    zk常用的shell命令:
        -新增节点:
            create [-s] [-e] path data  #其中-s为有序节点,-e为临时节点;默认创建的节点都是持久化节点。
                eg:创建持久化节点并写入数据:
                    [zk: localhost:2181(CONNECTED) 9] create /hadoop "123456"
                    Created /hadoop
                创建持久化有序节点,此时创建的节点名为指定节点名+自增序号:
                    [zk: localhost:2181(CONNECTED) 10] create -s /a "aaa"
                    Created /a0000000007
                创建临时节点,临时节点会在会话过期后被删除:
                    [zk: localhost:2181(CONNECTED) 11] create -e /tmp "tempo"
                    Created /tmp
                创建临时有序节点,也会在会话过期后被删除:
                    [zk: localhost:2181(CONNECTED) 12] create -s -e /aa "aaa"
                    Created /aa0000000009
        -更新节点:每次更新后dataVersion都会自增1
            -更新节点的命令是set,可以直接进行修改,如下:
                [zk: localhost:2181(CONNECTED) 14] set /hadoop "12345"
                cZxid = 0x23
                ctime = Wed Jul 15 13:28:02 CST 2020
                mZxid = 0x27
                mtime = Wed Jul 15 13:35:06 CST 2020
                pZxid = 0x23
                cversion = 0
                dataVersion = 1
                aclVersion = 0
                ephemeralOwner = 0x0
                dataLength = 5
                numChildren = 0
            -也可以基于版本号进行修改,此时类似于乐观锁机制,当你传入的数据版本号(dataVersion)和当前节点数据版本号不符合时,zk会拒绝本次修改:
                [zk: localhost:2181(CONNECTED) 16] set /hadoop "12343" 1
                version No is not valid : /hadoop
        -删除节点:
            删除节点的语法如下:
                delete path [version]
            和更新节点数据一样,也可以传入版本号。当传入的版本号和此节点的数据版本号不一致时,zk也不会执行删除操作。
                要向删除某个节点及其所有后代节点,可以使用递归删除,命令为rmr path;
        -查看节点:
            查看节点的语法如下:
                get path
        -查看节点状态:
            可以使用stat命令查看节点状态,它的返回值和get命令类似,但不会返回节点数据:
            stat path
        -查看节点列表:
            查看节点列表有ls path 和 ls2 path两个命令,后者是前者的增强,不仅可以查看指定路径下所有节点,还可以查看当前节点的信息。
        -监听器get path [watch]
            使用get path [watch] 注册的监听器能够在节点内容发生改变的时候,向客户端发出通知。需要注意的是,zk的触发器是一次性的(one-time-trigger),即触发一次后就会立即失效。
            eg:
                get /hadoop watch
                set /hadoop watch 45678
                [zk: localhost:2181(CONNECTED) 1] set /hadoop "45678"
                WATCHER::
                WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop
        -监听器stat path [watch]
            使用stat path [watch] 注册的监听器能够在节点状态发生改变的时候,向客户端发出通知。
                [zk: localhost:2181(CONNECTED) 2] stat /hadoop watch
                [zk: localhost:2181(CONNECTED) 3] set /hadoop 12344
                WATCHER::
                WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop
        -监听器lsls2 path [watch]
            使用ls path [watch] 或 ls2 path [watch] 注册的监听器能够监听该节点下所有子节点的增加和删除操作。注意:只能捕获增加和删除,节点数据的修改不能捕获。
    
    zk事件监听机制
    watcher架构:
        watcher实现由三个部分组成:
            -zk服务端
            -zk客户端
            -客户端ZKWatchManager对象
        客户端首先将watcher注册到服务端,同时将watcher对象保存到客户端的watcher管理器中。当zk服务器端监听的数据状态发生变化时,服务端会主动通知客户端,接着客户端的water管理器会触发相关watcher来回调相应处理逻辑,从而完成整体的数据发布/订阅流程。
    watcher特性:
        -一次性:watcher是一次性的,一旦被触发就会被移除,再次使用需要重新注册
        -客户端顺序回调:watcher回调是顺序串行化执行的,只有回调后客户端才能看到最新的数据状态.一个watcher回调逻辑不应该太多,以免影响别的watcher执行。
        -轻量级:watchEvent是最小的通信单元,结构上只包含通知状态,事件类型和节点路径,并不会告诉数据节点变化前后的具体内容。
        -时效性:watcher只有在当前session彻底失效时才会无效,若在session有效期内快速重连成功,则watcher依然存在,仍可接收通知。
    
    watcher接口设计:
        watcher是一个接口,任何实现了watcher接口的类就是一个新的Watcher。Watcher内部包含了两个枚举类:KeeperState、EventType
        Watcher通知状态(KeeperState)
            keeperState是客户端与服务端连接状态发生变化时对应的通知类型。其枚举属性:
                -SynConnected:客户端与服务器正常连接
                -Disconnected:客户端与服务器断开连接
                -Expired:会话Session失效时
                -AuthFailed:身份认证失败时
        Watcher事件类型(EventType)
            EventType是数据节点(znode)发生变化时对应的通知类型。EventType变化时KeeperState永远处于SynConnected通知状态下;当KeeperState发生变化时,EventType永远为None.其枚举属性如下:
                -None:无
                -NodeCreated:Watcher监听的数据节点被创建时
                -NodeDeleted:watcher监听的数据节点被删除时
                -NodeDataChanged:watcher监听的数据节点内容发生变更时(无论内容数据是否变化)
                -NodeChildrenChanged:watcher监听的数据节点的子节点列表发生变更时
                注意:客户端收到的相关事件通知中只包含状态及类型等信息,不包含节点变化前后的具体内容,变化前的数据需要业务自身存储,变化后的数据需要调用get方法重新获取。
        捕获相应的事件:
            zk中采用zk.getChildren(path,watch),zk.exists(path,watch),zk.getData(path,watcher,stat)这样的方式为某个znode注册监听。
            zk.exists("/node",watch):可监控有Created,Changed,Deleted
            zk.getData("/node",watch):可监控有Changed,Deleted
            zk.getChildren("/node",watch):可监控的有ChildrenChanged(子节点增加,删除;但子节点数据变动不会被监听),Deleted
    
        zk实现分布式锁(排他锁):
            设计思路:
            1. 每个客户端往/Locks/Lock_,创建成功后/Locks下面会有每个客户端对应的节点,如/Locks/Lock_0000001;
            2. 客户端取得/Locks下的子节点,并进行排序,判断排在最前面的是否为自己,如果自己的锁节点在第一位,代表获取锁成功;
            3. 如果自己的锁节点不在第一位,则监听自己前一位的锁节点.例如:自己锁节点Lock_000002,那么则监听Lock_000001;
            4. 当前一位锁节点(Lock_000001)对应的client执行完成,释放了锁,将会触发监听客户端(Lock_000002)的逻辑;
            5. 监听客户端重新执行第2步逻辑,判断自己是否获得了锁。
    

      

  • 相关阅读:
    PAT 甲级 1057 Stack(树状数组解法)
    LeetCode 815 公交路线
    201771010123汪慧和《面向对象程序设计JAVA》第六周实验总结
    汪慧和201771010123《面向对象程序设计JAVA》第四周实验总结
    汪慧和201771010123《面向对象程序设计(Java)》第三周学习总结
    201771010123汪慧和《面向对象程序设计Java》第二周学习总结
    汪慧和201771010123
    201771010119穷吉1
    学习进度条201771010119穷吉
    穷吉201771010119*
  • 原文地址:https://www.cnblogs.com/kongieg/p/13367292.html
Copyright © 2020-2023  润新知