一文运维zookeeper
文章目錄
- 1. zookeeper生產(chǎn)環(huán)境的安裝配置
- 1.1 軟件配置
- 1.2 硬件配置
- 1.3 日志配置文件
- 1.4 配置三節(jié)點(diǎn)的zookeeper集群
- 2. zookeeper的監(jiān)控方法
- 2.1 four letters命令
- 2.2 JMX 監(jiān)控方式
- 3. 通過zookeeper observer實(shí)現(xiàn)跨地域部署
- 3.1 什么是observer
- 3.2 observer 提升 寫性能
- 3.3 observer 實(shí)現(xiàn)跨數(shù)據(jù)中心部署
- 4. zookeeper 不中斷服務(wù)的集群成員變更方法
- 5. zookeeper數(shù)據(jù)存儲(chǔ)文件:事務(wù)文件和快照文件
- 6. 總結(jié)
關(guān)于分布式協(xié)調(diào)服務(wù)zookeeper,之前已經(jīng)對(duì)整個(gè)框架以及基礎(chǔ)使用場景和環(huán)境配置做個(gè)一個(gè)總體的介紹
一文入門zookeeper。
ps: 以下實(shí)驗(yàn)是在mac上進(jìn)行的,有一些mac特有的配置會(huì)特別說明
本文中使用的zookeeper版本是3.5.8
本節(jié)將簡單介紹zookeeper的基本運(yùn)維操作,主要包括:
- zookeeper 生產(chǎn)環(huán)境的安裝配置
- zookeeper 的監(jiān)控方法
- 通過zookeeper observer 實(shí)現(xiàn)跨地域部署
- 通過動(dòng)態(tài)配置實(shí)現(xiàn)不中斷服務(wù)的集群成員變更
- 如何查看zookeeper的數(shù)據(jù)存儲(chǔ)文件:事務(wù)文件和快照文件
通過熟悉以上運(yùn)維操作,能夠更進(jìn)一步的了解整個(gè)zookeeper的架構(gòu)和實(shí)現(xiàn)方式,從而更好得使用它。
1. zookeeper生產(chǎn)環(huán)境的安裝配置
1.1 軟件配置
ZooKeeper 的配置項(xiàng)在 zoo.cfg 配置文件中配置, 另外有些配置項(xiàng)可以通過 Java 系統(tǒng)屬性來 進(jìn)行配置。
- clientPort : ZooKeeper 和客戶端通信的端口號(hào)。
- dataDir :來保存快照文件的目錄。如果沒有設(shè)置 dataLogDir ,事務(wù)日志文件也會(huì)保存到這
個(gè)目錄。 - dataLogDir :用來保存事務(wù)日志文件的目錄。因?yàn)?ZooKeeper 在提交一個(gè)事務(wù)之前,需要保 證事務(wù)日志記錄的落盤,所以需要為 dataLogDir 分配一個(gè)獨(dú)占的存儲(chǔ)設(shè)備。
基本配置文件內(nèi)容如下,這里是在mac本地進(jìn)行演示,并沒有增加dataLogDir,默認(rèn)會(huì)和dataDir在一個(gè)目錄,如果有足夠的測試服務(wù)器可以為該配置分配獨(dú)立的目錄:
# 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=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
1.2 硬件配置
建議為zookeeper分配獨(dú)立的服務(wù)器,同時(shí)要給zookeeper的事務(wù)日志(dataLogDir)分配獨(dú)立的存儲(chǔ)設(shè)備或者分區(qū)
- 內(nèi)存:ZooKeeper 需要在內(nèi)存中保存 data tree 。對(duì)于一般的 ZooKeeper 應(yīng)用場景,8G 的內(nèi)存足夠了。
- CPU:ZooKeeper 對(duì) CPU 的消耗不高,只要保證 ZooKeeper 能夠有一個(gè)獨(dú)占的 CPU 核 即可
- 存儲(chǔ):因?yàn)榇鎯?chǔ)設(shè)備的寫延遲會(huì)直接影響事務(wù)提交的效率,建議為 dataLogDir 分配一個(gè)獨(dú)占的 SSD 盤
1.3 日志配置文件
日志配置文件默認(rèn)在 conf/log4j
基本配置內(nèi)容如下:
# 日志級(jí)別
zookeeper.root.logger=INFO, CONSOLE
# 對(duì)于appender來說,也是Info 或者比info 級(jí)別更嚴(yán)重的log會(huì)被打出來
zookeeper.console.threshold=INFOzookeeper.log.dir=.
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=INFO
zookeeper.log.maxfilesize=256MB
zookeeper.log.maxbackupindex=20zookeeper.tracelog.dir=${zookeeper.log.dir}
zookeeper.tracelog.file=zookeeper_trace.loglog4j.rootLogger=${zookeeper.root.logger}#
# console
# Add "console" to rootlogger above if you want to use this
#
# console appender 的實(shí)現(xiàn)類
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
# console 日志輸出的格式
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
# 指定詳細(xì)的日志格式
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n#
# Add ROLLINGFILE to rootLogger to get log file output
#
# 一般會(huì)使用appender.ROLLINGFILE作為日志追加方式
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
log4j.appender.ROLLINGFILE.MaxFileSize=${zookeeper.log.maxfilesize}
log4j.appender.ROLLINGFILE.MaxBackupIndex=${zookeeper.log.maxbackupindex}
log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n
1.4 配置三節(jié)點(diǎn)的zookeeper集群
在服務(wù)器充足的情況下,每一個(gè)服務(wù)區(qū)基本的配置步驟如下:
- 申請(qǐng) ZooKeeper 節(jié)點(diǎn)服務(wù)器。每個(gè) ZooKeeper 節(jié)點(diǎn)有兩個(gè)掛載盤。
- 每個(gè)節(jié)點(diǎn)安裝 JDK 8 。
- 在每個(gè)節(jié)點(diǎn)為 dataDir 初始化一個(gè)獨(dú)立的文件系統(tǒng) /data ,編輯 myid,表示server的編號(hào)(每個(gè) server代表一個(gè)數(shù)字,可以echo 1 > /data/myid 即可) 。
- 各個(gè)節(jié)點(diǎn)之間配置基于 public key 的 SSH 登錄。
- 在一個(gè)節(jié)點(diǎn)上下載解壓 apache-zookeeper-3.5.5-bin.tar.gz ,配置 zoo.cfg 。使用 rsync 把解壓的目錄同步到其他節(jié)點(diǎn)。
到此即完成基本的環(huán)境配置,我們只需要使用zookeeper提供的cli命令進(jìn)行運(yùn)維層面的配置即可。
因?yàn)槲抑挥幸粋€(gè)mac機(jī)器,那只能在一個(gè)mac機(jī)器中啟動(dòng)三個(gè)server進(jìn)程來模擬zookeeper的集群,這里不需要執(zhí)行第四步了,對(duì)應(yīng)的第三步通過指定不同的配置目錄即可。
模擬的三個(gè)節(jié)點(diǎn)的配置如下:
需要注意的是其中的server.配置,127.0.0.1表示節(jié)點(diǎn)ip或者主機(jī)(hostname)名稱,7777表示后續(xù)zookeeper 集群的qurom通信端口號(hào),7778表示leader選舉的端口號(hào)。
同時(shí)需要打開選項(xiàng)4lw.commands.whitelist=*表示開啟zookeeper提供的四字母監(jiān)控命令的白名單。
- zoo-node1.cfg
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zookeeper1 clientPort=2181 server.1=127.0.0.1:7777:7778 server.2=127.0.0.1:6666:6667 server.3=127.0.0.1:5555:5556 4lw.commands.whitelist=* #開啟監(jiān)控命令的白名單,否則后續(xù)的監(jiān)控命令無法使用 - zoo-node2.cfg
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zookeeper2 clientPort=2181 server.1=127.0.0.1:7777:7778 server.2=127.0.0.1:6666:6667 server.3=127.0.0.1:5555:5556 4lw.commands.whitelist=* - zoo-node3.cfg
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zookeeper3 # 如果使用服務(wù)器可以指定相同的目錄 clientPort=2181 server.1=127.0.0.1:7777:7778 server.2=127.0.0.1:6666:6667 server.3=127.0.0.1:5555:5556 4lw.commands.whitelist=*
啟動(dòng)zookeeper集群:
zkServer.h start conf/zoo-node1.cfg
zkServer.h start conf/zoo-node2.cfg
zkServer.h start conf/zoo-node3.cfg
啟動(dòng)成功之后,檢查集群狀態(tài)是否有異常
echo srvr | nc localhost 2181, nc是ncat命令的縮寫是一個(gè)網(wǎng)絡(luò)工具,mac上可以通過brew install nmap安裝,安裝完成需要將/usr/local/Cellar目錄導(dǎo)入$PATH,否則無法直接使用命令。
└> echo srvr | nc localhost 2181
Zookeeper version: 3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 11/15/2020 03:27 GMT
Latency min/avg/max: 0/0/0
Received: 7
Sent: 6
Connections: 1
Outstanding: 0
Zxid: 0x100000006
Mode: follower
Node count: 5
如果執(zhí)行以上命令出現(xiàn)
srvr is not executed because it is not in the whitelist.問題,則需要修改cfg配置,加入4lw.commands.whitelist=* 配置,打開四個(gè)字母的白名單。記得修改完配置重啟zkServer.sh ,配置才能生效。
2. zookeeper的監(jiān)控方法
zookeeper 雖然僅僅提供分布式的協(xié)調(diào)服務(wù),但是仍然有自己的監(jiān)控系統(tǒng)(一組監(jiān)控命令),來讓自己的運(yùn)維系統(tǒng)更加完善。
接下來主要描述兩種zookeeper原生支持的監(jiān)控方式,第一種是four letters命令;第二種是JMX方式,這種方式后面的演示在mac上會(huì)更方便一點(diǎn)。
2.1 four letters命令
其中four letters 命令由四個(gè)字母組成,可以通過 telnet 或 ncat 使用客戶端端口向 ZooKeeper 發(fā)出命令。
- ruok , 向zookeeper 集群的一個(gè)節(jié)點(diǎn)詢問are you ok?
echo ruok | nc localhost 2181,向指定節(jié)點(diǎn)的client通信端口發(fā)送信息
如果回復(fù)imok%,則該節(jié)點(diǎn)正常,否則返回失敗。這個(gè)狀態(tài)并不是代表集群狀態(tài),僅僅是集群的某一個(gè)節(jié)點(diǎn)狀態(tài)。
- conf , 查看節(jié)點(diǎn)配置項(xiàng)
echo conf | nc localhost 2181,輸出如下clientPort=2181 secureClientPort=-1 dataDir=/tmp/zookeeper1/version-2 dataDirSize=67109438 dataLogDir=/tmp/zookeeper1/version-2 dataLogSize=67109438 tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 serverId=1 initLimit=10 syncLimit=5 electionAlg=3 electionPort=7778 quorumPort=7777 peerType=0 membership: server.1=127.0.0.1:7777:7778:participant server.2=127.0.0.1:6666:6667:participant server.3=127.0.0.1:5555:5556:participant - stat, 返回當(dāng)前server節(jié)點(diǎn)和客戶端鏈接信息
echo stat | nc localhost 2181Zookeeper version: 3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 11/15/2020 03:27 GMT Clients:/127.0.0.1:53629[0](queued=0,recved=1,sent=0)Latency min/avg/max: 0/0/0 Received: 3 Sent: 2 Connections: 1 Outstanding: 0 Zxid: 0x100000006 Mode: follower Node count: 5 - dump, 查看zookeeper 中臨時(shí)節(jié)點(diǎn)的信息
echo dump | nc localhost 2181SessionTracker dump: Global Sessions(1): 0x100077484570000 30000ms ephemeral nodes dump: Sessions with Ephemerals (1): 0x100077484570000:/worker Connections dump: Connections Sets (3)/(2): 0 expire at Sat Dec 12 12:43:33 CST 2020: 1 expire at Sat Dec 12 12:43:43 CST 2020:ip: /127.0.0.1:54091 sessionId: 0x0 1 expire at Sat Dec 12 12:43:53 CST 2020:ip: /127.0.0.1:54021 sessionId: 0x100077484570000 - wchc, 查看 watch狀態(tài)信息
└> echo wchc | nc localhost 2181 0x100077484570000/worker
更多的四字命令如下:
conf: 打印ZooKeeper的配置信息
cons: 列出所有的客戶端會(huì)話鏈接
crst: 重置所有的客戶端連接
dump: 打印集群的所有會(huì)話信息,包括ID,以及臨時(shí)節(jié)點(diǎn)等信息。用在Leader節(jié)點(diǎn)上才有效果。
envi: 列出所有的環(huán)境參數(shù)
ruok: "諧音為Are you ok"。檢查當(dāng)前服務(wù)器是否正在運(yùn)行。
stat: 獲取ZooKeeper服務(wù)器運(yùn)行時(shí)的狀態(tài)信息,包括版本,運(yùn)行時(shí)角色,集群節(jié)點(diǎn)個(gè)數(shù)等信息。
srst: 重置服務(wù)器統(tǒng)計(jì)信息
srvr: 和stat輸出信息一樣,只不過少了客戶端連接信息。
wchs: 輸出當(dāng)前服務(wù)器上管理的Watcher概要信息
wchc: 輸出當(dāng)前服務(wù)器上管理的Watcher的詳細(xì)信息,以session為單位進(jìn)行歸組
wchp: 和wchc非常相似,但是以節(jié)點(diǎn)路徑進(jìn)行歸組
mntr: 輸出比stat更為詳細(xì)的服務(wù)器統(tǒng)計(jì)信息
2.2 JMX 監(jiān)控方式
接下來說一下JMX,ZooKeeper 很好的支持了 JMX ,大量的監(jiān)控和管理工作多可以通過 JMX 來做。
而且能夠?qū)ookeeper的JMX數(shù)據(jù)集成到Prometheus,利用其來進(jìn)行zookeeper的監(jiān)控。
安裝了JDK環(huán)境之后,JMX默認(rèn)已經(jīng)安裝,只需要在終端運(yùn)行jconsole命令(mac)即可啟動(dòng)
我的環(huán)境中已經(jīng)有三個(gè)zkServer,所以會(huì)有三個(gè)server.quorum,任選一個(gè)即可。
直接點(diǎn)擊連接,會(huì)彈出一個(gè)不安全連接的彈窗(因?yàn)槲覀儾]有配置集群的ssl安全連接配置),所以這里直接選擇 “不安全連接“即可
能夠看到當(dāng)前節(jié)點(diǎn)的 zookeeper server的資源消耗概覽:
更加詳細(xì)的節(jié)點(diǎn)細(xì)節(jié)數(shù)據(jù)可以通過進(jìn)入MBean頁面查看。
比如我使用zookeeper客戶端做了如下操作:
原本在jconsole看到的節(jié)點(diǎn)個(gè)數(shù)的信息是
刷新后可以看到有變更:
以上的監(jiān)控訪問都是通過本地訪問,現(xiàn)在jmx也能夠支持遠(yuǎn)程訪問,在被訪問機(jī)器配置環(huán)境變量:
JMXPORT=8081
重啟zookeeper server以及jconsole
然后在當(dāng)前節(jié)點(diǎn)的jconsole連接窗口輸入如下內(nèi)容,仍然使用不安全的 連接方式即可訪問遠(yuǎn)程節(jié)點(diǎn)的zookeeper數(shù)據(jù)。
到此zookeeper的原生監(jiān)控已經(jīng)描述完畢,可以看到zookeeper的運(yùn)維系統(tǒng)還是非常完善的,更加方便的監(jiān)控就是結(jié)合jmx數(shù)據(jù)和premethus 完成更加完善全面的監(jiān)控。
3. 通過zookeeper observer實(shí)現(xiàn)跨地域部署
3.1 什么是observer
就像是字面含義中所說的 觀察者,不參與,不決策,萬物皆可動(dòng),唯我心永恒。
它作為zookeeper集群中的一個(gè)角色而存在,和集群中其他節(jié)點(diǎn)的唯一交互就是接受來自leader的inform信息,更新到自己的本地存儲(chǔ),不參與集群中的事務(wù)提交,leader選舉等過程。
下圖為zookeeper寫請(qǐng)求的時(shí)序圖:
上圖中:節(jié)點(diǎn)2: leader, 節(jié)點(diǎn)1和節(jié)點(diǎn)3都是follower
- 客戶端提交寫請(qǐng)求到其所連接的節(jié)點(diǎn)1
- 節(jié)點(diǎn)1 將請(qǐng)求轉(zhuǎn)發(fā)給節(jié)點(diǎn)2(節(jié)點(diǎn)2是leader),只有l(wèi)eader可寫
- 節(jié)點(diǎn)2 發(fā)送提案 給集群所有節(jié)點(diǎn)
- 節(jié)點(diǎn)2等待,只有有超過半數(shù)的節(jié)點(diǎn)回復(fù),即可進(jìn)行commit
- 節(jié)點(diǎn)1 收到commit消息,即可向客戶端返回成功。
3.2 observer 提升 寫性能
將節(jié)點(diǎn)1 設(shè)置為observer,這樣能夠減少網(wǎng)絡(luò)rpc(一次propose和accept),減少磁盤I/O(只需要等待leader的通知返回客戶端即可)
3.3 observer 實(shí)現(xiàn)跨數(shù)據(jù)中心部署
如上場景,整個(gè)集群包括leader節(jié)點(diǎn)在內(nèi)有5個(gè)節(jié)點(diǎn),其中北京有3個(gè)節(jié)點(diǎn),香港有2個(gè)節(jié)點(diǎn)。
假如我們這5個(gè)節(jié)點(diǎn)的集群只有1個(gè)leader和其他4個(gè)follower,leader在北京,那么遠(yuǎn)在香港的兩個(gè)follower每一次寫請(qǐng)求都需要參與到整個(gè)集群的propose和accept,這兩個(gè)rpc對(duì)于跨地域的集群部署來說代價(jià)非常大,會(huì)嚴(yán)重降低系統(tǒng)可用性和性能。
這個(gè)時(shí)候如上圖,我們將香港的兩個(gè)節(jié)點(diǎn)設(shè)置為observer,2個(gè)rpc就可以節(jié)省下來,observer只需要forward到leader 并接受leader的inform即可。
當(dāng)然這樣的集群部署模式在實(shí)際的場景還不如分成兩個(gè)本地集群,從而降低網(wǎng)絡(luò)分區(qū)對(duì)系統(tǒng)可用性的影響。
那么如何將一個(gè)節(jié)點(diǎn)部署成observer節(jié)點(diǎn)?
實(shí)際的部署配置可以 修改observer所在節(jié)點(diǎn)的zoo.cfg啟動(dòng)配置的集群選項(xiàng)配置如下:
server.1=127.0.0.1:7777:7778
server.2=127.0.0.1:6666:6667
server.3=127.0.0.1:5555:5556
server.4=127.0.0.1:3333:3334:observer #增加集群的配置選項(xiàng),將當(dāng)前節(jié)點(diǎn)指定為observer
4lw.commands.whitelist=*
啟動(dòng)第四個(gè)節(jié)點(diǎn)之后,通過echo srvr | nc $ip 2181 指定第四個(gè)ip的端口即可知道我們設(shè)置的角色是否成功(observer角色)。
4. zookeeper 不中斷服務(wù)的集群成員變更方法
上文中我們也有關(guān)于調(diào)整集群成員的一些操作,總體步驟如下:
- 停止整個(gè)集群中所有的server
- 更改現(xiàn)有集群中所有server的cfg項(xiàng)中的server.n項(xiàng)(集群成員變更可能導(dǎo)致某一個(gè)節(jié)點(diǎn)已有數(shù)據(jù)被覆蓋)
- 重新啟動(dòng)集群中所有的server
如果zookeeper集群達(dá)到一定規(guī)模,這一系列操作low且耗時(shí),尤其是中斷服務(wù),降低系統(tǒng)可用性。
由于這種手動(dòng)方式調(diào)整代價(jià)很高,所有zookeeper在3.5.0版本合入了 dynamic reconfiguration特性。
這個(gè)特性能夠支持不停止zookeeper服務(wù)的前提下調(diào)整集群成員。
- 獲取一個(gè)給super用的digest, 其中supper是zookeeper提供的認(rèn)證機(jī)制。
運(yùn)行代碼即可生成一個(gè)digest認(rèn)證package org.yao;import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;/*** Generate digest for ZooKeeper super user authentication.*/ public class DigestGenerator {public static void main(String[] args) throws Exception {System.out.println(DigestAuthenticationProvider.generateDigest("super:z_stand"));} }xxx - 導(dǎo)入該認(rèn)證到環(huán)境變量中
export SERVER_JVMFLAGS=-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xxx - zookeeper配置文件
zoo-node2.cfg,將server.n相關(guān)配置放在了單獨(dú)的配置文件中,因?yàn)楹罄m(xù)動(dòng)態(tài)修改的話是需要修改該文件的內(nèi)容。
dyn.cfgtickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zookeeper2 clientPort=2181 4lw.commands.whitelist=* dynamicConfigFile=conf/dyn.cfgserver.1=127.0.0.1:7777:7778:participant;127.0.0.1:2181 server.2=127.0.0.1:6666:6667:participant;127.0.0.1:2181 server.3=127.0.0.1:5555:5556:participant;127.0.0.1:2181
所有節(jié)點(diǎn)的配置文件修改好之后可以將每個(gè)節(jié)點(diǎn)的server都啟動(dòng)起來。
- 開啟客戶端,這個(gè)客戶端需要連接到我們第一步配置認(rèn)證的那個(gè)節(jié)點(diǎn)上運(yùn)行,當(dāng)然這里是mac上模擬的,所以也就直接連接本地即可。
zkCli.sh -server localhost:2181 - 在客戶端的交互命令行中 添加認(rèn)證
addauth digest super:z_stand即可
接下來展示客戶端交互命令如何動(dòng)態(tài)配置節(jié)點(diǎn)情況config顯示集群中的server配置reconfig -remove 3移除server.3config查看集群成員的變更情況reconfig -add server.4=127.0.0.1:3333:3334:participant;127.0.0.1:2181向集群中增加新的成員
到此集群成員的動(dòng)態(tài)變更方式基本描述清楚了,感興趣的同學(xué)可以嘗試一下,需要注意的supper認(rèn)證部分,zkCli.sh連接的server是需要完成認(rèn)證的server節(jié)點(diǎn)。
5. zookeeper數(shù)據(jù)存儲(chǔ)文件:事務(wù)文件和快照文件
zookeeper本地存儲(chǔ)中的數(shù)據(jù)形態(tài)如下圖:
data tree 中的znode信息都是存放在內(nèi)存中的
而磁盤上主要的是兩種文件:事務(wù)文件和快照文件
事務(wù)文件中的entry是追加的,每一次有zookeeper集群的寫入(創(chuàng)建znode,刪除znode)都會(huì)作為事務(wù)更新到事務(wù)文件中。事務(wù)使用64位的整數(shù)zxid唯一標(biāo)識(shí),其中高四個(gè)字節(jié)是epoch,低四個(gè)字節(jié)是counter。
快照文件是當(dāng)節(jié)點(diǎn)啟動(dòng)/重啟時(shí)會(huì)創(chuàng)建一個(gè)文件
除此之外還會(huì)有兩個(gè)文件:acceptedEpoch和currentEpoch分別保存當(dāng)前集群的一些版本信息。
└> ls /tmp/zookeeper1/version-2
acceptedEpoch log.100000001 log.600000001 snapshot.0
currentEpoch log.400000001 log.a00000001 snapshot.600000001
zookeeper提供了工具能夠查看其中的內(nèi)容zkTxnLogToolkit.sh,可以看到如下信息
└> zkTxnLogToolkit.sh log.a00000001
/usr/bin/java
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
2020/12/12 CST 下午3:18:27 session 0x100080708e50000 cxid 0x0 zxid 0xa00000001 createSession 30000
2020/12/12 CST 下午3:37:55 session 0x100080708e50000 cxid 0x0 zxid 0xa00000002 closeSession
2020/12/12 CST 下午3:55:57 session 0x100080708e50001 cxid 0x0 zxid 0xa00000003 createSession 30000
EOF reached after 3 txns.
當(dāng)對(duì)集群中的數(shù)據(jù)進(jìn)行變更時(shí)這一些日志條目也會(huì)發(fā)生變更。
查看zookeeper的快照文件,這里zookeeper僅僅提供了一個(gè)類org.apache.server.SnapshotFormatter來查看,可以編寫如下腳本snapshot.sh實(shí)現(xiàn)快照文件的查看:
#!/bin/bash
zkEnv.sh
export CLASSPATH="$CLASSPATH"
java org.apache.server.SnapshotFormatter "$@"
最后通過運(yùn)行sh snapshot.sh /tmp/zookeeper3/version-2/snapshot.0來查看具體的快照文件內(nèi)容。
ps: 只要zookeeper節(jié)點(diǎn)發(fā)生重啟,或者啟動(dòng) 就會(huì)生成新的快照文件,記錄當(dāng)前狀態(tài)下zookeeper的內(nèi)存狀態(tài)。
剩下的兩個(gè)epoch文件acceptedEpoch和currentEpoch在單機(jī)模式下并不存在, 只有在集群模式下才會(huì)生成。
6. 總結(jié)
以上從zookeeper集群模式的搭建,到基本zookeeper監(jiān)控,再到zookeeper實(shí)現(xiàn)跨地域部署的優(yōu)缺點(diǎn) 以及 更加高級(jí)的 不中斷服務(wù)的場景下實(shí)現(xiàn)集群成員變更。利用以上特性,我們能夠很好的運(yùn)維一個(gè)zookeeper集群。
對(duì)于更加底層的細(xì)節(jié):zookeeper的讀寫流程 中如何保證集群寫入的原子性(ZAB協(xié)議–multi paxos的一種變種),如何完成節(jié)點(diǎn)異常時(shí)的數(shù)據(jù)重放,這一些有趣的分布式細(xì)節(jié)會(huì)在后續(xù)討論。
總結(jié)
以上是生活随笔為你收集整理的一文运维zookeeper的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 圣冕麒麟的问题
- 下一篇: Go 分布式学习利器(16) -- go