zoukankan      html  css  js  c++  java
  • ZooKeeper原理详解及常用操作

    ZooKeeper是什么?

    ZooKeeper是一个开源的分布式应用程序协调系统。简称ZK,ZK是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于它实现数据的发布/订阅、负载均衡、名称服务、分布式协调/通知、集群管理、Master选举、分布式锁盒分布式队列等等功能。它运行在JAVA环境之中,并具有JAVA和C的绑定。

    我的理解:主要用作注册中心,三个角色
    注册中心:保存所有服务的名字,服务提供者的IP列表,服务消费者的IP列表
    服务提供者: 提供跨进程服务
    服务消费者: 寻找到指定命名的服务并消费。
    image
    zookeeper可以充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(IP+端口)去访问具体的服务提供者。如下图所示:
    image
    在zookeeper中,进行服务注册,实际上就是在zookeeper中创建了一个znode节点,该节点存储了该服务的IP、端口、调用方式(协议、序列化方式)等。该节点承担着最重要的职责,它由服务提供者(发布服务时)创建,以供服务消费者获取节点中的信息,从而定位到服务提供者真正网络拓扑位置以及得知如何调用。RPC服务注册、发现过程简述如下:

    1.服务提供者启动时,会将其服务名称,ip地址注册到配置中心。

    2.服务消费者在第一次调用服务时,会通过注册中心找到相应的服务的IP地址列表,并缓存到本地,以供后续使用。当消费者调用服务时,不会再去请求注册中心,而是直接通过负载均衡算法从IP列表中取一个服务提供者的服务器调用服务。

    3.当服务提供者的某台服务器宕机或下线时,相应的ip会从服务提供者IP列表中移除。同时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机。

    4.当某个服务的所有服务器都下线了,那么这个服务也就下线了。

    5.同样,当服务提供者的某台服务器上线时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机。

    6.服务提供方可以根据服务消费者的数量来作为服务下线的依据。

    ZooKeeper的设计目标

    ZooKeeper允许分布式进程通过共享的分层命名空间相互协调,该命名空间的组织方式与标准文件系统类似。名称空间由数据寄存器(在ZooKeeper中,被称为Znodes)组成,这些寄存器类似于文件和目录,与设计用于存储的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟数。ZooKeeper实现非常重视高性能、高可用性、严格有序的访问,ZooKeeper的性能方面意味着它可以在大型分布式系统中使用,可靠性方面使其不会称为单点故障,严格的排序意味着可以在客户端实现复杂的同步原语。

    ZooKeeper集群概念

    集群角色

    •Leader:领导者,通过集群选举产生的主节点,负责集群的读与写工作

    •Follower:追随者,有资格参与集群选举,但未能被成功选举为Leader的备用选举节点,负责集群的读服务

    •Observer:观察者,没有资格参与集群选举,负责集群的读服务,同步Leader状态

    注意:当Leader故障之后ZooKeeper集群会通过Follower选举新的Leader,如果老的Leader故障修复之后,会再次接管集群中的Leader脚本,新的Leader则退回Follower角色。一般集群当中无需设置Observer节点,Follower节点即可。

    图解集群

    image

    集群角色工作原理介绍:

    上图中有5个ZooKeeper节点,其中一个节点为Leader,除leader节点外,其它都是追随者Follower,Client与ZK集群建立TCP长连接,只有追随者Follower节点来与Client建立连接(我们的Client与Follower建立的连接会始终存在,只有Client不再参与集群或者客户端出现故障之后才会断开连接,是一个持久会话,通过此会话,Client会不短向自己所连接的Follower更新自己的状态信息),并处理Client的请求,如果Client为读请求,则会转发到Follower或者本机进行处理,如果为写请求则转发给Leader处理。如果Client与连接的一台ZK集群中的服务器发生数据变更,则ZK集群中的这台服务器会把变更内容同步到ZK集群中的所有ZK服务器。

    假如上图中的Client为Kafka,一共有8台Kafka,Kafka的集群配置信息全部是由ZooKeeper来维护,如果没有ZooKeeper,Kafka的单节点就不知道它们是个集群或者集群中共有那些节点,有了ZooKeeper之后,Kakfa节点会向ZK集群发出请求来询问他们的Kafka一共有几个集群节点,哪个节点还在工作,哪个节点为故障节点等等的集群信息全部都是由ZooKeeper来维护,如果想知道这些信息,Kafka就会去ZK集群节点中去请求一个数据分支,所以有了前面我们介绍ZooKeeper是的一个开源的分布式应用程序协调系统。通过ZooKeeper提供的服务来与Kafka集群的其它节点互知。

    数据模型

    上面讲到Kafka会去ZK集群中请求一个数据分支,ZooKeeper的数据分支一个倒置树状的分支结构,可以说这个数据是放在ZooKeeper内存中的一个树状的文件系统来保存Kafka集群的数据,ZooKeeper提供的这个存储系统非常类似于标准的文件目录,名称是有斜杠"/"来分割的。Kafka集群的每个节点信息都是存放在内存中的该存储系统中,各节点信息由路径标示,例如下图中的/app1,就是我们的Kafka中的一个节点(此节点在ZooKeeper中被官方称为ZNode,即ZooKeeper数据模型中的数据单元,数据模型因为为树状所以被称为Znode Tree,),/app1下的/p_1-3就是存储的这个Kafka节点的状态信息,例如该节点变更了哪些操作,存活状态等等。

    ZNode维护一个stat结构,就是节点下面的/app1/p_1-3,维护该内容的数据数据更改,ACL更改盒时间戳的版本号,以允许缓存验证和协调更新。每次znode的数据更改时,版本号都会增加。例如,每当客户端检索数据时,它也接收数据的版本。

    image

    存储在每个ZNode的数据都是以原子方式读取和写入,读取获取与ZNode关联的所有数据字节,写入替换所有数据。每个节点都有一个访问控制列表(ACL),限制谁可以做什么。ZooKeeper也有短暂节点的概念。只要创建znode的会话处于活动状态,就会存在这些znode。会话结束时,znode将被删除。当您想要实现[tbd]时,短暂节点很有用。ZNode的数据节点分为两类

    持久节点:一直存在,如果想要消失,仅显示删除才消失
    临时节点:会话终止即自动消失
    

    上面我们讲到ZNode维护一个stat结构,维护该内容的数据数据更改,ACL更改盒时间戳的版本号,下面我们就讲下ACL和版本号 版本(version):ZK会为每个ZNode维护一个称之为stat的数据结构,记录当前数据结构的三个数据版本

    version:当前版本
    cversion:当前的znode子节点版本
    aversion:当前的znode的ACL版本
    

    ACL:因为可能会有多个分布式系统使用一个ZooKeeper集群来维护集群的协调服务,那么不同分布式集群信息不能被其它机器所访问,就出现了ZooKeeper使用ACL机制进行权限控制。

    CREATE:创建
    READ:读
    WRITE:写
    DELETE:删
    ADMIN:管理
    

    ZAB协议

    ZooKeeper(ZooKeeper Atomic Broadcast,ZooKeeper原子广播协议)是通过ZAB协议来完成了Client各个节点选举的信息,ZAB协议是整个ZooKeeper的核心,支持崩溃保护机制,用于在Leader崩溃时重新选举出新的Leader,而且还要确保数据的完整性和一至性,此协议不仅能够保证ZooKeeper集群本身的选举,还能管理使用ZooKeeper协调服务的分布式程序的选举工作。

    ZAB协议中存在的三种状态:

    (1)Looking:集群刚启动,开始选举Leader,或者Leader崩溃之后再次选举新的Leader时,正在选举,被称为Looking状态。

    (2)Following:Following就是Follower状态,这个时候集群中已经存在Leader,这些机器属于Follover节点称之为Following状态。

    (3)Leading:Leader就被称为Leading状态。

    ZAB协议中的存在的四个阶段:

    •选举:election

    •发现:discovery

    •同步:sync

    •广播:Broadcast

    部署ZooKeeper

    ZooKeeper下载:

    wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
    

    解压并安装

    tar xf zookeeper-3.4.14.tar.gz -C /application/
    cp /application/zookeeper-3.4.14/conf/zoo_sample.cfg /application/zookeeper-3.4.14/conf/zoo.cfg
    

    添加环境变量

    cat << EOF >> /etc/profile
    
    export ZOOKEEPER_HOME=/application/zookeeper-3.4.14
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    EOF
    source /etc/profile
    

    修改ZooKeeper配置

    cat /application/zookeeper-3.4.14/conf/zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/application/zookeeper-3.4.14/datadata
    LogDir=/application/zookeeper-3.4.14/logs
    clientPort=2181
    maxClientCnxns=60
    autopurge.snapRetainCount=3
    autopurge.purgeInterval=1
    server.1=localhost:2888:3888
    

    创建数据存储目录及日志目录

    mkdir /application/zookeeper-3.4.14/{data,logs}
    

    ZooKeeper配置详解

    tickTime=2000
    #ZooKeeper服务器之间或客户单与服务器之间维持心跳的时间间隔,单位是毫秒,默认为2000。
    initLimit=10
    #zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
    #当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20秒。
    syncLimit=5
    #标识ZooKeeper的leader和follower之间同步消息,请求和应答时间长度,最长不超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
    dataDir=/application/zookeeper-3.4.14/data
    #存储内存数据库快照的位置;ZooKeeper保存Client的数据都是在内存中的,如果ZooKeeper节点故障或者服务停止,那么ZooKeeper就会将数据快照到该目录当中。
    clientPort=2181
    #ZooKeeper客户端连接ZooKeeper服务器的端口,监听端口
    maxClientCnxns=60
    #ZooKeeper可接受客户端连接的最大数量,默认为60
    dataLogDir=/application/zookeeper-3.4.14/logs
    #如果没提供的话使用的则是dataDir。zookeeper的持久化都存储在这两个目录里。dataLogDir里是放到的顺序日志(WAL)。而dataDir里放的是内存数据结构的snapshot,便于快速恢复。为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性
    autopurge.snapRetainCount=3
    #ZooKeeper要保留dataDir中快照的数量
    autopurge.purgeInterval=1
    #ZooKeeper清楚任务间隔(以小时为单位),设置为0表示禁用自动清除功能
    server.1=localhost:2888:3888
    #指定ZooKeeper集群主机地址及通信端口
    #1 为集群主机的数字标识,一般从1开始,三台ZooKeeper集群一般都为123
    #localhost 为集群主机的IP地址或者可解析主机名
    #2888 端口用来集群成员的信息交换端口,用于ZooKeeper集群节点与leader进行信息同步
    #3888 端口是在leader挂掉时或者刚启动ZK集群时专门用来进行选举leader所用的端口
    

    启动ZooKeeper

    /application/zookeeper-3.4.14/bin/zkServer.sh start
    ZooKeeper JMX enabled by defaultUsing config: /application/zookeeper-3.4.14/bin/../conf/zoo.cfgStarting zookeeper ... STARTED
    查看ZK状体
    /application/zookeeper-3.4.14/bin/zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /application/zookeeper-3.4.14/bin/../conf/zoo.cfg
    Mode: standalone
    
    ss -anplt | grep 2181
    LISTEN     0      50          :::2181                    :::*                   users:(("java",pid=17168,fd=27))
    

    ZooKeeper执行程序简介

    ls /application/zookeeper-3.4.14/bin/ -l
    total 44
    -rwxr-xr-x 1 2002 2002  232 Mar  7 00:50 README.txt
    -rwxr-xr-x 1 2002 2002 1937 Mar  7 00:50 zkCleanup.sh  
    -rwxr-xr-x 1 2002 2002 1056 Mar  7 00:50 zkCli.cmd
    -rwxr-xr-x 1 2002 2002 1534 Mar  7 00:50 zkCli.sh           #ZK客户端连接ZK的脚本程序
    -rwxr-xr-x 1 2002 2002 1759 Mar  7 00:50 zkEnv.cmd
    -rwxr-xr-x 1 2002 2002 2919 Mar  7 00:50 zkEnv.sh           #ZK变量脚本程序
    -rwxr-xr-x 1 2002 2002 1089 Mar  7 00:50 zkServer.cmd
    -rwxr-xr-x 1 2002 2002 6773 Mar  7 00:50 zkServer.sh        #ZK启动脚本程序
    -rwxr-xr-x 1 2002 2002  996 Mar  7 00:50 zkTxnLogToolkit.cmd
    -rwxr-xr-x 1 2002 2002 1385 Mar  7 00:50 zkTxnLogToolkit.sh
    

    zkServer.sh启动文件

    zkServer.sh通常用来启动、终止、重启ZK服务器,用法如下:

    /application/zookeeper-3.4.14/bin/zkServer.sh
    ZooKeeper JMX enabled by default
    Using config: /application/zookeeper-3.4.14/bin/../conf/zoo.cfgUsage: /application/zookeeper-3.4.14/bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
    
    #关闭ZK服务
    /application/zookeeper-3.4.14/bin/zkServer.sh stop
    
    #启动ZK服务
    /application/zookeeper-3.4.14/bin/zkServer.sh start
    
    #启动ZK服务并打印启动信息到标准输出,方便于排错
    /application/zookeeper-3.4.14/bin/zkServer.sh start-foreground
    
    #重启ZK服务
    /application/zookeeper-3.4.14/bin/zkServer.sh restart
    
    #查看ZK服务状态
    /application/zookeeper-3.4.14/bin/zkServer.sh status
    

    zkCli.sh客户端连接

    zkCli.sh是用来连接zk服务的脚本程序文件,使用该脚本程序连接到ZK后,可管理ZK服务,用法如下:

    /application/zookeeper-3.4.14/bin/zkCli.sh -server localhost:2181
    #连接ZK服务
    #-server:指定ZK服务
    #localhost:指定要连接的主机
    #2181:指定连接端口,默认不加参数会连接到本机的2181端口
    
    #使用?号或者help可以获取帮助命令
    [zk: localhost:2181(CONNECTED) 0] ?
    ZooKeeper -server host:port cmd args
            stat path [watch]                       #获取节点数据内容和属性信息
            set path data [version]                 #更新节点数据内容
            ls path [watch]                         #列出节点
            delquota [-n|-b] path
            ls2 path [watch]                        #列出节点数据内容和属性信息
            setAcl path acl                         #设置ACL访问控制权限
            setquota -n|-b val path
            history                                 #获取历史命令记录
            redo cmdno
            printwatches on|off
            delete path [version]                   #删除节点,version表示数据版本
            sync path                               #同步节点
            listquota path
            rmr path                                #删除节点,忽略节点下的子节点
            get path [watch]                        #读取数据内容和属性信息
            create [-s] [-e] path data acl          #创建节点命令
            addauth scheme auth
            quit                                    #退出当前ZK连接
            getAcl path                             #获取节点ACL策略信息
            close                                   #断开当前ZK连接,但不退出窗口
            connect host:port                       #断开当前ZK连接后,可使用connect加参数来连接指定ZK节点
    

    create [-s] [-e] path data acl 选项介绍: -s用来指定节点特性为顺序节点;顺序节点:是创建时唯一且被独占的递增性整数作为其节点号码,此号码会被叠加在路径之后。 -e用来指定特性节点为临时节点,临时节点不允许有子目录;关于持久节点和临时节点请看上篇文章 若不指定,则表示持久节点 acl用来做权限控制

    创建ZooKeeper持久节点

    #创建持久节点permanent,关联字符串permanent
    [zk: localhost:2181(CONNECTED) 0] create /permanent "permanent"
    Created /permanent
    
    #在持久节点permanent下创建子目录zk-node1和zk-nod2
    [zk: localhost:2181(CONNECTED) 1] create /permanent/zk_node1 "zk_node1"
    Created /permanent/zk_node1
    [zk: localhost:2181(CONNECTED) 2] create /permanent/zk_node2 "zk_node2"
    Created /permanent/zk_node2
    
    #查看创建的zk数据文件
    [zk: localhost:2181(CONNECTED) 3] ls /
    [zookeeper, permanent]
    [zk: localhost:2181(CONNECTED) 4] ls /permanent
    [zk_node1, zk_node2]
    

    创建ZooKeeper顺序节点

    #创建顺序节点order,关联字符串order,创建好之后并不会以我们创建的order命名,zk会自动在后面加上一排递增数字来显示此文件夹,递增数据不会从重复
    [zk: localhost:2181(CONNECTED) 5] create -s /order "order"
    Created /order0000000004
    [zk: localhost:2181(CONNECTED) 6] ls /
    [zookeeper, permanent, order0000000004]
    
    #我们再次创建一个顺序节点,会发现后面的增至数字默认加1,并没有重复
    [zk: localhost:2181(CONNECTED) 8] create -s /tow_order "two_order"
    Created /tow_order0000000005
    [zk: localhost:2181(CONNECTED) 9] ls /
    [tow_order0000000005, zookeeper, permanent, order0000000004]
    
    #创建顺序节点order的子节点
    [zk: localhost:2181(CONNECTED) 10] create -s /order0000000004/order_node1 "order_node1"
    Created /order0000000004/order_node10000000000
    

    创建ZooKeeper临时节点

    #创建临时节点temp
    [zk: localhost:2181(CONNECTED) 15] create -e /temp "temp"
    Created /temp
    [zk: localhost:2181(CONNECTED) 16] ls /             #查看已经创建完成的临时节点temp
    [tow_order0000000005, temp, zookeeper, permanent, order0000000004]
    
    #在临时节点temp中创建子目录,
    [zk: localhost:2181(CONNECTED) 17] create -e /temp/two_temp "tow_temp"
    Ephemerals cannot have children: /temp/two_temp     #你会发现创建子目录,ZK给你报错误说”临时节点不允许子目录存在“,我们上面也说过了,临时节点不允许存在子目录
    [zk: localhost:2181(CONNECTED) 18] ls /temp         #查看临时节点/temp下,并没有我们所创建的two_temp子目录
    []
    
    #测试临时节点
    #创建的临时节点如果当前客户端断开了连接后临时节点会自动消失,而持久节点和顺序节点则需要使用删除命令来消失
    #退出当前ZK连接,再次连接到ZK
    [zk: localhost:2181(CONNECTED) 19] quit             #退出当前ZK连接
    /application/zookeeper-3.4.14/bin/zkCli.sh -server localhost:2181       #再次连接到ZK
    
    #查看临时目录是否存在
    [zk: localhost:2181(CONNECTED) 0] ls /
    [tow_order0000000005, zookeeper, permanent, order0000000004]            #当我们结束当前客户端连接后,ZK的临时节点temp也会随之消失
    

    读取节点命令 读取节点命令有以下四个

    ls path [watch]
    ls2 path [watch]
    get path [watch]
    stat path [watch]
    

    ls path [watch]

    ls只显示列出目录下的数据节点
    [zk: localhost:2181(CONNECTED) 2] ls /          #列出当前/下的数据节点
    [tow_order0000000005, zookeeper, permanent, order0000000004]
    [zk: localhost:2181(CONNECTED) 3] ls /permanent #列出permanent下的数据节点
    [zk_node1, zk_node2]
    [zk: localhost:2181(CONNECTED) 4] ls /order0000000004  #列出order0000000004下的数据节点
    [order_node10000000000]
    

    ls2 path [watch]

    ls2列出节点数据内容和属性信息
    [zk: localhost:2181(CONNECTED) 7] ls2 /permanent
    [zk_node1, zk_node2]                            #ls2命令同样可以列出permanent下的子目录
    cZxid = 0x2e                                    #创建permanent节点时生成的事物ID
    ctime = Sat Jun 22 21:00:00 CST 2019            #创建permanent节点时的时区及时间
    mZxid = 0x2e                                    #修改permanent节点后改变的事物ID
    mtime = Sat Jun 22 21:00:00 CST 2019            #修改permanent节点后的时区及时间
    pZxid = 0x30
    cversion = 2                                    #permanent的znode子节点版本
    dataVersion = 0                                 #permanent数据节点版本信息
    aclVersion = 0                                  #permanent的znode的ACL版本
    ephemeralOwner = 0x0
    dataLength = 9                                  #permanent数据节点的关联字符长度
    numChildren = 2                                 #permanent数据节点下有两个子节点
    
    #列出/下的数据内容及属性信息
    [zk: localhost:2181(CONNECTED) 11] ls2 /
    [tow_order0000000005, zookeeper, permanent, order0000000004]
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x37
    cversion = 10
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 4
    

    get path [watch]

    get读取数据内容和属性信息
    可以看到get不像ls2一样更够列出/下的文件名称,只显示当前节点的属性信息
    [zk: localhost:2181(CONNECTED) 12] get /permanent
    permanent
    cZxid = 0x2e
    ctime = Sat Jun 22 21:00:00 CST 2019
    mZxid = 0x2e
    mtime = Sat Jun 22 21:00:00 CST 2019
    pZxid = 0x30
    cversion = 2
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 9
    numChildren = 2
    
    获取/的数据内容和属性信息
    [zk: localhost:2181(CONNECTED) 13] get /
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x37
    cversion = 10
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 4
    

    stat path [watch]

    stat命令和get命令基本一致
    [zk: localhost:2181(CONNECTED) 14] stat /permanent
    cZxid = 0x2e
    ctime = Sat Jun 22 21:00:00 CST 2019
    mZxid = 0x2e
    mtime = Sat Jun 22 21:00:00 CST 2019
    pZxid = 0x30
    cversion = 2
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 9
    numChildren = 2
    
    [zk: localhost:2181(CONNECTED) 15] stat /
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x37
    cversion = 10
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 4
    

    set path data [version]
    set命令用来更新节点数据内容 先使用ls2获取当前节点的属性信息

    [zk: localhost:2181(CONNECTED) 16] ls /permanent        #当前permanent下有两个数据文件
    [zk_node1, zk_node2]
    [zk: localhost:2181(CONNECTED) 17] ls2 /permanent       #列出permanent的属性信息,等下更新完成之后permanent的属性信息会改变
    [zk_node1, zk_node2]
    cZxid = 0x2e
    ctime = Sat Jun 22 21:00:00 CST 2019
    mZxid = 0x2e
    mtime = Sat Jun 22 21:00:00 CST 2019
    pZxid = 0x30
    cversion = 2                                            
    dataVersion = 0                                     
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 9
    numChildren = 2
    

    更新数据节点

    [zk: localhost:2181(CONNECTED) 18] create /permanent/zk_node3 "zk_node3"        #在permanent下再创建一个数据节点zk_node3
    Created /permanent/zk_node3
    
    [zk: localhost:2181(CONNECTED) 21] set /permanent "permanent_set"               #更新permanent的关联符号为"permanent_set"
    cZxid = 0x2e
    ctime = Sat Jun 22 21:00:00 CST 2019
    mZxid = 0x3a                                                                    #可以看到事物ID比着创建时的事物ID已经发生改变
    mtime = Sat Jun 22 21:47:29 CST 2019                                            #时间也已经发生改变
    pZxid = 0x39
    cversion = 3                                                                   #permanent的znode子节点版本也已经发生改变
    dataVersion = 1                                                                #permanent的数据版本也已经发生改变
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 13                                                                #permanent关联字符串长也已经发生改变
    numChildren = 3                                                                #permanent下的子文件也已经发生改变
    

    delete path [version] 持久节点以及顺序节点只有使用删除命令才能够消失 使用delete命令来删除持久节点permanent 注意:如果数据节点下有子目录的时候必须先删除子目录,然后在删除父目录,否则使用delete是不可取的 例子:

    [zk: localhost:2181(CONNECTED) 23] delete /permanent
    Node not empty: /permanent              #ZK会告诉你节点非空,所以必须要先删除permanent下的子节点才能够删除permanent节点
    
    [zk: localhost:2181(CONNECTED) 24] delete /permanent/zk_node1
    [zk: localhost:2181(CONNECTED) 25] delete /permanent/zk_node2
    [zk: localhost:2181(CONNECTED) 26] delete /permanent/zk_node3
    [zk: localhost:2181(CONNECTED) 27] delete /permanent        #当删除了permanent后,再次删除permanet则正常
    [zk: localhost:2181(CONNECTED) 28] ls /                     #可以看到/下已经没有了permanent数据节点
    [tow_order0000000005, zookeeper, order0000000004]
    

    rmr path rmr也同时删除节点命令,但它和delete的区别在于,它会忽略节点下的子目录,直接递归删除数据节点下的所有目录及数据节点

    [zk: localhost:2181(CONNECTED) 31] ls /
    [tow_order0000000005, zookeeper, order0000000004]
    
    #删除顺序节点order0000000004,可以看到该数据节点下存在order_node10000000000子目录
    [zk: localhost:2181(CONNECTED) 33] ls /order0000000004
    [order_node10000000000]
    
    [zk: localhost:2181(CONNECTED) 34] rmr /order0000000004     #使用rmr命令可以直接递归删除该数据节点
    [zk: localhost:2181(CONNECTED) 35] ls /
    [tow_order0000000005, zookeeper]
    

    监控ZK的四字命令

    ZooKeeper支持某些特定的四字命令与其交互,他们大多数是查询命令,用来获取ZK服务当前状态及相关信息。用户在客户端可通过telnet或nc向ZooKeeper提交相应的命令 可用的四字命令如下:

    ruok:测试是否启动了ZooKeeper
    stat:查询当前连接的端口及IP和其它信息
    srvr:显示当前ZK服务的信息
    conf:输出ZK相关的服务配置相信信息
    cons:列出所有连接到ZK服务器的客户端的完全连接/会话详细信息
    wchs:列出watch的详细信息
    envi:输出关于ZK服务的环境详细信息,相当于linux系统中的env
    dump:列出未经处理的回话和临时节点
    reqs:列出未处理的请求
    mntr:列出一些监控信息
    

    rook 测试是否启动了ZooKeeper

    telnet示范
    #使用telnet来连接本地的ZK端口
    telnet localhost 2181
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    ruok                                    #连接成功后输入ruok,可得到ZK服务的回应信息
    imokConnection closed by foreign host.  #它回应给你imokConnecntion,我已连接
    
    nc示范
    #使用nc来连接到指定的ZK服务器
    nc localhost 2181       
    ruok            #输入ruok
    imok            #ZK服务器回应imok
    Ncat: Broken pipe.
    

    stat 查询当前连接的端口及IP和其它信息

    nc localhost 2181
    stat                #输入stat
    Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT       #当前ZK版本和构建时间,我那了我们线上在用的一台设备,所以跟你们使用的版本不一致
    Clients:            #以下是已连接的客户端的节点信息
     /10.150.50.38:59627[1](queued=0,recved=206423,sent=206423)
     /10.150.50.38:59635[1](queued=0,recved=206426,sent=206426)
     /10.150.50.40:22297[1](queued=0,recved=1348114,sent=1348114)
     /0:0:0:0:0:0:0:1:51498[0](queued=0,recved=1,sent=0)
     /10.150.50.38:59631[1](queued=0,recved=206435,sent=206435)
    Latency min/avg/max: 0/0/10     #延迟分别是最小值、平均值、最大值
    Received: 1967678               #收到的请求数
    Sent: 1967679                   #返回发出的请求数
    Connections: 5                  #已连接当前ZK的客户端主机数量
    Outstanding: 0
    Zxid: 0x1e000002a7              #事物ID
    Mode: follower                  #当前节点的集群状态为follower
    Node count: 365                 
    Ncat: Broken pipe.
    

    srvr 显示当前ZK服务的信息,跟stat很相似,但是它只显示ZK的自身信息

    nc localhost 2181
    srvr                            #输入srvr
    Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
    Latency min/avg/max: 0/0/10
    Received: 1967953
    Sent: 1967954
    Connections: 5
    Outstanding: 0
    Zxid: 0x1e000002a7
    Mode: follower
    Node count: 365
    Ncat: Broken pipe.
    

    conf 输出ZK相关的服务配置相信信息

    nc localhost 2181
    conf                            #输入conf,可以显示当前ZK的配置信息
    clientPort=2181
    dataDir=/zk_data/zk1/version-2
    dataLogDir=/zk_data/zk1/version-2
    tickTime=2000
    maxClientCnxns=60
    minSessionTimeout=4000
    maxSessionTimeout=40000
    serverId=1
    initLimit=10
    syncLimit=5
    electionAlg=3
    electionPort=4181
    quorumPort=3181
    peerType=0
    Ncat: Broken pipe.
    

    cons 列出所有连接到ZK服务器的客户端的完全连接/会话详细信息

    nc localhost 2181
    cons                        #输入cons,可以显示连接到当前ZK服务器的客户端的所有信息,下面的一个/0:0:0:0:0:0:0:1:51514[0](queued=0,recved=1,sent=0),代表本机也算作是一个连接
     /10.150.50.38:59627[1](queued=0,recved=206476,sent=206476,sid=0x16adec1f078000d,lop=PING,est=1559147830451,to=30000,lcxid=0x0,lzxid=0xffffffffffffffff,lresp=1561214262376,llat=0,minlat=0,avglat=0,maxlat=5)
     /10.150.50.38:59635[1](queued=0,recved=206479,sent=206479,sid=0x16adec1f078000f,lop=PING,est=1559147830758,to=30000,lcxid=0x0,lzxid=0xffffffffffffffff,lresp=1561214264713,llat=0,minlat=0,avglat=0,maxlat=4)
     /0:0:0:0:0:0:0:1:51514[0](queued=0,recved=1,sent=0)
     /10.150.50.40:22297[1](queued=0,recved=1348381,sent=1348381,sid=0x16adec1f0780000,lop=PING,est=1558515870093,to=6000,lcxid=0x110,lzxid=0xffffffffffffffff,lresp=1561214271686,llat=0,minlat=0,avglat=0,maxlat=10)
     /10.150.50.38:59631[1](queued=0,recved=206488,sent=206488,sid=0x16adec1f078000e,lop=PING,est=1559147830593,to=30000,lcxid=0x0,lzxid=0xffffffffffffffff,lresp=1561214263232,llat=0,minlat=0,avglat=0,maxlat=5)
    Ncat: Broken pipe.
    

    wchs 列出watch的详细信息

    nc localhost 2181
    wchs                            #输入wchs
    1 connections watching 2 paths  #一个连接,两个数据节点
    Total watches:2
    Ncat: Broken pipe.
    

    envi 列出当前jdk,以及zk所用到的jdk配置信息

    nc localhost 2181
    envi                        #输入env,列出当前jdk,以及zk所用到的jdk配置信息
    Environment:
    zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
    host.name=kafka01
    java.version=1.8.0_162
    java.vendor=Oracle Corporation
    java.home=/usr/local/jdk1.8.0_162/jre
    java.class.path=/usr/local/zookeeper/bin/../build/classes:/usr/local/zookeeper/bin/../build/lib/*.jar:/usr/local/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper/bin/../lib/netty-3.10.5.Final.jar:/usr/local/zookeeper/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper/bin/../zookeeper-3.4.10.jar:/usr/local/zookeeper/bin/../src/java/lib/*.jar:/usr/local/zookeeper/bin/../conf:::/usr/local/jdk1.8.0_162/lib/dt.jar:/usr/local/jdk1.8.0_162/lib/tools.jar
    java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
    java.io.tmpdir=/tmp
    java.compiler=<NA>
    os.name=Linux
    os.arch=amd64
    os.version=3.10.0-514.21.1.el7.x86_64
    user.name=root
    user.home=/root
    user.dir=/root
    Ncat: Broken pipe.
    

    dump 列出未经处理的回话和临时节点

    nc localhost 2181
    dump                        #输入dump,列出未处理的回话和临时节点
    SessionTracker dump:
    org.apache.zookeeper.server.quorum.LearnerSessionTracker@7241fb18
    ephemeral nodes dump:
    Sessions with Ephemerals (3):
    0x16adec1f0780000:
            /brokers/ids/2
    0x36adec1f32e0003:
            /brokers/ids/1
    0x26adec1f3160000:
            /controller
            /brokers/ids/0
    Ncat: Broken pipe.
    

    reqs 列出未处理的请求

    nc localhost 2181
    reqs                    #输入reqs,当前得到的为空值,则代表没有未处理的请求
    Ncat: Broken pipe.
    

    mntr 列出一些监控信息

    nc localhost 2181
    mntr                    #输入mntr,得到一些监控信息
    zk_version      3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT      #ZK版本及构建时间
    zk_avg_latency  0       #ZK平均延时
    zk_max_latency  10      #ZK最大延时
    zk_min_latency  0       #ZK最小延时
    zk_packets_received     1968459     #接收到客户端请求的包数量
    zk_packets_sent 1968460             #发送给客户端的包数量,主要是响应和通知
    zk_num_alive_connections        5   #检测存活的节点数量
    zk_outstanding_requests 0           #排队请求的数量,当ZooKeeper超过了它的处理能力时,这个值会增大,建议设置报警阀值为10
    zk_server_state follower            #当前ZK是什么状态节点
    zk_znode_count  365                 #Znodes的数量
    zk_watch_count  3                   #watches的数量
    zk_ephemerals_count     4           #临时节点的数量
    zk_approximate_data_size        23709   #数据大小
    zk_open_file_descriptor_count   37      #打开文件描述符数量
    zk_max_file_descriptor_count    65536   #最大文件描述符数量
    Ncat: Broken pipe.
    建时间
    zk_avg_latency  0       #ZK平均延时
    zk_max_latency  10      #ZK最大延时
    zk_min_latency  0       #ZK最小延时
    zk_packets_received     1968459     #接收到客户端请求的包数量
    zk_packets_sent 1968460             #发送给客户端的包数量,主要是响应和通知
    zk_num_alive_connections        5   #检测存活的节点数量
    zk_outstanding_requests 0           #排队请求的数量,当ZooKeeper超过了它的处理能力时,这个值会增大,建议设置报警阀值为10
    zk_server_state follower            #当前ZK是什么状态节点
    zk_znode_count  365                 #Znodes的数量
    zk_watch_count  3                   #watches的数量
    zk_ephemerals_count     4           #临时节点的数量
    zk_approximate_data_size        23709   #数据大小
    zk_open_file_descriptor_count   37      #打开文件描述符数量
    zk_max_file_descriptor_count    65536   #最大文件描述符数量
    Ncat: Broken pipe.
    

    参考博客:
    https://blog.csdn.net/qq_23435961/article/details/106907844
    https://blog.csdn.net/lingbo229/article/details/81052078
    https://www.cnblogs.com/raphael5200/p/5285583.html

  • 相关阅读:
    AUTOCAD二次开发-----删除一个图层里面的所有对象
    AutoCAD .NET: 遍历模型空间
    c# 将dwg文件转化为pdf
    C# 读取CAD文件缩略图(DWG文件)
    C#.Net实现AutoCAD块属性提取
    用.NET从外部dwg文件导入块
    AutoCAD二次开发(.Net)之获取LSP变量的值
    AutoCAD二次开发(.Net)之创建图层Layer
    Ceilometer和Gnocchi的监控架构解析
    《Python核心编程》笔记
  • 原文地址:https://www.cnblogs.com/kaka-qiqi/p/14925417.html
Copyright © 2011-2022 走看看