如下只在特殊狀況下使用,不要用在生產環境。html
公司的產品使用Zookeeper作爲集羣支持,可是客戶在驗收的時候提出了一個很爲難人的要求,那就是3臺集羣服務,中止2臺之後,還要求咱們的應用能提供服務,這就有點難爲人了。java
由於用過Zookeeper的人都知道,Zookeeper的leader的選舉須要大多數贊成,也就是說三臺機器的Zookeeper集羣那麼選舉leader就須要兩臺,若是隻剩下一臺Zookeeper那麼是沒法完成leader選舉的,也就是說Zookeeper將不能對外提供服務。算法
我是在公司研發羣裏獲得別的研發團隊的幫助請求,而我正好在研究Zookeeper,因此給出瞭解決方案,並測試經過。apache
解決方法仍是比較簡單的,此處再也不講解Zookeeper的leader選舉,後續能夠參照個人博客,Zookeeper leader選舉。測試
修改org.apache.zookeeper.server.quorum.flexible.QuorumHierarchical類的containsQuorum方法爲:flex
public boolean containsQuorum(HashSet<Long> set){ return true; }
修改org.apache.zookeeper.server.quorum.flexible.QuorumMaj類的containsQuorum方法爲:spa
public boolean containsQuorum(HashSet<Long> set){ return true; }
這兩個方法是關於選舉的算法,應用了大多數原則,如今直接去掉。code
將這兩個類單獨打包,命名爲_patch-0.1.jar,這麼命名的目的就是,加載的時候優先加載我修改的類,下劃線優先加載。server
首先中止Zookeeper集羣。htm
而後將壓縮包解壓獲得的_patch-0.1.jar放置到每一個節點的:${zkPath}/lib/下。
測試比較簡單,只涉及到單節點提供服務以及leader選舉,未通過更深層次的測試,不建議在正式生產環境下使用,因此經過測驗之後,建議移除單節點支持。移除方式:依次將每一個節點中止服務->移除補丁包->重啓;便可。