2015-08-08 84 views
0

我想创建一个基于Zookeeper与CuratorFramework的应用程序。应用程序必须能够在更多节点上以法定速度运行。每个应用程序实例都嵌入了Zookeeper服务器和客户端的实例。节点成功地置于法定人数中。每个节点都将一个EPHEMERAL节点写入/ workers/active/node1(“active”是由leader创建的PERSISTENT znode)。因为当客户端连接到zookeeper服务器的本地主机实例时,由于Zookeeper检测到非常缓慢的节点故障并且会话过期后,临时节点已经消失,所以我决定将NodeA的客户端连接到具有连接字符串“NodeB,NodeC”的集群。具有连接字符串“NodeA,Node C”的NodeB和具有“NodeA,NodeB”的NodeC。这导致,该集群在检测节点故障方面快得多。我在每个节点上添加了监视器,以检测/ workers/active上的NodeChildren事件。该观察者具有连接到本地主机zookeeper服务器的CuratorFramework客户端的特殊实例。我这样做了,因为回调仅注册到客户端注册它的服务器。问题是,解决方案不稳定,我不知道为什么。有时候一切正常,但之后,我在/ workers/active中释放了znode,但所有节点都在运行,或者/ workers/active中的状态正确,但即使数秒前它正常工作,NodeChildren回调也不起作用。 ..我能做什么错了?我已经尝试了一切......Zookeeper集群监视器

回答

0

我发现了一种溶液。

在我的情况是最好的选择使用PersistenceEphemeral节点CuratorFramework食谱节点注册。

对于检测添加/删除节点回调最好使用PathChildrenCache从CuratorFramework食谱和prepand回调它