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

jaxagkaj  于 2022-12-20  发布在  Apache
关注(0)|答案(2)|浏览(176)

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

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

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

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

正如你所看到的,我刚刚添加了两个新节点的地址。到目前为止一切顺利。
但是,当我不知道每个节点的地址和集群的大小时,我如何初始化客户端,因为我想动态地扩展它?
我可以通过指定第一个节点的地址来初始化它,这个节点总是被启动的。但是如果那个节点关闭了,馆长就会失去与整个集群的连接(我刚刚试过)。

kiayqfof

kiayqfof1#

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

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

ffscu2ro2#

你应该总是知道你的Zookeeper示例在哪里。当你不知道它在哪里的时候,你是没有办法连接到它的--你怎么能呢?
如果您可以连接到任何示例,那么您就可以获取配置详细信息并定期轮询它,以保持连接详细信息是最新的。
也许可以看看https://zookeeper.apache.org/doc/r3.5.5/zookeeperReconfig.html#ch_reconfig_rebalancing

相关问题