zooKeeper 名词介绍

一、zookeeper简单用法

1.1连接到zooKeeper Server

D:\Zookeeper-3.4.5\bin>zkCli.cmd -server 127.0.0.1:2185
Connecting to 127.0.0.1:2185
2015-12-07 17:01:06,184 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GMT
2015-12-07 17:01:06,184 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=DESKTOP-QTHKDO5
2015-12-07 17:01:06,184 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_05
2015-12-07 17:01:06,184 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2015-12-07 17:01:06,199 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=D:\Program Files\Java\jre8
2015-12-07 17:01:06,199 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=D:\Zookeeper-3.4.5\bin\..\build\classes;D:\Zookeeper-3.4.5\bin\..\build\lib\*;D:\Zookeeper-3.4.5\bin\..\zookeeper-3.4.5.jar;D:\Zookeeper-3.4.5\bin\..\lib\jline-0.9.94.jar;D:\Zookeeper-3.4.5\bin\..\lib\log4j-1.2.15.jar;D:\Zookeeper-3.4.5\bin\..\lib\netty-3.2.2.Final.jar;D:\Zookeeper-3.4.5\bin\..\lib\slf4j-api-1.6.1.jar;D:\Zookeeper-3.4.5\bin\..\lib\slf4j-log4j12-1.6.1.jar;D:\Zookeeper-3.4.5\bin\..\conf
2015-12-07 17:01:06,199 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=C:\WINDOWS\system32;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;E:\Oracle\product\11.2.0\dbhome_1\bin;C:\Program Files (x86)\Common Files\NetSarang;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\Program Files\Java\jdk1.7.0_71\bin;D:\Program Files\TortoiseSVN\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\Program Files\Java\jdk1.7.0_71\bin;D:\Users\weizhi\AppData\Local\Programs\Git\cmd;.
2015-12-07 17:01:06,215 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=C:\Users\weizhi\AppData\Local\Temp\
2015-12-07 17:01:06,215 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2015-12-07 17:01:06,215 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Windows 8.1
2015-12-07 17:01:06,231 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
2015-12-07 17:01:06,231 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=6.3
2015-12-07 17:01:06,231 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=weizhi
2015-12-07 17:01:06,231 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=C:\Users\weizhi
2015-12-07 17:01:06,231 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=D:\Zookeeper-3.4.5\bin
2015-12-07 17:01:06,246 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=127.0.0.1:2185 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@579bb367
Welcome to ZooKeeper!
2015-12-07 17:01:06,293 [myid:] - INFO  [main-SendThread(127.0.0.1:2185):ClientCnxn$SendThread@966] - Opening socket connection to server 127.0.0.1/127.0.0.1:2185. Will not attempt to authenticate using SASL (unknown error)
2015-12-07 17:01:06,309 [myid:] - INFO  [main-SendThread(127.0.0.1:2185):ClientCnxn$SendThread@849] - Socket connection established to 127.0.0.1/127.0.0.1:2185, initiating session
JLine support is enabled
[zk: 127.0.0.1:2185(CONNECTING) 0] 2015-12-07 17:01:06,559 [myid:] - INFO  [main-SendThread(127.0.0.1:2185):ClientCnxn$SendThread@1207] - Session establishment complete on server 127.0.0.1/127.0.0.1:2185, sessionid = 0x1517b45265f0003, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
1.2 查看节点

[zk: 127.0.0.1:2185(CONNECTED) 1] ls /
[controller_epoch, controller, brokers, zookeeper, dubbo, admin, consumers, config]

1.3 获取节点信息

[zk: 127.0.0.1:2185(CONNECTED) 4] get /consumers
null
cZxid = 0x358
ctime = Wed Dec 02 14:35:28 CST 2015
mZxid = 0x358
mtime = Wed Dec 02 14:35:28 CST 2015
pZxid = 0x6de
cversion = 2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2

二、名词解释

2.1 节点详情

    czxid. 节点创建时的zxid.
    mzxid. 节点最新一次更新发生时的zxid.
    ctime. 节点创建时的时间戳.
    mtime. 节点最新一次更新发生时的时间戳.
    dataVersion. 节点数据的更新次数.
    cversion. 其子节点的更新次数.
    aclVersion. 节点ACL(授权信息)的更新次数.
    ephemeralOwner. 如果该节点为ephemeral节点, ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是ephemeral节点, ephemeralOwner值为0. 至于什么是ephemeral节点, 请看后面的讲述.
    dataLength. 节点数据的字节数.
    numChildren. 子节点个数.

2.2 zxid

    ZooKeeper Transaction id,所有提议(proposal)都有唯一标识其和其顺序的zxid,状态的每一次改变, 都对应着一个递增的Transaction id, 该id称为zxid. 由于zxid的递增性质, 如果zxid1小于zxid2, 那么zxid1肯定先于zxid2发生. 创建任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会导致Zookeeper状态发生改变, 从而导致zxid的值增加.
实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。

2.3 Session

在client和server通信之前, 首先需要建立连接, 该连接称为session. 连接建立后, 如果发生连接超时, 授权失败, 或者显式关闭连接, 连接便处于CLOSED状态, 此时session结束.

2.4 节点类型

persistent: persistent节点不和特定的session绑定, 不会随着创建该节点的session的结束而消失, 而是一直存在, 除非该节点被显式删除.

