美文网首页zookeeper
Zookeeper学习笔记

Zookeeper学习笔记

作者: felix_feng | 来源:发表于2016-08-02 13:22 被阅读252次

    创建客户端

    ZkClientzkClient = zkHelper.getZkClient();

    //节点是否存在

    zkClient.exists(Constant.client);

    //创建节点(节点,初始值)

    zkClient.createPersistent(Constant.client,Objectvalue);

    //创建临时节点

    kClient.createEphemeral(Constant.client+"/"+client);

    //读数据

    zkClient.readData(目录);

    //写数据

    zkClient.writeData(目录);

    获得访问点

    ListserverList=zkClient.getChildren(rootPath);

    2.重要概念

    2.1 ZNode

    前文已介绍了ZNode, ZNode根据其本身的特性,可以分为下面两类:

    ·Regular ZNode:常规型ZNode,用户需要显式的创建、删除

    ·Ephemeral ZNode:临时型ZNode,用户创建它之后,可以显式的删除,也可以在创建它的Session结束后,由ZooKeeper Server自动删除

    ZNode还有一个Sequential的特性,如果创建的时候指定的话,该ZNode的名字后面会自动Append一个不断增加的SequenceNo。

    2.2 Session

    Client与ZooKeeper之间的通信,需要创建一个Session,这个Session会有一个超时时间。因为ZooKeeper集群会把Client的Session信息持久化,所以在Session没超时之前,Client与ZooKeeper Server的连接可以在各个ZooKeeper

    Server之间透明地移动。

    在实际的应用中,如果Client与Server之间的通信足够频繁,Session的维护就不需要其它额外的消息了。否则,ZooKeeper Client会每t/3 ms发一次心跳给Server,如果Client 2t/3 ms没收到来自Server的心跳回应,就会换到一个新的ZooKeeper Server上。这里t是用户配置的Session的超时时间。

    2.3 Watcher

    ZooKeeper支持一种Watch操作,Client可以在某个ZNode上设置一个Watcher,来Watch该ZNode上的变化。如果该ZNode上有相应的变化,就会触发这个Watcher,把相应的事件通知给设置Watcher的Client。需要注意的是,ZooKeeper中的Watcher是一次性的,即触发一次就会被取消,如果想继续Watch的话,需要客户端重新设置Watcher。这个跟epoll里的oneshot模式有点类似。

    3. ZooKeeper特性

    3.1读、写(更新)模式

    在ZooKeeper集群中,读可以从任意一个ZooKeeper Server读,这一点是保证ZooKeeper比较好的读性能的关键;写的请求会先Forwarder到Leader,然后由Leader来通过ZooKeeper中的原子广播协议,将请求广播给所有的Follower,Leader收到一半以上的写成功的Ack后,就认为该写成功了,就会将该写进行持久化,并告诉客户端写成功了。

    3.2 WAL和Snapshot

    和大多数分布式系统一样,ZooKeeper也有WAL(Write-Ahead-Log),对于每一个更新操作,ZooKeeper都会先写WAL,然后再对内存中的数据做更新,然后向Client通知更新结果。另外,ZooKeeper还会定期将内存中的目录树进行Snapshot,落地到磁盘上,这个跟HDFS中的FSImage是比较类似的。这么做的主要目的,一当然是数据的持久化,二是加快重启之后的恢复速度,如果全部通过Replay

    WAL的形式恢复的话,会比较慢。

    3.3 FIFO

    对于每一个ZooKeeper客户端而言,所有的操作都是遵循FIFO顺序的,这一特性是由下面两个基本特性来保证的:一是ZooKeeper Client与Server之间的网络通信是基于TCP,TCP保证了Client/Server之间传输包的顺序;二是ZooKeeper Server执行客户端请求也是严格按照FIFO顺序的。

    3.4 Linearizability

    在ZooKeeper中,所有的更新操作都有严格的偏序关系,更新操作都是串行执行的,这一点是保证ZooKeeper功能正确性的关键。

    ZooKeeper Client API

    ZooKeeper Client Library提供了丰富直观的API供用户程序使用,下面是一些常用的API:

    ·create(path, data, flags):创建一个ZNode, path是其路径,data是要存储在该ZNode上的数据,flags常用的有: PERSISTEN, PERSISTENT_SEQUENTAIL, EPHEMERAL,EPHEMERAL_SEQUENTAIL

    ·delete(path, version):删除一个ZNode,可以通过version删除指定的版本,如果version是-1的话,表示删除所有的版本

    ·exists(path, watch):判断指定ZNode是否存在,并设置是否Watch这个ZNode。这里如果要设置Watcher的话,Watcher是在创建ZooKeeper实例时指定的,如果要设置特定的Watcher的话,可以调用另一个重载版本的exists(path, watcher)。以下几个带watch参数的API也都类似

    ·getData(path, watch):读取指定ZNode上的数据,并设置是否watch这个ZNode

    ·setData(path, watch):更新指定ZNode的数据,并设置是否Watch这个ZNode

    ·getChildren(path, watch):获取指定ZNode的所有子ZNode的名字,并设置是否Watch这个ZNode

    ·sync(path):把所有在sync之前的更新操作都进行同步,达到每个请求都在半数以上的ZooKeeper Server上生效。path参数目前没有用

    ·setAcl(path, acl):设置指定ZNode的Acl信息

    ·getAcl(path):获取指定ZNode的Acl信息

    相关文章

      网友评论

        本文标题:Zookeeper学习笔记

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