簡體   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