Zookeeper详解

时间:2022-06-15 05:22:50

ZooKeeper有一个绑定Java和C的官方API。Zookeeper社区为大大都语言(.NET,python等)供给非官方API。使用ZooKeeper API,应用措施可以连接,交互,操纵数据,协调,最后断开与ZooKeeper调集的连接。

ZooKeeper API具有丰富的成果,以简单和安适的方法获得ZooKeeper调集的所有成果。ZooKeeper API供给同步和异步要领。

ZooKeeper调集和ZooKeeper API在各个方面都完全相辅相成,对开发人员有很大的辅佐。让我们在本章讨论Java绑定。

ZooKeeper API的根本常识

与ZooKeeper调集进行交互的应用措施称为 ZooKeeper客户端或简称客户端

Znode是ZooKeeper调集的核心组件,ZooKeeper API供给了一小组要领使用ZooKeeper调集来独霸znode的所有细节。

客户端应该遵循以法式,与ZooKeeper调集进行清晰和洁净的交互。

连接到ZooKeeper调集。ZooKeeper调集为客户端分配会话ID。

按期向处事器发送心跳。否则,ZooKeeper调集将过期会话ID,客户端需要从头连接。

只要会话ID处于勾当状态,就可以获取/设置znode。

所有任务完成后,断开与ZooKeeper调集的连接。如果客户端永劫间不勾当,则ZooKeeper调集将自动断开客户端。

Java绑定

让我们来了解本章中最重要的一组ZooKeeper API。ZooKeeper API的核心部分是ZooKeeper类。它供给了在其结构函数中连接ZooKeeper调集的选项,并具有以下要领:

connect - 连接到ZooKeeper调集

create- 创建znode

exists- 查抄znode是否存在及其信息

getData - 从特定的znode获取数据

setData - 在特定的znode中设置数据

getChildren - 获取特定znode中的所有子节点

delete - 删除特定的znode及其所有子项

close - *连接

连接到ZooKeeper调集

ZooKeeper类通过其结构函数供给connect成果。结构函数的签名如下 :

ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)

connectionString - ZooKeeper调集主机。

sessionTimeout - 会话超时(以毫秒为单位)。

watcher - 实现“监视器”界面的东西。ZooKeeper调集通过监视器东西返回连接状态。

让我们创建一个新的辅佐类 ZooKeeperConnection ,并添加一个要领 connect 。 connect 要领创建一个ZooKeeper东西,连接到ZooKeeper调集,然后返回东西。

这里 CountDownLatch 用于遏制(期待)主进程,直到客户端与ZooKeeper调集连接。

ZooKeeper调集通过监视器回调来答复连接状态。一旦客户端与ZooKeeper调集连接,监视器回调就会被挪用,并且监视器回调函数挪用CountDownLatchcountDown要领来释放锁,在主进程中await

以下是与ZooKeeper调集连接的完整代码。

编码:ZooKeeperConnection.java

// import java classes import java.io.IOException; import java.util.concurrent.CountDownLatch; // import zookeeper classes import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.AsyncCallback.StatCallback; import org.apache.zookeeper.KeeperException.Code; import org.apache.zookeeper.data.Stat; public class ZooKeeperConnection { // declare zookeeper instance to access ZooKeeper ensemble private ZooKeeper zoo; final CountDownLatch connectedSignal = new CountDownLatch(1); // Method to connect zookeeper ensemble. public ZooKeeper connect(String host) throws IOException,InterruptedException { zoo = new ZooKeeper(host,5000,new Watcher() { public void process(WatchedEvent we) { if (we.getState() == KeeperState.SyncConnected) { connectedSignal.countDown(); } } }); connectedSignal.await(); return zoo; } // Method to disconnect from zookeeper server public void close() throws InterruptedException { zoo.close(); } }

生存上面的代码,它将不才一节顶用于连接ZooKeeper调集。

创建Znode

ZooKeeper类供给了在ZooKeeper调集中创建一个新的znode的create要领。 create 要领的签名如下:

create(String path, byte[] data, List<ACL> acl, CreateMode createMode)

path - Znode路径。例如,/myapp1,/myapp2,/myapp1/mydata1,myapp2/mydata1/myanothersubdata

data - 要存储在指定znode路径中的数据