0

在 3 台机器中拥有 3 个 zookeeper,每个 zookeeper 中有一个 kafka 代理。 主机数量:3 要跟踪的 znode 数量:1 [1* 主机数量 = 3]当 znode 更改其状态 [caseOk/NoNode] 时, 是否有任何方法可以使用 Zookeeper.Stat 类变量跟踪主机名和 znode 。试图实现一个计数器来跟踪多个主机端口上的活动 znode。在某个点上徘徊以识别第一个 znode 存在实例并重新连接实例。

4

1 回答 1

1

你的问题有点含糊不清。我假设您有 3 个独立的 Zookeeper 节点(独立或 3 个独立的集成),并且希望/some/path在所有 3 个 Zookeeper 节点上观看相同的 ZNode。

(如果您指的是具有 3 个节点的单个 ensemble,那么您不必担心节点,因为 ensemble 将保证 ensemble 中节点的一致性)

最简单的方法是使用Apache Curator配方(参见配方),NodeCache。Apache Curator 是一组配方和标准 ZookeeperClient 的扩展。它在内部管理所有边缘情况和连接状态,因此您不必担心纯 Zookeeper 客户端的困难。NodeCache 可以监视给定的 ZNode(在给定的 ZPath 上)并通知该 ZNode 发生的变化。

请参阅此答案以了解如何初始化CuratorFramework实例。

您所要做的就是使用 3 个连接字符串(用于您的 3 个节点)初始化 3 个 CuratorFramework 实例,如上述答案中所述,然后为每个客户端启动 NodeCache 对象。

CuratorFramework client1=//create CuratorFramework intance with corresponding connection string.
CuratorFramework client2=//create CuratorFramework intance with corresponding connection string.
CuratorFramework client3=//create CuratorFramework intance with corresponding connection string. 

然后启动所有这些客户端,

client1.start();
client2.start();
client3.start();

最后,为每个 CuratorFramework 实例的 ZNode 创建并启动 NodeCache 实例。

NodeCache znode1=new NodeCache(client1, "/znode/path");
NodeCache znode2=new NodeCache(client2, "/znode/path");
NodeCache znode3=new NodeCache(client3, "/znode/path");

然后为每个节点缓存添加 NodeCacheListener 以订阅 ZNode 更改。

znode1.getListenable().addListener({listener class implementing NodeCacheListener});
znode2.getListenable().addListener({listener class implementing NodeCacheListener});
znode3.getListenable().addListener({listener class implementing NodeCacheListener});

然后,启动它们。

znode1.start();
znode2.start();
znode3.start();

现在,您将通过您注册的侦听器收到任何更改。希望你明白了。

于 2016-12-17T10:09:35.820 回答