Zookeeper Ephemeral結點使用心得


原文鏈接:http://hongweiyi.com/2012/11/zookeeper-ephemeral-nodes-experience/

Zookeeper Ephemeral結點使用心得

公司里面在拿Zookeeper做命名服務,通過使用ZK,前端只需要根據指定的ZK地址獲得相應的資源或服務的后端服務器地址即可,而后端服務器需要做的僅僅是將自己的地址注冊到ZK上作為一個Ephemeral結點即可。(雖然是挺方便后端擴容,但是我個人不太建議直接上ZK,否則開發成本會增加)

 

P.S.:Ephemeral結點在Apache Zookeeper中是一個臨時結點,這些結點只要創建它的結點session不掛,它就一直存在,當session中止了,結點也就刪除了。

 

問題:

在開發的時候遇到了一個奇怪的問題,當某個后端快速重啟之后,該后端的結點信息過一段時間后會被刪除,這樣就導致了后端服務永遠無法被前端訪問到。

原因:

查了資料后得知,如果在你的session中,ephemeral結點不是由你創建的,你的session就不會擁有該結點,所以當擁有該結點的session終止(expire)了,該結點也就銷毀了。那么,如果不是你顯式的刪除該結點的話,就只能由ZK幫你終止它,在會話超時之后ZK就自動刪除結點。如果在會話還未超時的過程中(一般是30s),你重啟后端服務器的話,就會導致我所說的情況。

解決方案:

Apache提供了幾個patch,也有人提供了一些解決方案,均是顯式的終止session。但是后端服務器掛了,顯式終止一般是沒用的。找到的這個方法是比較靠譜的,那就是在創建結點前,先刪除之前的結點:

1. try {

2.   zk.delete(path)

3. } catch {

4.   e: NoNodeException => // do nothing

5. }

6. zk.create(path, data, CreateMode.EPHEMERAL)

參考資料:

A Gotcha When Using ZooKeeper Ephemeral Nodes

ephemerals handling after restart


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM