1 ZooKeeper的一致性特點(diǎn)
概念 | 描述 | 備注 |
---|---|---|
順序一致性 | 以ZXID來保證事務(wù)的順序性 | |
原子性 | 以ZAB保證原子操作队橙,要么成功,要么失敗 | |
單一視圖 | 無論客戶端從哪個(gè)服務(wù)器獲取到關(guān)于應(yīng)用的數(shù)據(jù)都是一致的 | |
可靠 | 以版本來實(shí)現(xiàn)“寫入校驗(yàn)”,保證數(shù)據(jù)的寫入正確性 | |
實(shí)時(shí) | 以性能保證實(shí)時(shí) | . |
2 ZK的設(shè)計(jì)目標(biāo)
概念 | 描述 | 備注 |
---|---|---|
簡(jiǎn)單的數(shù)據(jù)模型 | 類似于傳統(tǒng)文件系統(tǒng)的“樹”結(jié)構(gòu)贬芥,Znode用絕對(duì)路徑標(biāo)識(shí) | |
構(gòu)建集群 | 可以通過多個(gè)ZooKeeper服務(wù)器組建集群,以leader+follower+observer的形式組成蜀备,滿足“過半存活”即可用删咱,推薦集群數(shù)為單數(shù)3、5奶赔、7… | |
順序訪問 | 用ZXID的遞增來保證事務(wù)的順序性 | |
高性能 | 讀性能/寫性能 = 10:1 | . |
3 ZK的系統(tǒng)模型
概念 | 描述 | 備注 |
---|---|---|
數(shù)據(jù)模型 |
- 核心在于數(shù)據(jù)節(jié)點(diǎn)Znode惋嚎,Znode可保存數(shù)據(jù)可掛載子節(jié)點(diǎn) - 節(jié)點(diǎn)用路徑標(biāo)識(shí) - 樹結(jié)構(gòu) - 事務(wù):每個(gè)能夠改變ZK服務(wù)器狀態(tài)的操作,如Znode的創(chuàng)建和刪除站刑、Znode的數(shù)據(jù)更新等 - 每個(gè)事務(wù)都會(huì)分配一個(gè)事務(wù)ID(ZXID)用于標(biāo)識(shí) |
|
節(jié)點(diǎn)特性 |
- 持久節(jié)點(diǎn):直到被顯示刪除 - 臨時(shí)節(jié)點(diǎn):直到會(huì)話結(jié)束另伍,不能掛載子節(jié)點(diǎn) |
節(jié)點(diǎn)上會(huì)存儲(chǔ)znode的信息,如znode的版本信息绞旅、znode子節(jié)點(diǎn)的版本信息摆尝、znode_acl的版本信息、子節(jié)點(diǎn)數(shù)因悲、節(jié)點(diǎn)數(shù)據(jù)等信息 |
版本 |
- version——znode版本信息 - cversion——znode子節(jié)點(diǎn)版本信息 - aversion——acl版本信息 |
版本用于寫入校驗(yàn)堕汞,當(dāng)節(jié)點(diǎn)更新數(shù)據(jù)時(shí)發(fā)現(xiàn)版本號(hào)已經(jīng)更改就會(huì)拋出異常 |
Wathcer機(jī)制 | 客戶端向服務(wù)器注冊(cè)一個(gè)監(jiān)聽器,當(dāng)所監(jiān)聽的事件觸發(fā)時(shí)囤捻,服務(wù)器會(huì)向客戶端發(fā)送一個(gè)通知 | 客戶端向ZK服務(wù)器注冊(cè)Wathcer的同時(shí)會(huì)將Watcher對(duì)象存儲(chǔ)在客戶端的WatchManger中臼朗。當(dāng)ZK觸發(fā)Watcher事件后邻寿,會(huì)向client發(fā)通知,client會(huì)從WM中對(duì)Watcher執(zhí)行回調(diào) |
4 ZK的ZAB協(xié)議(原子廣播協(xié)議)
適用于ZooKeeper上一種支持崩潰恢復(fù)的原子廣播協(xié)議
概念 | 描述 | 備注 |
---|---|---|
崩潰恢復(fù) | 1.leader崩潰 2.選舉新的leader(擁有所有服務(wù)器中最高編號(hào)的ZXID的服務(wù)器) 3.進(jìn)行數(shù)據(jù)同步视哑,將leader服務(wù)器中的事務(wù)作為基準(zhǔn)绣否,所有follower中的事務(wù)與leader服務(wù)器中的事務(wù)進(jìn)行同步 4.拋棄follower中有的而leader中沒有的事務(wù) |
ZXID組成64位的數(shù)字,前32位為周期(即leader選舉一次+1)挡毅,后32位為事務(wù)操作次數(shù)(每增加一次事務(wù)+1) |
消息廣播 | 1.leader接收客戶端請(qǐng)求蒜撮,判斷請(qǐng)求是否為事務(wù),若是則將請(qǐng)求轉(zhuǎn)換為事務(wù)proposal跪呈,為每個(gè)follower建立單獨(dú)隊(duì)列段磨,進(jìn)行FIFO 2.follower接收到事務(wù)之后將事務(wù)寫到本地磁盤后,回復(fù)leader(ack) 3.leader接收follower返回的ack耗绿,超過半數(shù)的follwer進(jìn)行ack苹支,那么leader就會(huì)發(fā)送提交指令 |
. |
5 ZK的數(shù)據(jù)存儲(chǔ)
概念 | 描述 | 備注 |
---|---|---|
DataTree | 用于存儲(chǔ)zk上所有節(jié)點(diǎn)信息 | |
DataNode | 用于存儲(chǔ)每個(gè)節(jié)點(diǎn)路徑、節(jié)點(diǎn)數(shù)據(jù)误阻、acl债蜜、版本信息和子節(jié)點(diǎn)信息 | |
ZkDatabase | 內(nèi)存數(shù)據(jù)庫(kù),存儲(chǔ)會(huì)話究反、DataTree和事務(wù)日志寻定,會(huì)定時(shí)寫數(shù)據(jù)到本地磁盤 | |
日志 |
- 存儲(chǔ)在dataLogDir/version-/log.zxid中 - 格式:會(huì)話ID、客戶端ID精耐、ZXID狼速、操作類型、節(jié)點(diǎn)路徑和節(jié)點(diǎn)內(nèi)容等 |
|
數(shù)據(jù)快照 |
- 存儲(chǔ)在dataDir/version-2/snapshot.zxid - 記錄ZK上某一時(shí)刻的全量?jī)?nèi)存數(shù)據(jù)內(nèi)容卦停,并寫到指定的文件中 - 只存儲(chǔ)元數(shù)據(jù) |
. |
6 ZK的服務(wù)器角色
概念 | 描述 | 備注 |
---|---|---|
leader |
- 事務(wù)請(qǐng)求的唯一調(diào)度和處理者向胡,保證集群事務(wù)處理的順序性 - 集群內(nèi)各服務(wù)器的調(diào)度者 leader會(huì)與每個(gè)follower和observer建立一個(gè)tcp長(zhǎng)連接,并且為每個(gè)follower和observer建立一個(gè)learnerhandler惊完,進(jìn)行數(shù)據(jù)同步捷枯,請(qǐng)求轉(zhuǎn)發(fā)和proposal投票等功能 |
|
follwer |
- 處理客戶端的非事務(wù)請(qǐng)求,轉(zhuǎn)發(fā)事務(wù)請(qǐng)求給leader - 參與事務(wù)請(qǐng)求Proposal投票 - 參與leader選舉投票 - 判斷當(dāng)前請(qǐng)求是否為事務(wù)請(qǐng)求专执,若是則轉(zhuǎn)發(fā)給leader?完成事務(wù)日志記錄后,向leader發(fā)送ack信息 |
|
observer |
- 工作原理同follower?不參與任何形式的投票郁油,提供非事務(wù)服務(wù) |
. |
Propsal投票:每一個(gè)事務(wù)都需要集群中超過半數(shù)的機(jī)器投票認(rèn)可才能被真正地應(yīng)用到ZK的內(nèi)存數(shù)據(jù)庫(kù)中本股。
7 ZK的搭建要點(diǎn)
注意在配置文件配置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中創(chuàng)建myid,在里面寫上當(dāng)前機(jī)器的id數(shù)