ephemeral :ephemeral节点是临时性的, 如果创建该节点的session结束了, 该节点就会被自动删除. ephemeral节点不能拥有子节点. 虽然ephemeral节点与创建它的session绑定, 但只要该该节点没有被删除, 其他session就可以读写该节点中关联的数据. 使用-e参数指定创建ephemeral节点.

    public enum CreateMode {  
         
        /** 
         * 持久节点:节点创建后,会一直存在,不会因客户端会话失效而删除; 
         */  
        PERSISTENT (0, false, false),  
      
        /** 
        * 持久顺序节点:基本特性与持久节点一致,创建节点的过程中,zookeeper会在其名字后自动追加一个单调增长的数字后缀,作为新的节点名;  
        */  
        PERSISTENT_SEQUENTIAL (2, false, true),  
      
        /** 
         *  临时节点:客户端会话失效或连接关闭后,该节点会被自动删除,且不能再临时节点下面创建子节点,否则报如下错:org.apache.zookeeper.KeeperException$NoChildrenForEphemeralsException; 
         */  
        EPHEMERAL (1, true, false),  
      
        /** 
         * 临时顺序节点:基本特性与临时节点一致,创建节点的过程中,zookeeper会在其名字后自动追加一个单调增长的数字后缀,作为新的节点名;  
         */  
        EPHEMERAL_SEQUENTIAL (3, true, true);  
        private static final Logger LOG = LoggerFactory.getLogger(CreateMode.class);  
        private boolean ephemeral;  
        private boolean sequential;  
        private int flag;  
        CreateMode(int flag, boolean ephemeral, boolean sequential) {  
            this.flag = flag;  
            this.ephemeral = ephemeral;  
            this.sequential = sequential;  
        }  
        public boolean isEphemeral() {  
            return ephemeral;  
        }  
        public boolean isSequential() {  
            return sequential;  
        }  
        public int toFlag() {  
            return flag;  
        }  
        static public CreateMode fromFlag(int flag) throws KeeperException {  
            switch(flag) {  
            case 0: return CreateMode.PERSISTENT;  
            case 1: return CreateMode.EPHEMERAL;  
            case 2: return CreateMode.PERSISTENT_SEQUENTIAL;  
            case 3: return CreateMode.EPHEMERAL_SEQUENTIAL ;  
            default:  
                LOG.error("Received an invalid flag value to convert to a CreateMode");  
                throw new KeeperException.BadArgumentsException();  
            }  
        }  
    }  


2.5 packet    

     由FIFO channel发送的字节数据
2.6 proposal 

   一种约定(在所有zookeepker服务器之间),一般带有message(NEW_LEADER类型的不带message)
2.7  message

   原子广播包,需放入 proposal或agreed才能发送

2.8  quorum   法定人数,zookeeper 中指有些操作必须有一定数量的followers,才能执行

2.9  logicalclock 表示投票的轮数,等同于epoch
首先,如果该节点的epoch大于 logicalclock,也就是其已经是新一轮的选举。更加本地的logicalclock, 接收ack队列recvset清空。调用totalOrderPredicate看是否更新自己的投票。如果n的 zxid更新,或者zxid一样,当时id更大,则更新.

如果该节点的epoch小区 logicallock,则忽略
如果该节点的epch和 logicallock相同,则更加 totalOrderPredicate更新,同时发送通知给所有的节点。

    /**
     * Check if a pair (server id, zxid) succeeds our
     * current vote.
     *
     * @param id    Server identifier
     * @param zxid  Last zxid observed by the issuer of this vote
     */
    protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) {
        LOG.debug("id: " + newId + ", proposed id: " + curId + ", zxid: 0x" +
                Long.toHexString(newZxid) + ", proposed zxid: 0x" + Long.toHexString(curZxid));
        if(self.getQuorumVerifier().getWeight(newId) == 0){
            return false;
        }
        
        /*
         * We return true if one of the following three cases hold:
         * 1- New epoch is higher
         * 2- New epoch is the same as current epoch, but new zxid is higher
         * 3- New epoch is the same as current epoch, new zxid is the same
         *  as current zxid, but server id is higher.
         */
        
        return ((newEpoch > curEpoch) || 
                ((newEpoch == curEpoch) &&
                ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));
    }

三、Server的工作状态

 LOOKING:当前Server不知道leader是谁,正在搜寻

LEADING:当前Server即为选举出来的leader

FOLLOWING:leader已经选举出来,当前Server与之同步

四、 zookeeper的心跳设置

sync主要操作是当前leader的时钟计数器tick与Handler的时间计数器tickOfLastAck进行比较,tick是每隔一定时间会+1,而tickOfLastAck是在follower有响应数据则加+1,
通常情况是会有心跳,所有tickOfLastAck就是+1,另外,还有一个同步的超限syncLimit,即tickOfLastAck 大于或者等于leader.self.tick - leader.self.syncLimit,
则表示Follower是存活的,否则,Leader会认为Follower挂了,这样就会移除Handler,此时,Follower会自己启动一轮新的选举。

    tickTime=2000  
    dataDir=/home/admin/zk-data  
    clientPort=2181  
    #Learner初始化连接到Leader的超时时间  
    initLimit=10  
    #Learner和Leader之间消息发送,响应的超时时间  
    syncLimit=5  
    #集群配置,3台机器,2888为Leader服务端口,3888为选举时所用的端口  
    server.1=master:2888:3888  
    server.2=slave1:2888:3888  
    server.3=slave2:2888:3888  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值