Zookeeper-3.7.0 學(xué)習(xí)看這篇就夠了

zookeeper 簡介

Zookeeper是源代碼開放的分布式協(xié)調(diào)服務(wù),是一個(gè)高性能的分布式數(shù)據(jù)一致性的解決方案,它將那些復(fù)雜的,容易出錯(cuò)的分布式一致性服務(wù)封裝起來。用戶可以通過調(diào)用Zookeeper提供的接口來解決一些分布式應(yīng)用中的實(shí)際問題。

zookeeper 特性

數(shù)據(jù)一致性

client 不論連接到那個(gè)Zookeeper,展示都是同一個(gè)試圖,即查詢的數(shù)據(jù)都是一樣得。這是zookeeper的重要特性。

原子性

要么都更新成功,要么都不更新。即 要么整個(gè)集群中所有機(jī)器的成功更新某一個(gè)事務(wù),要么都不更新。

持久性

一旦zk服務(wù)端成功的更新一個(gè)事務(wù),并完成對客戶端的響應(yīng),那么該事務(wù)所引起的服務(wù)端的狀態(tài)變更將會一直保留下來,除非有另一個(gè)事務(wù)又對其進(jìn)行了改變。

實(shí)時(shí)性

Zookeeper保證客戶端將在非常短的時(shí)間間隔范圍內(nèi)獲得服務(wù)器的更新信息。前提條件是,網(wǎng)絡(luò)狀態(tài)良好。

順序性

如果在一臺服務(wù)器上消息a在消息b前發(fā)布,則所有Server上消息a都在消息b前被發(fā)布。底層是通過遞增的事務(wù)id(zxid)來實(shí)現(xiàn)的。

過半性

zookeeper 集群必須有半數(shù)以上的機(jī)器存活才能正常工作。因?yàn)橹挥袧M足過半數(shù),才能滿足選舉機(jī)制選出Leader。也只有過半,在做事務(wù)決議,事務(wù)才能更新。所以一般說zookeeper集群最好是奇數(shù)。

zookeeper 特點(diǎn)

zookeeper 結(jié)構(gòu)類似于目錄結(jié)構(gòu),會有一個(gè)根節(jié)點(diǎn) / ,每個(gè)節(jié)點(diǎn)叫 znode 節(jié)點(diǎn),每個(gè)znode節(jié)點(diǎn)都可以擁有自己的節(jié)點(diǎn)

zookpeer的所有操縱,都是基于節(jié)點(diǎn)路徑來操作的,每個(gè)znode節(jié)點(diǎn)可以存儲數(shù)據(jù)且名字唯一,多個(gè)znode節(jié)點(diǎn)形成一個(gè)znode樹。

znode樹是維系在內(nèi)存中,即znode節(jié)點(diǎn)的數(shù)據(jù)也是存在內(nèi)存中的,目的是用戶快速查詢。

Zookepper的使用場景是做分布式協(xié)調(diào),多臺ZK節(jié)點(diǎn)存儲的數(shù)據(jù)是相同的

Zookpper 提供了持久化操作,在 /conf/zoo_sample.cfg 文件中由 dataDir 來決定存儲路徑

Zookpper 會為每個(gè)事務(wù)分配一個(gè)全局遞增事務(wù)ID。cZxid(創(chuàng)建節(jié)點(diǎn)的事務(wù)ID)、mZxid(修改節(jié)點(diǎn)的事務(wù)ID)、pZxid(此節(jié)點(diǎn)的子節(jié)點(diǎn)最新的事務(wù)ID)

安裝

單機(jī)

下載

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz

解壓

tar -xvf apache-zookeeper-3.7.0.tar.gz
mv apache-zookeeper-3.7.0  zookeeper-3.7.0

啟動

cd /opt/software/zookeeper-3.7.0/conf
cp zoo_sample.cfg zoo.cfg
cd /opt/software/zookeeper-3.7.0/bin
./zkServer.sh start

查看啟動成功或進(jìn)程

jps

啟動后回在 bin 目錄下生成 zookeeper.out 文件,用于查看報(bào)錯(cuò)信息。

集群

zookeeper的集群相對簡單,修改方式如下:

  1. 修改 zoo.cfg
server.1=本機(jī)ip:2888:3888
server.2=其他IP1:2888:3888
server.3=其他IP2:2888:3888

1,2,3為zookeeper的集群id,2888原子廣播端口,3888選舉端口。

  1. 在 zookeeper 目錄下創(chuàng)建 tmp/myid,寫下ID號
1
  1. 把 zookeeper 發(fā)送給其他服務(wù)器
scp -r /opt/software/zookeeper-3.7.0 root@其他IP:/opt/software/
  1. 修改其他服務(wù)機(jī)的 tmp/myid,myid一定是隨著 zoo.cfg配置的修改,如其他服務(wù)機(jī)的IP為 其他IP2,那么他所對因的myid就為以上配置文件3的值。

  2. 查看是否啟動成功 jps

2498 ProdServerStart
  1. 啟動成功在 bin/ 下查看狀態(tài)
./zkServer.sh status
zookeeper選舉機(jī)制

一階段:數(shù)據(jù)恢復(fù)階段。每臺ZK服務(wù)器啟動時(shí),會從本地?cái)?shù)據(jù)目錄中,找到自己所擁有的最大(最新)的事務(wù)ID(Zxid)。

二階段:每臺zk服務(wù)器都會提交自己所持有的有效數(shù)據(jù)進(jìn)行選舉,推薦自己當(dāng) Leader,選舉數(shù)據(jù)內(nèi)容包含如下:

  • 自己的最大事務(wù)ID(Zxid)
  • 自己的選舉ID(myid)
  • 邏輯的鐘值,確保每臺ZK服務(wù)器在同一輪選擇中
  • 當(dāng)前ZK的狀態(tài):Looking(處于選舉狀態(tài))、Follower(處于追隨者狀態(tài))、Leader(處于領(lǐng)導(dǎo)者狀態(tài))、Observer(處于觀察者狀態(tài))

三階段:先比較Zxid,誰大誰當(dāng)Leader,Zxid越大,數(shù)據(jù)越新。如果Zxid比較不出來,就比較選舉myid,誰大誰Leader。PK的原則是要滿足過半性,即:1. 選舉時(shí)要滿足過半同意 2. ZK服務(wù)器要滿足過半存活。所以搭建集群建議為 奇數(shù)。

zookeeper集群讀寫

zookeeper 的讀可以從任意節(jié)點(diǎn)上去讀,但是寫的話,必須發(fā)給 Leader,由Leader 去發(fā)送給所有子節(jié)點(diǎn),寫 就使用的是 原子廣播性。

如果寫的操作發(fā)動給 子節(jié)點(diǎn),則子節(jié)點(diǎn)會轉(zhuǎn)發(fā)給Leader,由Leader做原子廣播。

zookeeper集群腦裂

當(dāng)一個(gè)集群出現(xiàn)兩個(gè)Leader 這種現(xiàn)象稱為腦裂,腦裂的危害會使得數(shù)據(jù)同步過程紊亂。

zookeeper 解決腦裂的機(jī)制是選出一個(gè)Leader,會為每個(gè)Leader分配一個(gè)Epoch ID。并且Epoch ID是遞增的。所以子節(jié)點(diǎn)可以根據(jù)Epoch ID數(shù)字號,來選擇接受最大的Epooch ID的最新數(shù)據(jù)。

Zxid是由兩部分組成,高32位是EpochID,低32位是事務(wù)ID。每次新選一個(gè)Leader EpochID 會自增,事務(wù)ID會從新開始計(jì)量。

Observer

zookeeper 的選舉模式,決定了zookeeper不能有太多的節(jié)點(diǎn),節(jié)點(diǎn)越多性能越差,所以zookeeper引入了 Observer 觀察者。

觀察者不參與投票,他只監(jiān)聽投票的結(jié)果,但客戶端可以連接他們并進(jìn)行讀寫操作,這些操作都會被轉(zhuǎn)發(fā)到Leader,所以我們盡可能的可以多加Observer節(jié)點(diǎn)。

observer 的配置如下:

peerType=observer
server.1=IP1:2888:3888
server.2=IP2:2888:3888
server.3=IP3:2888:3888:observer

修改完observer,其他服務(wù)器的 zoo.cfg 都要改成

server.1=IP1:2888:3888
server.2=IP2:2888:3888
server.3=IP3:2888:3888:observer

zookeeper常用配置

# 客戶端連接端口
clientPort=2181
# 存儲快照文件snapshot的目錄,默認(rèn)情況下,事務(wù)日志也存在這里
dataDir=/home/tmp/datadir
# 事務(wù)輸出日志目錄
dataLogDir= /home/datalog
# ZK 中所有時(shí)間都是以這個(gè)時(shí)間單元為基礎(chǔ)進(jìn)行整數(shù)倍數(shù)配置的
# 如 tickTime=2000,則下限 2*tickTime=4000,上限 20*tickTime=40000
# 就是 API在連接 ZK時(shí),如果設(shè)置3000,小于ZK下限 2*tickTime,則取4000為數(shù)
tickTime=2000
# Follower(子) 啟動過程中,會從Leader同步所有數(shù)據(jù),然后確定自己能夠?qū)ν夥?wù)的起始狀態(tài)。
# Leader 允許 Follower在 initLimit 時(shí)間內(nèi)完成這個(gè)工作。通常不關(guān)心這個(gè)參數(shù)設(shè)置。
# 只有ZK集群數(shù)據(jù)確實(shí)很大,F(xiàn)ollower在啟動時(shí)候,
# 從Leader上同步數(shù)據(jù)時(shí)間邊長,則適當(dāng)調(diào)大這個(gè)參數(shù)。該參數(shù)默認(rèn):10*tickTime
initLimit=10
# Leader 與 Follower 之間發(fā)送消息,請求和應(yīng)答時(shí)間長度。
# 如果 Follower 在設(shè)置時(shí)間內(nèi)不能與Leader 進(jìn)行通信,那么Follower將被丟棄
# 默認(rèn)時(shí):5*tickTime
syncLimit=5
# session超時(shí)時(shí)間限制,如果客戶端設(shè)置的時(shí)間不在這個(gè)范圍,那么會強(qiáng)制設(shè)置為最大或最小時(shí)間。
# 默認(rèn)的session超時(shí)時(shí)間是在 2*tickTime~2=*tickTime 這個(gè)范圍
# minSessionTimeout=4000
# maxSessionTimeout=40000
# 每進(jìn)行 snapCount次事務(wù)日志輸出后,觸發(fā)一次快照(snapshot),此時(shí),ZK會生成一個(gè) snapshot.* 文件,
# 同時(shí)創(chuàng)建一個(gè)新得事務(wù)日志文件log.*。默認(rèn)是 100000
# 此外,在產(chǎn)生心Leader時(shí),也會生成新的快照文件,同時(shí)會生成對應(yīng)的事務(wù)文件
snapCount=100000
# 3.4.0及之后版本,ZK 提供了自動清理事務(wù)日志和快照文件的功能,
# 這個(gè)參數(shù)指定了清理頻率,單位是小時(shí),需要配置一個(gè)1或更大的整數(shù),0為不開啟自動清理功能。
# purgeInterval 小時(shí)清理,snapRetainCount 保留多少個(gè)文件不被清理
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
# 控制每個(gè)znode節(jié)點(diǎn)都可以存儲數(shù)據(jù)的大小,每個(gè)節(jié)點(diǎn)最大數(shù)據(jù)量。默認(rèn)是1M 
jute.maxbuffer=1M
# 最大請求堆積數(shù),默認(rèn)是1000。ZK運(yùn)行的時(shí)候,盡管server已經(jīng)沒有空閑來處理更多的客戶端的請求了,
# 但是還是允許客戶端請求提交到服務(wù)器上來,以提高吞吐性能。
# 當(dāng)然,為了防止Server內(nèi)存溢出,這個(gè)請求堆積數(shù)還是需要限制的。
globalOutstandingLimit=1000
# 預(yù)先開辟的磁盤空間,用于后續(xù)讀寫入事務(wù)日志。默認(rèn)是64M,每個(gè)事務(wù)日志大小就是64M
preAllocSize=64M
# 默認(rèn)為3,即基于TCP fast paxos election 選舉算法。
# ZK 的ZAK寫一是類似2PC算法,ZAB算法改進(jìn)的原型算法是Paxos算法。
# 3.4版本后,1和2對應(yīng)的選舉算法都是UDP,已棄用,所以不需要改該配置。
electionAlg=3
# 默認(rèn)情況下,Leader 是會接收客戶端鏈接,并提供讀寫服務(wù)。
# 但是,如果你想Leader專注于集群中機(jī)器的協(xié)調(diào),那么可以將這個(gè)參數(shù)設(shè)置為no,
# 這樣一來,會提高整個(gè)ZK集群性能。 
LeaderServers=no
# 控制每臺ZK服務(wù)器能處理的客戶端并發(fā)請求數(shù)。
maxClientCnxns=60

zookeeper 常用命令

# 查看當(dāng)前znode中包含的內(nèi)容
ls /

# 查看當(dāng)前節(jié)點(diǎn)的詳細(xì)數(shù)據(jù)
ls2 /

# 創(chuàng)建兩個(gè)普通節(jié)點(diǎn)
create /sanguo "jinlian"
create /sanguo/shuguo "liubei"

# 獲取節(jié)點(diǎn)的值
get /sanguo
get /sanguo/shuguo

# 創(chuàng)建短暫性節(jié)點(diǎn)
create -e /sanguo/wuguo "zhouyu"

# 退出當(dāng)前客戶端然后再重啟客戶端
quit

# 創(chuàng)建帶序號的節(jié)點(diǎn)
create -s /sanguo/weiguo "caocao"

# 修改節(jié)點(diǎn)的數(shù)據(jù)值
set /sanguo/weiguo "caozhi"

# 刪除節(jié)點(diǎn)
delete ./sanguo/jin

#遞歸刪除節(jié)點(diǎn)
rmr /sanguo/weiguo

# 注冊監(jiān)聽/sanguo節(jié)點(diǎn)的子節(jié)點(diǎn)變化,若路徑有變化會通知
ls /sanguo watch

# 節(jié)點(diǎn)值變化的監(jiān)聽
get /sanguo watch

# 查看節(jié)點(diǎn)狀態(tài)
stat /sanguo
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容