【Zookeeper】Zookeeper集羣單節點提供服務

  如下只在特殊狀況下使用,不要用在生產環境。html

1、問題背景

  公司的產品使用Zookeeper作爲集羣支持,可是客戶在驗收的時候提出了一個很爲難人的要求,那就是3臺集羣服務,中止2臺之後,還要求咱們的應用能提供服務,這就有點難爲人了。java

  由於用過Zookeeper的人都知道,Zookeeper的leader的選舉須要大多數贊成,也就是說三臺機器的Zookeeper集羣那麼選舉leader就須要兩臺,若是隻剩下一臺Zookeeper那麼是沒法完成leader選舉的,也就是說Zookeeper將不能對外提供服務。算法

  我是在公司研發羣裏獲得別的研發團隊的幫助請求,而我正好在研究Zookeeper,因此給出瞭解決方案,並測試經過。apache

2、解決方案

  解決方法仍是比較簡單的,此處再也不講解Zookeeper的leader選舉,後續能夠參照個人博客,Zookeeper leader選舉測試

2.1 修改源碼

  修改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

2.2 打包

  將這兩個類單獨打包,命名爲_patch-0.1.jar,這麼命名的目的就是,加載的時候優先加載我修改的類,下劃線優先加載。server

2.3 安裝及測試步驟

2.3.1 安裝

  首先中止Zookeeper集羣。htm

  而後將壓縮包解壓獲得的_patch-0.1.jar放置到每一個節點的:${zkPath}/lib/下。

2.3.2 測試

  1. 在集羣未啓動時,使用zk客戶端鏈接集羣(-server ip:port,ip:port,ip:port),此時客戶端會持續報鏈接異常,而後啓動任意一個節點,zk客戶端就能正常使用。
  2. 集羣徹底啓動後,任意中止其中兩個,zk依然能夠提供服務,客戶端能正常使用,
  3. 使用java的zk客戶端zkclient-0.8.jar進行測試,測試經過

2.4 注意事項

  測試比較簡單,只涉及到單節點提供服務以及leader選舉,未通過更深層次的測試,不建議在正式生產環境下使用,因此經過測驗之後,建議移除單節點支持。移除方式:依次將每一個節點中止服務->移除補丁包->重啓;便可。

相關文章
相關標籤/搜索