1. 程式人生 > >ZooKeeper動態增加Server(動態增加節點)的研究(待實踐)

ZooKeeper動態增加Server(動態增加節點)的研究(待實踐)

leader linux nod 部署 them user ase 通過 增加節點

說明:是動態增加Server,不是動態增加連接到ZK Server的Client。

場景如下(轉自外文):

1、在t=t_1->[peer-1(Leader),peer-2],peer-1是主節點,所有客戶端連接到該節點。

2、在t=t_2->[peer-1(Leader),peer-2,peer-3],稍後的時候,同行3加入了該組。是否可以“動態地”將動態列表添加到zookeeper服務器列表(即,在對等體1上不重新啟動ZooKeeper)?

3、在t=t_3->[peer-3(Leader),peer-4],一段時間後,對等體1和對等體2離開組(例如,死亡或被關閉)。假設有一種方法來動態地將peer-3和peer-4添加到組中peer-3成為領導者並且所有客戶端請求都發送到對等體3。

提示:或者這樣說,原始有3臺Server,然後一段時候後訪問劇增,想再增加多兩臺,最後變為5臺Server。

動態增加ZK Server/節點會面臨的問題:

1、每個連接到ZK Server時,都會配置一個Connect的字符串,字符串上指定了所有ZK Server的服務器列表,形式類似於:“192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181”;且配置好之後是不能變的。

2、ZK Server在配置集群時,會在配置文件指定明確的服務器IP和端口,然後啟動。如果中途某臺掛了,那麽只要在一定數量範圍之內不影響;但是如果想要增加幾臺,需要在每臺ZK Server上的配置文件上都加入新增加的IP和端口,最重要一點就是要重啟所有的ZK Server才能使其生效。

註意:通過以上的做法,那麽會面臨一個問題,如果此時正在下單,或者分布式事務鎖在運行,就會面臨丟單等問題!

動態增加ZK Server/節點的解決方案:

1、ZK從3.5版本開始已經增加了動態增加節點的功能,並且是屬於動態讀取配置文件而不用重啟全部ZK Server。

  • 通過最新版本來解決的方案,對於已經連接到ZK Server的客戶端,可以采用代碼灰度更新的方案來逐步更新掉Connect的服務器IP列表。而不用影響現有的業務完整性。
  • 當然,對於客戶端的連接字符串,可以采用遠程地址的方式,比如訪問一條固定的URL,返回服務器IP列表,當有新的服務器IP列表更新時,將通知全部的客戶端去更新。這樣可以解決采用代碼灰度更新的問題。

2、在3.5版本以前的公開解決方法

  • 對於客戶端的連接字符串,可以采用遠程地址的方式,比如訪問一條固定的URL,返回服務器IP列表,當有新的服務器IP列表更新時,將通知全部的客戶端去更新。
  • 對於ZK Server,可以采用部署另外一套環境,比如之前是3臺的;那麽再次部署9臺,且這9臺與之前的3臺是沒關聯的。
  • 然後客戶端收到更新通知時,去獲取新的9臺服務器列表。

註意:上面采用更新客戶端服務器IP列表的形式需要做業務空閑的判斷處理,比如這個客戶端在更新前沒任何操作正在處理,並且要阻止新來的業務請求等。

以上研究的搜索線索:zookeeper dynamic add node

參考:

https://zookeeper.apache.org/doc/trunk/zookeeperReconfig.html(官方3.5版本的動態配置讀取和動態增加節點)

http://mail-archives.apache.org/mod_mbox/zookeeper-user/201308.mbox/%[email protected].com%3E(3.5版本的線索)

https://stackoverflow.com/questions/11375126/zookeeper-adding-peers-dynamically(動態增加節點的問題研究)

https://issues.apache.org/jira/browse/ZOOKEEPER-107(動態增加節點的公開解決方案)

http://grokbase.com/t/zookeeper/user/138drn03sv/dynamically-adding-nodes-to-zk-ensemble(公開解決方案的一些操作)

https://issues.apache.org/jira/browse/ZOOKEEPER-1660(動態增加節點)

https://www.slideshare.net/Hadoop_Summit/dynamic-reconfiguration-of-zookeeper(動態增加節點)

https://gist.github.com/miketheman/6057930(動態增加節點)

https://forever-zs.github.io/2017/08/06/zookeeper/%E5%8A%A8%E6%80%81%E6%84%9F%E7%9F%A5%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E4%B8%8B%E7%BA%BF/(通過ZK實現的服務器上下線功能,不是關於ZK怎麽動態增加節點)

http://heylinux.com/archives/2063.html(以前的方案不能動態增加節點)

http://dbaplus.cn/news-21-1240-1.html(以前的方案不能動態增加節點)

ZooKeeper動態增加Server(動態增加節點)的研究(待實踐)