我刚刚在独立模式下使用Apache Curator和ZooKeeper实现了一个分布式锁,初始化了CuratorFramework,如下所示:
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2182", retryPolicy);
一切正常,所以我尝试在集群模式下使用ZooKeeper。我启动了三个示例,并初始化了CuratorFramework,如下所示:
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2182,localhost:2182,localhost:2183", retryPolicy);
正如你所看到的,我刚刚添加了两个新节点的地址。到目前为止一切顺利。
但是,当我不知道每个节点的地址和集群的大小时,我如何初始化客户端,因为我想动态地扩展它?
我可以通过指定第一个节点的地址来初始化它,这个节点总是被启动的。但是如果那个节点关闭了,馆长就会失去与整个集群的连接(我刚刚试过)。
2条答案
按热度按时间kiayqfof1#
CuratorFrameworkFactory
有一个生成器,允许您指定EnsembleProvider
而不是connectionString
,并包含EnsembleTracker
。这将使您的connectionString
保持最新,但是您需要以某种方式持久保存数据,以确保应用程序在重新启动时能够找到集合。我建议实现一个封装FixedEnsembleProvider
并将配置写入属性文件的修饰EnsembleProvider
。示例:
ffscu2ro2#
你应该总是知道你的Zookeeper示例在哪里。当你不知道它在哪里的时候,你是没有办法连接到它的--你怎么能呢?
如果您可以连接到任何示例,那么您就可以获取配置详细信息并定期轮询它,以保持连接详细信息是最新的。
也许可以看看https://zookeeper.apache.org/doc/r3.5.5/zookeeperReconfig.html#ch_reconfig_rebalancing