ZooKeeper的簡單理解

1 ZooKeeper的一致性特色

概念 描述 備註
順序一致性 以ZXID來保證事務的順序性
原子性 以ZAB保證原子操做,要麼成功,要麼失敗
單一視圖 不管客戶端從哪一個服務器獲取到關於應用的數據都是一致的
可靠 以版原本實現「寫入校驗」,保證數據的寫入正確性
實時 以性能保證明時 .

2 ZK的設計目標

概念 描述 備註
簡單的數據模型 相似於傳統文件系統的「樹」結構,Znode用絕對路徑標識
構建集羣 能夠經過多個ZooKeeper服務器組建集羣,以leader+follower+observer的形式組成,知足「過半存活」便可用,推薦集羣數爲單數三、五、7…
順序訪問 用ZXID的遞增來保證事務的順序性
高性能 讀性能/寫性能 = 10:1 .

3 ZK的系統模型

概念 描述 備註
數據模型
- 核心在於數據節點Znode,Znode可保存數據可掛載子節點
- 節點用路徑標識
- 樹結構
- 事務:每一個可以改變ZK服務器狀態的操做,如Znode的建立和刪除、Znode的數據更新等
- 每一個事務都會分配一個事務ID(ZXID)用於標識
節點特性
- 持久節點:直到被顯示刪除
- 臨時節點:直到會話結束,不能掛載子節點
節點上會存儲znode的信息,如znode的版本信息、znode子節點的版本信息、znode_acl的版本信息、子節點數、節點數據等信息
版本
- version——znode版本信息
- cversion——znode子節點版本信息
- aversion——acl版本信息
版本用於寫入校驗,當節點更新數據時發現版本號已經更改就會拋出異常
Wathcer機制 客戶端向服務器註冊一個監聽器,當所監聽的事件觸發時,服務器會向客戶端發送一個通知 客戶端向ZK服務器註冊Wathcer的同時會將Watcher對象存儲在客戶端的WatchManger中。當ZK觸發Watcher事件後,會向client發通知,client會從WM中對Watcher執行回調

4 ZK的ZAB協議(原子廣播協議)

適用於ZooKeeper上一種支持崩潰恢復的原子廣播協議html

概念 描述 備註
崩潰恢復 1.leader崩潰
2.選舉新的leader(擁有全部服務器中最高編號的ZXID的服務器)
3.進行數據同步,將leader服務器中的事務做爲基準,全部follower中的事務與leader服務器中的事務進行同步
4.拋棄follower中有的而leader中沒有的事務
ZXID組成64位的數字,前32位爲週期(即leader選舉一次+1),後32位爲事務操做次數(每增長一次事務+1)
消息廣播 1.leader接收客戶端請求,判斷請求是否爲事務,如果則將請求轉換爲事務proposal,爲每一個follower創建單獨隊列,進行FIFO
2.follower接收到事務以後將事務寫到本地磁盤後,回覆leader(ack)
3.leader接收follower返回的ack,超過半數的follwer進行ack,那麼leader就會發送提交指令
.

5 ZK的數據存儲

概念 描述 備註
DataTree 用於存儲zk上全部節點信息
DataNode 用於存儲每一個節點路徑、節點數據、acl、版本信息和子節點信息
ZkDatabase 內存數據庫,存儲會話、DataTree和事務日誌,會定時寫數據到本地磁盤
日誌
- 存儲在dataLogDir/version-/log.zxid中
- 格式:會話ID、客戶端ID、ZXID、操做類型、節點路徑和節點內容等
數據快照
- 存儲在dataDir/version-2/snapshot.zxid
- 記錄ZK上某一時刻的全量內存數據內容,並寫到指定的文件中
- 只存儲元數據
.

6 ZK的服務器角色

概念 描述 備註
leader
- 事務請求的惟一調度和處理者,保證集羣事務處理的順序性
- 集羣內各服務器的調度者 leader會與每一個follower和observer創建一個tcp長鏈接,而且爲每一個follower和observer創建一個learnerhandler,進行數據同步,請求轉發和proposal投票等功能
follwer
- 處理客戶端的非事務請求,轉發事務請求給leader
- 參與事務請求Proposal投票
- 參與leader選舉投票
- 判斷當前請求是否爲事務請求,如果則轉發給leader完成事務日誌記錄後,向leader發送ack信息
observer
- 工做原理同follower不參與任何形式的投票,提供非事務服務
.

Propsal投票:每個事務都須要集羣中超過半數的機器投票承認才能被真正地應用到ZK的內存數據庫中。node

7 ZK的搭建要點

注意在配置文件配置dataDir和dataLogDir
配置端口數據庫

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/home/hadoop/data/zookeeper/zkdata
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog
# the port at which the clients will connect
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server.4=slave3:2888:3888
server.5=slave4:2888:3888
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

以及在dataDir中建立myid,在裏面寫上當前機器的id數apache

相關文章
相關標籤/搜索