1. 程式人生 > >zk系列-zookeeper的使用

zk系列-zookeeper的使用

zk支援java/c訪問,java常用的有apache-zkclient、社群版的i0tec-zkclient、github.adyliu,apache-zkclient是zk自身提供的介面,i0tec/adyliu都是對apache版的封裝豐富,提供了便捷的事件監聽和資料序列化。C版的使用見"zk系列-c++下zookeeper使用例項"。具體使用不做介紹了。

一般zkclient要支援如下功能:

  • 節點-建立、刪除、是否存在、永久節點、臨時節點、序列節點
  • 事件-子節點變化、節點變化、狀態變化、資料變化事件的註冊和取消。也就是收到服務端事件通知時,根據事件型別呼叫相關函式。
更進一步,可以支援:
  • 維護對不同zkserver的zkclient,維護各自的連線數,當一個zkclient的連線數為0時,關閉其連線
  • 如果維護全公司的zk,可以封裝一些預設的配置,讓zk對使用者完全透明
  • 支援儲存資料的序列化和反序列化:如java中的Properties,來管理配置(properties或xml格式);或者其他格式,只要自己知道二進位制流的格式就好
  • 分散式鎖-不同程序或服務間互斥的實現,主要使用臨時序列節點
    • 向zkserver在同一個父目錄(如/lock)下建立臨時序列子節點(/lock/ip_),並監聽/lock子節點變化
    • /lock下會有/ipa_1,/ipb_2,/ipc_3類似遞增的臨時節點
    • ipa獲得/lock下所有子節點,當前最小節點是自己建立的時候,表示該服務獲得鎖
    • ipa完成互斥操作後,刪除/lock/ipa_1,表示釋放鎖
    • zkserver會通知其他client變化,其他client重複以上判斷和操作
  • 統一配置:服務經常有自己的配置檔案,但服務又是多份部署,為了保證配置的一致性及修改方便,可以用zkserver維護配置檔案。各服務都監聽配置節點,當節點資料變化時,各自獲取新資料(即配置)
  • 服務管理:後臺服務都向一個節點下建立子節點,儲存自己的Ip和埠;客戶端獲取該節點下的所有子節點,隨機選一個ip去呼叫。也可以做智慧一些,每個ip節點還能記錄下最近一段時間使用該ip的client數,這樣client選用使用數最少的ip,達到更好的負載均衡。
就說這麼多吧,具體的程式碼實現也都很簡單,在已有zkclient的基礎上進行一些簡單封裝就好。