Zookeeper簡介

 Zookeeper 是一個分佈式服務框架(即:為其它分佈式程序提供服務),主要是用來解決分佈式應用中遇到的一些數據管理問題如:統一命名服務、狀態同步服務、集群管理、分佈式應用配置項的管理等。

Zookeeper是一個類似hdfs的樹形文件結構,zookeeper可以用來保證數據在(zk)集 群之間的數據的事務性一致.

 


 Zookeeper基本功能


 Zookeeper底層只提供兩個功能:

  •  管理(存儲、讀取)數據
    • 保持全局數據一致:每個server保存一份相同的數據副本,client無論連接到哪個server,數據都是一致的
  • 監聽數據節點

 


zookeeper角色


zookeeper有三個角色:Leader、Follower、Observer

 

  • Leader、Follower通過選舉產生【詳見:zookeeper的選舉機制
  • Observer需要在配置文件(zoo.cfg)中指定
server.1=172.23.34.13:2001:3001
server.2=172.23.34.13:2002:3002
server.3=172.23.34.13:2003:3002
server.4=172.23.34.13:2004:3003:observer

 


zookeeper的選舉機制


Zookeeper 無需配置主從節點,會自己通過選舉選出主節點((zk服務器集群規模應不小於3個節點, 只要有半數以上節點存活,zk就能正常服務)

  • 全新集群
假設有五台服務器組成的zookeeper集群,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史數據,在存放數據量這一點上,都是一樣的.
1) 服務器1啟動,此時只有它一台服務器啟動了,它發出去的報沒有任何響應,所以它的選舉狀態一直是LOOKING狀態
2) 服務器2啟動,它與最開始啟動的服務器1進行通信,互相交換自己的選舉結果,由於兩者都沒有歷史數據,所以id值較大的服務器2勝出,但是由於沒有達到超過半數以上的服務器都同意選舉它(這個例子中的半數以上是3),所以服務器1,2還是繼續保持LOOKING狀態.
3) 服務器3啟動,根據前面的理論分析,服務器3成為服務器1,2,3中的老大,而與上面不同的是,此時有三台服務器選舉了它,所以它成為了這次選舉的leader.
4) 服務器4啟動,根據前面的分析,理論上服務器4應該是服務器1,2,3,4中最大的,但是由於前面已經有半數以上的服務器選舉了服務器3,所以它只能當Follower.
5) 服務器5啟動,同4一樣,當Follower.
  • 非全新集群(數據恢復)
當zookeeper運行了一段時間之後,有機器down掉,重新選舉時,需要考慮數據id、leader id和邏輯時鐘。

數據id:數據新的id就大,數據每次更新都會更新id。
Leader id:就是我們配置的myid中的值,每個機器一個。
邏輯時鐘:這個值從0開始遞增,每次選舉對應一個值,也就是說:  如果在同一次選舉中,那麼這個值應該是一致的 ;  邏輯時鐘值越大,說明這一次選舉leader的進程更新.

選舉的標準就變成:
   1、邏輯時鐘小的選舉結果被忽略,重新投票
   2、統一邏輯時鐘後,數據id大的勝出
   3、數據id相同的情況下,leader id大的勝出

 


ZNode類型


  • 持久(PERSISTENT): 斷開Zookeeper連接不會被清除
  • 持久序列(PERSISTENT_SEQUENTIAL):
  • 臨時(EPHEMERAL):斷開Zookeeper連接後,該類型節點會自動刪除
  • 臨時序列(EPHEMERAL_SEQUENTIAL)
注意:
  • 臨時、臨時序列類型的節點不能有子節點
  • 持久序列、臨時序列的znode名稱後會附加一個序列值

 

 

Tags: