Zookeeper学习笔记

创建客户端

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学习笔记)