Zookeeper探究之基礎知識總結
一、Zookeeper介紹
Zookeeper是一個高效能、分散式、開源分散式的應用協調服務框架。它提供簡單原始的功能,分散式應用可以基於它實現更加高階的服務,比如同步,配置管理,叢集管理,名空間。它被設計為易用程式設計,使用檔案系統目錄樹作為資料模型。服務端跑在java上,提供java和C的客戶端API。(所謂分散式系統就是多臺計算機之間相互協調工作,之間使用網路進行通訊,彼此互動,完成共同的目標。)
資料模型
- Zookeeper使用分層結構,使用檔案系統目錄樹作為資料模型,樹形結構中的每一個節點叫做Znode,每一個Znode節點都有資料(byte[]型別),也可以有子節點。
- 節點路徑使用“/”來作為字首,沒有相對路徑。
- 內部使用資料結構stat來儲存資料的變化,ACL的變化和時間戳。
- 資料發生變化時,版本號會遞增。
- 可以對Znode節點中的資料進行讀寫操作。
資料模型可參考下圖所示:
Zookeeper典型應用場景介紹
-
資料釋出/訂閱
即配置中心,釋出者將一系列資料傳送到zk的一個或一系列節點上,訂閱者進行資料訂閱,當資料有變化時,可以及時得到資料的變化通知。
-
負載均衡
本質利用了Zookeeper的配置管理。主要步驟如下:
(1)服務提供者把自己的域名和IP埠對映註冊到ZK中。
(2)服務消費者通過域名從zk中獲取對應的IP和埠號,這個IP和埠號有多個,只是獲取其中一個。
(3)當伺服器宕機時,對應的域名和IP會減少一個,並不影響消費者的呼叫。
(阿里的Dubbo服務框架就是基於ZK來來實現服務路由和負載) -
命名服務
在分散式系統中,命名服務(Name Service)也是很重要的應用場景,通過zk也可以實現類似於J2EE中JDNI的效果;分散式環境中,命名服務更多是資源定位,並不是真正的實體資源,其本質也是用到了zk的集中配置管理和查詢。 -
叢集管理
主要可以負責叢集的節點數量,節點的狀態,節點的上下線操作以及統一配置。 -
Master選舉
順序節點和臨時節點(後續會講解如何建立)。 -
分散式鎖
主要包括排它鎖和共享鎖。 -
分散式佇列(FIFO)
基本概念
- 叢集角色:
- Leader:為客戶端提供讀寫服務
- Follower:提供讀服務,所有寫服務都需要轉交給Leader角色,參與選舉
- Observer:提供讀服務,不參與選舉過程,一般是為了增強zk叢集的讀請求與併發能力
-
會話(Session)
ZK客戶端與ZK服務端之間的連線通過心跳檢測保持客戶端之間的存活,客戶端可以接收來自服務端watch事件的通知,可以設定連線之間的超時時間。 -
資料節點(Znode)
ZK中的每個資料節點可以儲存資料,主要分為三類節點。
- 持久節點:一旦建立,除非主動呼叫刪除操作,否則會一直儲存在ZK上
- 臨時節點:與客戶端會話繫結,一旦客戶端會話失效,這個客戶端建立的所有節點都會被移除
- SEQUENTIAL Znode:建立節點時,如果設定屬性為SEQUENTIAL,則會自動在節點名後面追加一個整型數字。
- 版本(Version)
- Version:當前Znode的版本。
- Cversion:當前Znode子節點的版本。
- Aversion:當前Znode的ACL(訪問控制)版本。
- Watcher
- 作用於Znode節點上
- 多種事件通知:資料更新,子節點狀態等。
- ACL(訪問控制列表)
類似於linux的許可權控制。
- CREATE:建立子節點的許可權
- READ:獲取當前節點資料和子節點列表的許可權
- WRITE:更新節點資料的許可權
- DELETE:刪除子節點的許可權
- ADMIN:設定節點ACL的許可權
二、Zookeeper的安裝使用
Zookeeper的安裝非常簡單,下載安裝包解壓即可。
下載地址:http://www.apache.org/dyn/closer.cgi/zookeeper/
啟動指令碼在安裝目錄的bin目錄下,不過啟動之前應該進行相關配置,將安裝目錄下的conf目錄的zoo_sample.cfg例配置檔案,修改為zoo.cfg檔案。主要有以下幾個配置引數需要說明:
- tickTime:預設3000ms,作為一種基本單元,可用它的倍數來表示系統內部的時間間隔配置,比如:
• 2tickTime是客戶端會話的超時時間
• 1tickTime是客戶端Њzk服ԇ器端的心跳時間 - dataDir:無預設配置,必須配置;主要用於配置儲存快照檔案的目錄,如果沒有配置dataLogDir,那麼事務日誌也會儲存在此目錄
- clientPort:zk的執行埠,預設是2181
啟動
ZK的啟動非常簡單,只需執行bin目錄下的zkServer.sh指令碼即可(windows下zkServer.cmd)。然後執行zkCli.sh連線即可,如果不帶引數預設連線localhost下的2181埠。可以使用zkCli.sh -server ip:port連線到指定伺服器地址。
客戶端命令
在啟動zk客戶端之後,可以鍵入help檢視提示命令資訊。
讀取
ls path [watch]
– ls path [watch]
• Path表示指定資料節點的節點路徑
• 列出指定節點下的所有子節點
• 只能檢視第一級的所有子節點
• 剛安裝時 ls / 只有預設的zookeeper保留節點
• Watch表示監聽path的子節點的變化
建立
create [-s] [-e] path data acl
• 建立zookeeper節點
• -s或者-e表示建立的是順序或臨時節點,不加預設建立的是持久節點
• Path為節點的全路徑,沒有相對節點的表示方式
• Data為當前節點記憶體儲的資料
• Acl 用來進行許可權控制,預設情況不做任何許可權控制
讀取
get path [watch]
• 獲取指定節點的資料內容和屬性資訊
• Path表示指定資料節點的節點路徑
• 下圖中
– 123:節點內的資料
– cZxid:為建立該節點的事務id
– Mzxid:最後一次更新該節點的事務id
– Mime:為最後一次更新時間
– Cversion:子節點版本
– dataVersion:資料版本
– aclVersion:訪問控制版本
更新
set path data [version]
• 更新指定節點的資料內容
• Path表示被更新的節點路徑
• data為更新的資料
• Version指定被更新的資料版本,一般不指定,如果資料版本ٝ已經更新,則指定舊版本時會報錯
刪除
delete path [version]
• 刪除指定節點
• Path表示被刪除的節點
• Version指定被刪除的資料版本,一般不指定,如果資料版本ٝ經更新,則指定舊版本時會報錯
後續探究待繼續…
歡迎加入大資料開發群一起學習交流: