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

时间:2019-05-06 12:50:24

标签: java apache-zookeeper distributed-system apache-curator

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

a = 14
arr = [1, 2, 3, 4, 5] # [b,c,d,e,f]
sum = 0;
for index, value in enumerate(arr):
    if a < sum + value:
        print (value , index)
    else:
        sum += value
        # and rest of your else code

print sum

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

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

如您所见,我刚刚添加了两个新节点的地址。 到目前为止,一切都很好。
但是当我不知道每个节点的地址和集群的大小时,如何进行动态扩展,该如何初始化客户端呢?
我可以通过仅指定将始终启动的第一个节点的地址来对其进行初始化。但是,如果该节点发生故障,则Curator将失去与整个群集的连接(我刚刚尝试过)。

2 个答案:

答案 0 :(得分:0)

您应该始终知道Zookeeper实例在哪里。当您不知道某物在哪里时,就无法连接到它-您怎么能?

如果您可以连接到任何实例,则可以获取配置详细信息并定期对其进行轮询,以使您的连接详细信息保持最新状态?

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

答案 1 :(得分:0)

CuratorFrameworkFactory 具有 a builder,允许您指定 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();