创建客户端
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 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信息
网友评论