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名稱後會附加一個序列值