說明:是動態增加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版本的動態配置讀取和動態增加節點)
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(以前的方案不能動態增加節點)