繁体   English   中英

如何为具有动态大小的 ZooKeeper 集群初始化 CuratorFramework?

[英]How do I initialize a CuratorFramework for a ZooKeeper cluster with dynamic size?

我刚刚在独立模式下使用 Apache Curator 和 ZooKeeper 实现了一个分布式锁。 我初始化了 CuratorFramework 如下:

CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2182", retryPolicy);

一切正常,所以我尝试在集群模式下使用 ZooKeeper。 我启动了三个实例并按如下方式初始化 CuratorFramework:

CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2182,localhost:2182,localhost:2183", retryPolicy);

如您所见,我只是添加了两个新节点的地址。 到现在为止还挺好。
但是当我不知道每个节点的地址和集群的大小时,我如何初始化客户端,因为我想动态扩展它?
我可以仅通过指定将始终启动的第一个节点的地址来初始化它。 但是,如果该节点出现故障,Curator 将失去与整个集群的连接(我刚刚尝试过)。

您应该始终知道您的 Zookeeper 实例在哪里。 当你不知道它在哪里时,就没有办法连接到它——你怎么能?

如果您可以连接到任何实例,您可以获取配置详细信息并定期轮询它以保持您的连接详细信息是最新的,也许?

也许看看https://zookeeper.apache.org/doc/r3.5.5/zookeeperReconfig.html#ch_reconfig_rebalancing

CuratorFrameworkFactory一个构建器,允许您指定EnsembleProvider而不是connectionString并包含EnsembleTracker 这将使您的connectionString保持最新,但您需要以某种方式保留数据以确保您的应用程序在重新启动时可以找到该集合。 我建议实现一个装饰EnsembleProvider ,它封装了FixedEnsembleProvider并将配置写入属性文件。

例子:

EnsembleProvider ensemble = new MyDecoratingEnsembleProvider(new FixedEnsembleProvider("localhost:2182", true));
CuratorFramework client = CuratorFrameworkFactory.builder()
    .ensembleProvider(ensemble)
    .retryPolicy(retryPolicy)
    .ensembleTracker(true)
    .build();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM