1. 程式人生 > >zookeeper c api連線管理問題

zookeeper c api連線管理問題

背景:使用zookeeper3.4.8   的 c api寫了一個客戶端來測試zookeeper叢集

在測試到其中一個點的時候,遇到一些困惑:

假如zookeeper叢集啟動了三個zookeeper例項,對應ip埠分別是:host1:port1,host2:port2,host3:port3

然後在客戶端側,呼叫zookeeper_init的時候,也需要提供一個ip列表。

問題就在如何配置這個ip列表:

1,假如我配置這個IP列表為host1:port1,host2:port2,host3:port3, 那麼啟動多個客戶端,整個跑起來都正常。各個客戶端會根據某個負載均衡的演算法連線到不同的zookeeper例項上面。並且停掉某一個zookeeper服務,客戶端能繼續正常執行(切換連線到其它zookeeper服務)。

2,假如我配置這個ip列表為:host1:port1。 那麼當我將host1:port1對應的zookeeper服務停到(這時還有兩個zookeeper服務在正常執行),客戶端就會斷開連線,並且不會自動切換連線到其它zookeeper服務。客戶端就會進入異常狀態。

上面的問題可以總結為:在zookeeper3.4.8版本里面,客戶端必須要靜態配置所有zookeeper服務節點ip埠, 客戶端才能更好地做容災服務。

但是這個靜態配置就破壞了分散式的思維,例如假如我現在需要對zookeeper叢集擴容(從三個例項擴容到五個例項)。那麼我需要更改所有客戶端的ip埠靜態配置並且重啟客戶端。

對於客戶端而言,最理想的狀態是,不需要關心叢集裡面的實現細節,也不需要關心叢集的例項個數。

不過對於上面問題,在zookeeper3.5版本後,已經有提供相關api實現了。詳細見https://issues.apache.org/jira/browse/ZOOKEEPER-762

收集的其它一些相關文章:

http://tech.uc.cn/?p=1189

http://tech.uc.cn/?p=974