一 zookeeper簡介
ZooKeeper,簡稱zk,一個分佈式協調服務的開源框架,分佈式小文件存儲系統,主要用來解決分佈式集羣中應用系統的一致性問題,例如怎樣避免同時操作統一數據造成髒讀的問題。
二 特性
- 全局數據一致:無論客戶端連接到哪個服務器查看到的數據都是一致的。
- 可靠性:如果消息被其中一臺服務器接受,那麼將被所有的服務器接受。
- 順序性:包括全局有序和偏序兩種:全局有序是指如果一臺服務器上消息a在消息b前發佈,則在所有server上消息a都將在消息b前被髮布;偏序是指如果一個消息b在消息a後被同一個發佈者發佈,a比排在b前。
- 數據更新原子性:數據更新要麼成功要麼失敗。
- 實時性:zookkeeper保證客戶端將在一個時間間隔範圍內獲得服務器的更新信息,或者服務器失效的信息。
三 集羣角色
Leader
zookeeper集羣工作的核心,事物請求(寫操作)的唯一調度者和處理者,保證集羣事物處理的順序性;集羣內部各個服務器的調度者。create、delete等寫操作請求需要統一轉發給leader處理,leader需要決定編號、執行操作,這個過程稱爲事務。
Follower
處理客戶端非事務(讀操作)請求,轉發事務請求給leader,參與集羣leader選舉投票。
Observer
觀察zookeeper集羣的最新狀態變化並同步,對於非事務請求可以獨立處理,對於事務請求轉發給leader。不參與leader選舉投票,通常用於不影響集羣事物處理能力的前提下提升集羣的非事務處理能力。(無投票功能的follower)
四 zookeeper集羣搭建
通常由2n+1臺機器組成(保證投票結果爲多數)。
運行需要java環境,過程:
- 配置主機名稱到ip地址映射配置
- 修改zookeeper配置文件
- 遠程複製分發安裝文件
- 設置myid
- 啓動zookeeper集羣
安裝jdk後,date查看集羣時間是否同步,date -s
同步集羣時間,chkconfig iptables off
關閉防火牆(保證端口通信),檢測主機ip映射配置,zookeeper安裝包上傳到服務器解壓,修改服務器環境變量,修改zookeeper配置文件(/zookeeper/conf),複製一份zoo_sample.cfg並修改:
配置文件參數說明:
- tickTime是zookeeper服務器之間或客戶端與服務器之間維持心跳的時間間隔,每個時間間隔發送一個信號。
- initLimit配置zookeeper接受客戶端請求最大時長
- syncLimit標識leader與follower之間發送消息,請求和應答時間時間長度,最長不能超過ticktime
- dataDir是zookeeper保存數據的目錄,默認寫數據的日誌文件也保存在這個目錄下
- clientPort這個端口就是客戶端連接zookeeper服務器的端口,zookeeper監聽這個端口接受客戶端的訪問請求。
- server.A=B:C:D中A是編號,表示這個是第幾號服務器,B是服務器的ip地址,C心跳端口(通信),D(選舉端口)(eg:server.1=270.0.0.1:2888:3888 server.2=270.0.0.2:2888:3888)配置服務器集羣
dataDir目錄下創建一個zkdata目錄,新建myid文件,文件保存機器編號(A)。每臺機器都配置。
對應節點配置文件添加peerType=observer
使用Observer模式,配置文件指定哪些節點爲Observerserver.1:localhost:2181:3181:observer
。
../zookeeper/bin/zkServer.sh start
啓動zookeeper。每臺機器都啓動。
../zookeeper/bin/zkServer.sh status
查看zookeeper角色和配置。
../zookeeper/bin/zkServer.sh stop
停止zookeeper。
五 zookeeper數據模型
樹形層次結構,每個節點被稱爲一個Znode
- Znode兼具文件和目錄特點。維護信息同時可以作爲路徑表示一部分。
- Znode具有原子性操作。讀操作將獲取與節點相關的所有數據,寫操作也將替換節點的所有數據。每個節點有自己的ACL(訪問控制列表)規定用戶權限,限定用戶對目標節點的操作。
- Znode存儲數據大小有限制。通常kb大小爲單位,不能存儲大數據。
- Znode通過路徑引用。絕對路徑,必須斜槓字符開頭,唯一。
每個Znode由三部分組成:
- stat:狀態信息,描述Znode版本、權限等信息
- data:該node關聯數據
- children:該node子節點
Znode分爲臨時節點和永久節點:
- 臨時節點:生命週期依賴於會話,會話結束,臨時節點將被自動刪除,不允許擁有子節點。
- 永久節點:不依賴於會話,客戶端執行刪除操作時才刪除。
- 序列化特性,Znode名字後自動追加一個遞增的序列號,記錄子節點創建的先後順序。
四種類型節點:
- PERSISTENT:永久節點
- EPHEMERAL:臨時節點
- PERSISTENT_SEQUENTIAL:永久節點、序列化
- EPHEMERAL_SEQUENTIAL:臨時節點、序列化
get {節點路徑}
查看節點屬性:
dataVersion:數據版本號,每次對節點進行set操作,dataVersion值加一,可有效避免數據更新時出現的先後順序問題
version:子節點版本號。 Znode子節點變化時,cversion值加一,看子節點變化頻率。
aclVersion:ACL版本號
cZxid:Znode創建的事務id。事務的序號。
mZxid:Znode被修改的事務id。
ctime:節點創建時的時間戳。
mtime:節點最新一次更新發生的時間戳。
ephemeralOwner:如果該節點是臨時節點,該值表示與該節點綁定的session id,如果不是則爲0。
客戶端和服務器通過session連接,如果發生連接超時、授權失敗或顯式關閉連接,連接便處於CLOSED狀態,此時session結束。