說明:是動态增加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