Zookeeper 運(yùn)維實(shí)踐手冊(cè)_第1頁(yè)
Zookeeper 運(yùn)維實(shí)踐手冊(cè)_第2頁(yè)
Zookeeper 運(yùn)維實(shí)踐手冊(cè)_第3頁(yè)
Zookeeper 運(yùn)維實(shí)踐手冊(cè)_第4頁(yè)
Zookeeper 運(yùn)維實(shí)踐手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Zookeeper 運(yùn)維實(shí)踐手冊(cè)Zookeeper是一個(gè)高可用的分布式數(shù)據(jù)管理與協(xié)調(diào)框架,該框架能很好地保證分布式環(huán)境中數(shù)據(jù)一致性。一般用來(lái)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)(類似DNS),配置管理,分布式鎖,leader選舉等。一、生產(chǎn)環(huán)境中Zookeeper安裝部署規(guī)范生產(chǎn)環(huán)境建議zookeeper至少為三臺(tái)集群,統(tǒng)一安裝配置,版本號(hào)為近期新版本,比如版本為3.4.8部署路徑:/opt/業(yè)務(wù)模塊名/zookeeper配置文件:/opt/業(yè)務(wù)模塊名/zookeeper/conf/zoo.cfg存儲(chǔ)快照文件snapshot的目錄:/opt/業(yè)務(wù)模塊名/zookeeper/data事務(wù)日志輸出目錄:/var/log/

2、業(yè)務(wù)模塊名/zookeeper運(yùn)行日志輸出目錄:/var/log/業(yè)務(wù)模塊名/zookeeperZookeeper所有端口需要提前開通防火墻入站規(guī)則對(duì)外服務(wù)端口:默認(rèn)2181,可自定義通信端口:2888,可自定義選舉端口:3888,可自定義autoperge默認(rèn)關(guān)閉,建議自行編寫腳本在業(yè)務(wù)低谷期清理快照和事務(wù)日志查詢狀態(tài):sh /opt/業(yè)務(wù)模塊名/zookeeper/zkServer.sh status啟動(dòng)服務(wù):sh /opt/業(yè)務(wù)模塊名/zookeeper/zkServer.sh start停止服務(wù):sh /opt/業(yè)務(wù)模塊名/zookeeper/zkServer.sh stop配置文件c

3、onf/zoo.cfg示例如下:# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial# synchronization phase can takeinitLimit=10# The number of ticks that can pass between# sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored

4、.# do not use /tmp for storage, /tmp here is just# example sakes.dataDir=/opt/kevintest/zookeeper_22181/data# the port at which the clients will connectclientPort=22181# the maximum number of client connections.# increase this if you need to handle more clients#maxClientCnxns=60# Be sure to read the

5、 maintenance section of the# administrator guide before turning on autopurge.# /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=1data

6、LogDir=/var/log/kevintest/zookeeper_22181server.1=1:22888:23888server.2=1:22988:23988server.3=2:22888:23888conf/perties配置示例如下:# Define some default values that can be overridden by system propertieszookeeper.root.logger=INFO,ROLLINGFILEzookeeper.console.threshold=INFOzookeeper.log.dir=.zookeeper.log

7、.file=zookeeper.logzookeeper.log.threshold=DEBUGzookeeper.tracelog.dir=.zookeeper.tracelog.file=zookeeper_trace.log# ZooKeeper Logging Configuration# Format is (, )+# DEFAULT: console appender onlylog4j.rootLogger=$zookeeper.root.logger# Example with rolling log file#log4j.rootLogger=DEBUG, CONSOLE,

8、 ROLLINGFILE# Example with rolling log file and tracing#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE# Log INFO level and above messages to the console#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Threshold=$zookeeper.console.thresholdlog4j.appender.CONSOLE

9、.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=%dISO8601 myid:%Xmyid - %-5p %t:%C1%L - %m%n# Add ROLLINGFILE to rootLogger to get log file output# Log DEBUG level and above messages to a log filelog4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppend

10、erlog4j.appender.ROLLINGFILE.Threshold=$zookeeper.log.thresholdlog4j.appender.ROLLINGFILE.File=$zookeeper.log.dir/$zookeeper.log.file# Max log file size of 10MB#log4j.appender.ROLLINGFILE.MaxFileSize=10MB# uncomment the next line to limit number of backup fileslog4j.appender.ROLLINGFILE.MaxBackupInd

11、ex=10log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.ROLLINGFILE.layout.ConversionPattern=%dISO8601 myid:%Xmyid - %-5p %t:%C1%L - %m%n# Add TRACEFILE to rootLogger to get log file output# Log DEBUG level and above messages to a log filelog4j.appender.TRACEFILE=org.apac

12、he.log4j.FileAppenderlog4j.appender.TRACEFILE.Threshold=TRACElog4j.appender.TRACEFILE.File=$zookeeper.tracelog.dir/$zookeeper.tracelog.filelog4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout# Notice we are including log4js NDC here (%x)log4j.appender.TRACEFILE.layout.ConversionPattern=%dI

13、SO8601 myid:%Xmyid - %-5p %t:%C1%L%x - %m%nconf/zookeeper-env.sh文件配置示例如下:ZOO_LOG_DIR=/var/log/kevintest/zookeeper_22181/ZOO_LOG4J_PROP=INFO,ROLLINGFILE二、Zookeeper最佳實(shí)踐必須了解以下ZK知識(shí)點(diǎn),才能熟練地對(duì)ZK進(jìn)行維護(hù):-zookeeper集群里分三種角色: Leader, Follower和Observer。Leader和Follower參與投票,Observer只會(huì)聽投票的結(jié)果,不參與投票。-投票集群里的節(jié)點(diǎn)數(shù)要求是奇數(shù)-一個(gè)集群

14、容忍掛掉的節(jié)點(diǎn)數(shù)的等式為 N = 2F + 1,N為投票集群節(jié)點(diǎn)數(shù),F(xiàn)為能同時(shí)容忍失敗節(jié)點(diǎn)數(shù)。比如一個(gè)三節(jié)點(diǎn)集群,可以掛掉一個(gè)節(jié)點(diǎn),5節(jié)點(diǎn)集群可以掛掉兩個(gè).-一個(gè)寫操作需要半數(shù)以上的節(jié)點(diǎn)ack,所以集群節(jié)點(diǎn)數(shù)越多,整個(gè)集群可以抗掛點(diǎn)的節(jié)點(diǎn)數(shù)越多(越可靠),但是吞吐量越差。-Zookeeper里所有節(jié)點(diǎn)以及節(jié)點(diǎn)的數(shù)據(jù)都會(huì)放在內(nèi)存里,形成一棵樹的數(shù)據(jù)結(jié)構(gòu)。并且定時(shí)的dump snapshot到磁盤。-Zookeeper的Client與Zookeeper之間維持的是長(zhǎng)連接,并且保持心跳,Client會(huì)與Zookeeper之間協(xié)商出一個(gè)Session超時(shí)時(shí)間出來(lái)(其實(shí)就是Zookeeper Serve

15、r里配置了最小值,最大值,如果client的值在這兩個(gè)值之間則采用client的,小于最小值就是最小值,大于最大值就用最大值),如果在Session超時(shí)時(shí)間內(nèi)沒有收到心跳,則該Session過期。-Client可以watch Zookeeper那個(gè)樹形數(shù)據(jù)結(jié)構(gòu)里的某個(gè)節(jié)點(diǎn)或數(shù)據(jù),當(dāng)有變化的時(shí)候會(huì)得到通知。1)最小生產(chǎn)集群要確保Zookeeper能夠穩(wěn)定運(yùn)行,那么就需要確保投票能夠正常進(jìn)行,最好不要掛一個(gè)節(jié)點(diǎn)整個(gè)就不work了,所以我們一般要求生產(chǎn)環(huán)境最少3個(gè)節(jié)點(diǎn)部署。2)網(wǎng)絡(luò)除了節(jié)點(diǎn)外,還要看不能一臺(tái)物理機(jī)器,一個(gè)機(jī)柜或一個(gè)交換機(jī)掛掉然后影響了整個(gè)集群,所以節(jié)點(diǎn)網(wǎng)絡(luò)結(jié)構(gòu)也要考慮,這個(gè)可能就比很

16、多應(yīng)用服務(wù)器的要求更加嚴(yán)格。3)分Group,保護(hù)核心Group要確保Zookeeper整個(gè)集群可靠運(yùn)行,就是要確保投票集群可靠。那在我們這里,將一個(gè)Zookeeper集群劃分為多個(gè)小的Group,我們稱Leader+Follower為核心Group,核心Group我們一般是不向外提供服務(wù)的,然后我們會(huì)根據(jù)不同的業(yè)務(wù)再加一些Observer,比如一個(gè)Zookeeper集群為服務(wù)發(fā)現(xiàn),消息,定時(shí)任務(wù)三個(gè)不同的組件提供服務(wù),那么我們?yōu)榻⑷齻€(gè)Observer Group,分別給這三個(gè)組件使用,而Client只會(huì)連接分配給它的Observer Group,不去連接核心Group。這樣核心Group就

17、不會(huì)給Client提供長(zhǎng)連接服務(wù),也不負(fù)責(zé)長(zhǎng)連接的心跳,這大大的減輕了核心Group的壓力,因?yàn)樵趯?shí)際環(huán)境中,一個(gè)Zookeeper集群要為上萬(wàn)臺(tái)機(jī)器提供服務(wù),維持長(zhǎng)連接和心跳還是要消耗一定的資源的。因?yàn)镺bserver是不參與投票的所以加Observer并不會(huì)降低整體的吞吐量,而且Observer掛掉不會(huì)影響整個(gè)集群的健康。但是這里要注意的是,分Observer Group只能解決部分問題,因?yàn)楫吘顾械膶懭脒€是要交給核心Group來(lái)處理的,所以對(duì)于寫入量特別大的應(yīng)用來(lái)說,還是需要進(jìn)行集群上的隔離,比如Storm和Kafka就對(duì)Zookeeper壓力比較大,你就不能將其與服務(wù)發(fā)現(xiàn)的集群放在一

18、起。4)內(nèi)存因?yàn)閆ookeeper將所有數(shù)據(jù)都放在內(nèi)存里,所以對(duì)JVM以及機(jī)器的內(nèi)存也要預(yù)先計(jì)劃,如果出現(xiàn)Swap那將嚴(yán)重的影響Zookeeper集群的性能,所以我一般不怎么推薦將Zookeeper用作通用的配置管理服務(wù)。因?yàn)橐话闩渲脭?shù)據(jù)還是挺大的,這些全部放在內(nèi)存里不太可控。5)日志清理因?yàn)閆ookeeper要頻繁的寫txlog (Zookeeper寫的一種順序日志) 以及定期dump內(nèi)存snapshot到磁盤,這樣磁盤占用就越來(lái)越大,所以Zookeeper提供了清理這些文件的機(jī)制,但是這種機(jī)制并不太合理,它只能設(shè)置間隔多久清理,而不能設(shè)置具體的時(shí)間段。那么就有可能碰到高峰期間清理,所以建議

19、將其關(guān)閉:autopurge.purgeInterval=0。然后使用crontab等機(jī)制,在業(yè)務(wù)低谷的時(shí)候清理。6)日志,jvm配置從官網(wǎng)直接下載的包如果直接啟動(dòng)運(yùn)行是很糟糕的,這個(gè)包默認(rèn)的配置日志是不會(huì)輪轉(zhuǎn)的,而且是直接輸出到終端。我們最開始并不了解這點(diǎn),然后運(yùn)行一段時(shí)間后發(fā)現(xiàn)生成一個(gè)龐大的zookeeper.out的日志文件。除此之外,這個(gè)默認(rèn)配置還沒有設(shè)置任何jvm相關(guān)的參數(shù)(所以堆大小是個(gè)默認(rèn)值),這也是不可取的。那么有的同學(xué)說那我去修改Zookeeper的啟動(dòng)腳本吧。最好不要這樣做,Zookeeper會(huì)加載conf文件夾下一個(gè)名為zookeeper-env.sh的腳本,所以你可以將

20、一些定制化的配置寫在這里,而不是直接去修改Zookeeper自帶的腳本。#!/usr/bin/env bashZOO_LOG_DIR=/var/log/kevintest/zookeeper_22181/ #日志文件放置的路徑ZOO_LOG4J_PROP=INFO,ROLLINGFILE #設(shè)置日志輪轉(zhuǎn)新版本的zk中是用java.env這個(gè)參數(shù)文件來(lái)配置的if -f $ZOOCFGDIR/java.env then. $ZOOCFGDIR/java.envfi其中$ZOOCFGDIR/java.env就是設(shè)置jvm內(nèi)存大小的文件,這個(gè)文件默認(rèn)情況下是沒有的,需要手動(dòng)創(chuàng)建,vim /usr/lo

21、cal/services/zookeeper-3.4.8/conf/java.env#!/bin/shexport JAVA_HOME=/usr/java/jdk# heap size MUST be modified according to cluster environmentexport JVMFLAGS=-Xms4096m -Xmx4096m $JVMFLAGS7)地址在實(shí)際環(huán)境中,我們可能因?yàn)楦鞣N原因比如機(jī)器過保,硬件故障等需要遷移Zookeeper集群,所以Zookeeper的地址是一個(gè)很頭痛的事情。這個(gè)地址有兩方面,第一個(gè)是提供給Client的地址,建議這個(gè)地址通過配置的方式下

22、發(fā),不要讓使用方直接使用,這一點(diǎn)我們前期做的不好。另外一個(gè)是集群配置里,集群之間需要通訊,也需要地址。我們的處理方式是設(shè)置hosts:0 zk11 zk22 zk3在zoo.cfg配置里:server.1=zk1:2081:3801server.2=zk2:2801:3801server.3=zk3:2801:3801這樣在需要遷移的時(shí)候,我們停老的節(jié)點(diǎn),起新的節(jié)點(diǎn)只需要修改hosts映射就可以了。比如現(xiàn)在server.3需要遷移,那我們?cè)趆osts里將zk3映射到新的ip地址。但是對(duì)于java有一個(gè)問題是,java默認(rèn)會(huì)永久緩存DNS cache,即使你將zk3映射到別的ip,如果并不重啟s

23、erver.1, server.2,它是不會(huì)解析到新的ip的,這個(gè)需要修改$JAVA_HOME/jre/lib/security/java.security文件里的networkaddress.cache.ttl=60,將其修改為一個(gè)比較小的數(shù)。對(duì)于這個(gè)遷移的問題,我們還遇到一個(gè)比較尷尬的情況,在最后的坑里會(huì)有提及。8)日志位置Zookeeper主要產(chǎn)生三種IO: txlog(每個(gè)寫操作,包括新Session都會(huì)記錄一條log),Snapshot以及運(yùn)行的應(yīng)用日志。一般建議將這三個(gè)IO分散到三個(gè)不同的盤上。不過我們倒是一直沒有這么實(shí)驗(yàn)過,我們的Zookeeper也是運(yùn)行在虛擬機(jī)(一般認(rèn)為虛擬機(jī)

24、IO較差)上。9)監(jiān)控我們對(duì)Zookeeper做了這樣一些監(jiān)控:a)是否可寫。 就是一個(gè)定時(shí)任務(wù)定時(shí)的去創(chuàng)建節(jié)點(diǎn),刪節(jié)點(diǎn)等操作。這里要注意的是Zookeeper是一個(gè)集群,我們監(jiān)控的時(shí)候我還是希望對(duì)單個(gè)節(jié)點(diǎn)做監(jiān)控,所以這些操作的時(shí)候不要連接整個(gè)集群,而是直接去連接單個(gè)節(jié)點(diǎn)。b)監(jiān)控watcher數(shù)和連接數(shù) 特別是這兩個(gè)數(shù)據(jù)有較大波動(dòng)的時(shí)候,可以發(fā)現(xiàn)使用方是否有誤用的情況c)網(wǎng)絡(luò)流量以及client ip 這個(gè)會(huì)記錄到監(jiān)控系統(tǒng)里,這樣很快能發(fā)現(xiàn)害群之馬10)一些使用建議a)不要強(qiáng)依賴Zookeeper,也就是Zookeeper出現(xiàn)問題業(yè)務(wù)已然可以正常運(yùn)行。Zookeeper是一個(gè)分布式的協(xié)調(diào)框架

25、,主要做的事情就是分布式環(huán)境的一致性。這是一個(gè)非??量痰氖虑?,所以它的穩(wěn)定性受很多方面的影響。比如我們常常使用Zookeeper做服務(wù)發(fā)現(xiàn),那么服務(wù)發(fā)現(xiàn)其實(shí)是不需要嚴(yán)格的一致性的,我們可以緩存server list,當(dāng)Zookeeper出現(xiàn)問題的時(shí)候已然可以正常工作,在這方面etcd要做的更好一些,Zookeeper如果出現(xiàn)分區(qū),少數(shù)派是不能提供任何服務(wù)的,讀都不可以,而etcd的少數(shù)派仍然可以提供讀服務(wù),這在服務(wù)發(fā)現(xiàn)的時(shí)候還是不錯(cuò)的。b)不要將很多東西塞到Zookeeper里,這個(gè)上面已經(jīng)提到過。c)不要使用Zookeeper做細(xì)粒度鎖,比如很多業(yè)務(wù)在訂單這個(gè)粒度上使用Zookeeper做分

26、布式鎖,這會(huì)頻繁的和Zookeeper交互,對(duì)Zookeeper壓力較大,而且一旦出現(xiàn)問題影響面廣。但是可以使用粗粒度的鎖(其實(shí)leader選舉也是一種鎖)。d)不建議做通用配置的第二個(gè)理由是,通用配置要提供給特別多特別多系統(tǒng)使用,而且一些公共配置甚至所有系統(tǒng)都會(huì)使用,一旦這樣的配置發(fā)生變更,Zookeeper會(huì)廣播給所有的watcher,然后所有Client都來(lái)拉取,瞬間造成非常大的網(wǎng)絡(luò)流量,引起所謂的驚群。而自己實(shí)現(xiàn)通用配置系統(tǒng)的時(shí)候,一般會(huì)對(duì)這種配置采取排隊(duì)或分批通知的方式。三、Zookeeper操作命令手冊(cè)1)Zookeeper客戶端命令zkCli.sh -server :2181zk

27、: localhost:2182(CONNECTED) 0 helpZooKeeper -server host:port cmd argsconnect host:portget path watchls path watchset path data versionrmr pathdelquota -n|-b pathquitprintwatches on|offcreate -s -e path data aclstat path watchclosels2 path watchhistorylistquota pathsetAcl path aclgetAcl pathsync pat

28、hredo cmdnoaddauth scheme authdelete path versionsetquota -n|-b val path登錄后命令行里面的一些簡(jiǎn)單操作如下:- 顯示根目錄下、文件: ls / #使用 ls 命令來(lái)查看當(dāng)前 ZooKeeper 中所包含的內(nèi)容- 顯示根目錄下、文件: ls2 / #查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)- 創(chuàng)建文件,并設(shè)置初始內(nèi)容: create /zk test #創(chuàng)建一個(gè)新的 znode節(jié)點(diǎn)“ zk ”以及與它關(guān)聯(lián)的字符串- 獲取文件內(nèi)容: get /zk #確認(rèn) znode 是否包含我們所創(chuàng)建的字符串- 修改文件內(nèi)容: set /zk

29、 zkbak #對(duì) zk 所關(guān)聯(lián)的字符串進(jìn)行設(shè)置- 刪除文件: delete /zk #將剛才創(chuàng)建的 znode 刪除- 退出客戶端: quit- 幫助命令: help2)Zookeeper服務(wù)端命令在準(zhǔn)備好相應(yīng)的配置之后,可以直接通過zkServer.sh 這個(gè)腳本進(jìn)行服務(wù)的相關(guān)操作- 啟動(dòng)ZK服務(wù): sh bin/zkServer.sh start- 查看ZK服務(wù)狀態(tài): sh bin/zkServer.sh status- 停止ZK服務(wù): sh bin/zkServer.sh stop- 重啟ZK服務(wù): sh bin/zkServer.sh restart3)Zookeeper常用四字命令

30、ZooKeeper 支持某些特定的四字命令字母與其的交互。它們大多是查詢命令,用來(lái)獲取 ZooKeeper 服務(wù)的當(dāng)前狀態(tài)及相關(guān)信息。用戶在客戶端可以通過telnet 或 nc 向 ZooKeeper 提交相應(yīng)的命令。命令語(yǔ)義:命令操作實(shí)例:(機(jī)器上要安裝netcat-0.7.1-1.i386.rpm服務(wù))# echo stat |nc 2182 來(lái)查看哪個(gè)節(jié)點(diǎn)被選擇作為follower或者leader# echo ruok |nc 2182 測(cè)試是否啟動(dòng)了該Server,若回復(fù)imok表示已經(jīng)啟動(dòng)。# echo dump | nc 2182 列出未經(jīng)處理的會(huì)話和臨時(shí)節(jié)點(diǎn)。# echo kil

31、l | nc 2182 關(guān)掉server# echo conf | nc 2182 輸出相關(guān)服務(wù)配置的詳細(xì)信息。# echo cons | nc 2183 列出所有連接到服務(wù)器的客戶端的完全的連接 / 會(huì)話的詳細(xì)信息。# echo envi | nc 2182 輸出關(guān)于服務(wù)環(huán)境的詳細(xì)信息(區(qū)別于 conf 命令)。# echo reqs | nc 2183 列出未經(jīng)處理的請(qǐng)求。# echo wchs | nc 2183 列出服務(wù)器 watch 的詳細(xì)信息。# echo wchc | nc 2183 通過 session 列出服務(wù)器 watch 的詳細(xì)信息,它的輸出是一個(gè)與 watch 相關(guān)的會(huì)

32、話的列表。# echo wchp | nc 2183 通過路徑列出服務(wù)器 watch 的詳細(xì)信息。它輸出一個(gè)與 session 相關(guān)的路徑。四、Zookeeper運(yùn)維手冊(cè)對(duì)于長(zhǎng)期運(yùn)行的ZooKeeper ensemble來(lái)說, 運(yùn)維工作是必須做的, 運(yùn)維人員需要注意以下幾點(diǎn):1)清理磁盤文件ZooKeeper中有兩處使用到了磁盤:事務(wù)日志與內(nèi)存數(shù)據(jù)庫(kù)快照.。ZooKeeper名稱空間里的節(jié)點(diǎn)發(fā)生變更的時(shí)候, 就會(huì)有內(nèi)容寫入事務(wù)日志. 通常情況下, 當(dāng)單個(gè)事務(wù)日志文件變的越來(lái)越大的時(shí)候, 事務(wù)日志就需要?jiǎng)?chuàng)建一個(gè)新的文件. 但在創(chuàng)建新的事務(wù)日志文件之前, ZooKeeper會(huì)先把當(dāng)前的內(nèi)存數(shù)據(jù)庫(kù)的

33、狀態(tài)寫入磁盤先做快照, 然后再生成一個(gè)新的事務(wù)日志文件. 這樣就保證了快照文件和事務(wù)日志文件是一一對(duì)應(yīng)的. 但快照落地需要時(shí)間, 在快照落地期間如果還有事務(wù)來(lái)臨, 那么這部分事務(wù)的日志依然會(huì)寫向舊的事務(wù)日志文件里. 這就導(dǎo)致, 快照文件對(duì)應(yīng)的那個(gè)事務(wù)日志文件里, 存儲(chǔ)的事務(wù)日志可能要比當(dāng)前快照文件要新.ZooKeeper server進(jìn)程在默認(rèn)啟動(dòng)的情況下, 是不會(huì)自動(dòng)刪除事務(wù)日志文件和快照文件的,當(dāng)然這是可配置的, 配置項(xiàng)分別是autopurge.snapRetainCount和autopurge.purgeInterval. 這兩個(gè)配置項(xiàng)的具體含義在有詳細(xì)描述. 但需要注意:如果你要這樣做

34、, 那么最好為每臺(tái)部署的機(jī)器提供不同的配置值, 除非這些機(jī)器的規(guī)格是完全一摸一樣的!除過在配置文件中設(shè)定, 還有一種方法就是調(diào)用一個(gè)ZooKeeper提供的小工具, 大致如下:java -cp zookeeper.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog -n 其中是事務(wù)日志的保存目錄,是快照文件的保存目錄,是要保留的個(gè)數(shù). 建議大于3.。運(yùn)行該命令后, 除了最近的對(duì)事務(wù)日志文件與快照文件, 其它文件都將被刪除. 這是一個(gè)一次性命令. 如果你想定期清理, 那么只能自己寫個(gè)腳本咯。注意以下幾點(diǎn):-

35、永遠(yuǎn)不建議手動(dòng)刪除事務(wù)日志文件與快照文件;- 通過配置項(xiàng)使ZooKeeper server自動(dòng)刪除, 只有在ZooKeeper版本大于3.4后才可用;- PrugeTxnLog工具是一個(gè)一次性工具, 如果需要定期清理, 你需要自己寫一個(gè)腳本;- 當(dāng)機(jī)器規(guī)格不同的時(shí)候, 建議按照不同規(guī)格定制不同的清楚閾值;2)清理運(yùn)行日志ZooKeeper 用 log4j 來(lái)輸出運(yùn)行日志。如果要更改運(yùn)行日志的相關(guān)配置,你需要獨(dú)立為log4j提供配置文件。建議使用log4j提供的滾動(dòng)日志特性,這樣就免去了清理運(yùn)行日志的問題。3)監(jiān)控ZooKeeper server進(jìn)程的死活ZooKeeper的server進(jìn)程在錯(cuò)

36、誤發(fā)生的時(shí)候會(huì)立即自殺,ZooKeeper的設(shè)計(jì)哲學(xué)是這樣的:- 單個(gè)實(shí)例掛掉, 或少量實(shí)例掛掉不影響整體服務(wù)- 當(dāng)單個(gè)實(shí)例遇到錯(cuò)誤的時(shí)候, 實(shí)例會(huì)立即掛掉- 實(shí)例被重啟后會(huì)自動(dòng)加入ensemble- 但實(shí)例不會(huì)自動(dòng)重啟所以搞一個(gè)監(jiān)控進(jìn)程, 在實(shí)例進(jìn)程掛掉之后將其立即拉起是一個(gè)很好的做法. 比如daemontools或SMF.4)監(jiān)控ZooKeeper server服務(wù)的狀態(tài)要監(jiān)控ZooKeeper服務(wù)的狀態(tài), 有兩個(gè)選擇- 用4字命令去檢查。這個(gè)在上面的 ZooKeeper4字命令中有詳情- JMX。5)運(yùn)行日志ZooKeeper使用log4j 1.2來(lái)輸出運(yùn)行日志,默認(rèn)的配置文件在zook

37、eeper/conf/perties中。log4j的配置文件要求要么放在工作目錄里, 要么放在類路徑里。6)問題定位 由于文件損壞導(dǎo)致實(shí)例不能啟動(dòng) ZooKeeper的server進(jìn)程在事務(wù)日志文件被損壞的情況下是起不來(lái)的。這時(shí)運(yùn)行日志會(huì)說在載入ZooKeeper database時(shí)出現(xiàn)IOException。這種情況下,你需要做的是:- 通過四字命令stat檢查ensemble中的其它實(shí)例是否正常工作- 如果其它實(shí)例正常, 那么把當(dāng)前實(shí)例dataDir目錄下的version-2子目錄中的所有文件刪除, 再把dataLogDir下的version-2子目錄下的所有文件刪除, 然后重啟就可以了。

38、這種情況是當(dāng)前實(shí)例的事務(wù)文件損壞, 不能重建內(nèi)存數(shù)據(jù)庫(kù), 刪除掉事務(wù)日志和數(shù)據(jù)庫(kù)快照后, 當(dāng)前的實(shí)例在重啟后會(huì)通過其它實(shí)例拉取內(nèi)在數(shù)據(jù)庫(kù), 重建事務(wù)日志和快照文件.7)配置參數(shù)ZooKeeper的行為受配置文件影響. 所有同一個(gè)ensemble中的實(shí)例建議使用完全相同的配置文件. 但使用完全相同的配置文件有一個(gè)前提條件: 就是所有實(shí)例所屬的機(jī)器上的磁盤布局是相同的. 磁盤布局不同意味著不同的機(jī)器下的實(shí)例在配置dataDir和dataLogDir的時(shí)候配置值可能有差異, 但除此之外, 一個(gè)ensemble中的所有實(shí)例的配置文件必須保證server.x=xxxx這些配置值是完全一致的。7.1)最小

39、配置下面列出來(lái)的是要讓ensemble正常工作, 每個(gè)實(shí)例都需要配置的配置項(xiàng)。配置項(xiàng)含義:7.2)高級(jí)可選配置下面列出來(lái)的是一此可選配置, 屬于高級(jí)選項(xiàng). 你可以用這些配置項(xiàng)進(jìn)一步個(gè)性化ZooKeeper server的行為. 其中一些配置項(xiàng)的值可以通過在啟動(dòng)server進(jìn)程的時(shí)候?qū)懭隞ava 系統(tǒng)屬性來(lái)設(shè)置。配置項(xiàng)對(duì)應(yīng)的Java系統(tǒng)屬性名含義:7.3)多實(shí)例模式下的配置項(xiàng)下面列出來(lái)的配置項(xiàng)是多實(shí)例模式下的一些配置項(xiàng). 有一些配置項(xiàng)可以通過在啟動(dòng)server進(jìn)程的時(shí)候?qū)懭隞ava系統(tǒng)屬性來(lái)設(shè)置。配置項(xiàng)對(duì)應(yīng)的Java系統(tǒng)屬性名含義7.4)身份認(rèn)證與授權(quán)相關(guān)的配置項(xiàng)為了避免看不懂下面的配置項(xiàng)都在干

40、嘛,先大致說一下Zookeeper里的認(rèn)證與授權(quán)。在ZooKeeper server端, 每個(gè)znode存儲(chǔ)兩部分內(nèi)容: 數(shù)據(jù)和狀態(tài). 狀態(tài)中包含ACL信息. 創(chuàng)建一個(gè)znode會(huì)產(chǎn)生一個(gè)ACL表, 每個(gè)ACL記錄有以下內(nèi)容:- 驗(yàn)證模式(scheme)- 具體內(nèi)容(id). 比如當(dāng)scheme=digest的時(shí)候, id為是用戶名和密碼, 比如root:J0sTy9BCUKubtK1y8pkbL7qoxSw=- 這個(gè)ACL擁有的權(quán)限ZooKeeper提供了如下幾種驗(yàn)證模式(scheme)- digest 就是用戶名+密碼.- auth 不使用任何id, 表示任何已確認(rèn)用戶- ip. 用cli

41、ent連接至server時(shí)使用的IP地址進(jìn)行驗(yàn)證- world 固定ID為anyone, 為所有client端開放權(quán)限- super 在這種scheme下, 對(duì)應(yīng)的id擁有超級(jí)權(quán)限.需要注意:exists操作的getAcl操作不受ACL控制, 任何client都可以執(zhí)行這兩個(gè)操作.znode的權(quán)限主要有以下幾種:- create- read- write- delete- admin 允許對(duì)本節(jié)點(diǎn)執(zhí)行setAcl操作配置項(xiàng)對(duì)應(yīng)的Java系統(tǒng)屬性名含義:7.5)實(shí)驗(yàn)性的配置項(xiàng)配置項(xiàng)對(duì)應(yīng)的Java系統(tǒng)屬性名含義7.6)不安全的配置項(xiàng)配置項(xiàng)對(duì)應(yīng)的Java系統(tǒng)屬性名含義7.7)使用Netty框架進(jìn)行通

42、信這是3.4版本后的一個(gè)特性。Netty是一個(gè)基于NIO的客戶端-服務(wù)器通信框架, 這個(gè)框架簡(jiǎn)化了Java在網(wǎng)絡(luò)通信層上的很多繁操作, 并且內(nèi)置支持SSL和認(rèn)證授權(quán), 當(dāng)然SSL和認(rèn)證授權(quán)是額外的可選功能.3.4版本之前,ZooKeeper是直接用NIO的,在3.4之后,NIO只是一個(gè)可選項(xiàng),但依然是默認(rèn)選項(xiàng),如果要使用Netty的話,需要把zookeeper.serverCnxnFactory替換為org.apache.zookeeper.server.NettyServerCnxnFactory??梢灾辉赾lient上用Netty,也可在server上用Netty,但通常情況下,建議要改一

43、起改。蛋疼的是相關(guān)的文檔官方還沒有寫!7.8)四字命令ZooKeeper支持一系列的四字命令, 你可以在client上通過telnte或nc直接向server發(fā)送這些四字命令.使用一個(gè)四字命令如下所示, 下面使用echo和nc將四字命令ruok發(fā)送給本機(jī)的server:echo ruok | nc 2182下表是所有支持的四字命令, 注意有些命令僅在特定版本之后才受支持。命令含義:這里需要注意:mntr命令的輸出大致長(zhǎng)下面這樣. 輸出格式符合java屬性格式, 如果你要寫個(gè)腳本定時(shí)發(fā)送這個(gè)命令以監(jiān)控ensemble的運(yùn)行狀態(tài), 注意輸出的字段的數(shù)量可能會(huì)有變化, 寫腳本的時(shí)候注意這一點(diǎn)。另外有

44、一些字段是與操作系統(tǒng)平臺(tái)相關(guān)的, 輸出每一行的格式是key t value, 下面是一個(gè)示例:# echo mntr | nc localhost 2185zk_version 3.4.0zk_avg_latency 0zk_max_latency 0zk_min_latency 0zk_packets_received 70zk_packets_sent 69zk_outstanding_requests 0zk_server_state leaderzk_znode_count 4zk_watch_count 0zk_ephemerals_count 0zk_approximate_dat

45、a_size 27zk_followers 4 - only exposed by the Leaderzk_synced_followers 4 - only exposed by the Leaderzk_pending_syncs 0 - only exposed by the Leaderzk_open_file_descriptor_count 23 - only available on Unix platformszk_max_file_descriptor_count 1024 - only available on Unix platforms8)數(shù)據(jù)文件管理將事務(wù)日志文件和

46、快照文件存儲(chǔ)在不同的物理磁盤上, 可以提升系統(tǒng)性能.8.1)快照存儲(chǔ)目錄配置項(xiàng)dataDir指向的目錄路徑中主要存儲(chǔ)兩種文件:- myid: 這個(gè)文件里寫著當(dāng)前server實(shí)例的編號(hào)- snapshot.: 這里存儲(chǔ)著內(nèi)存數(shù)據(jù)庫(kù)的快照server實(shí)例的編號(hào)用在兩個(gè)場(chǎng)合:myid文件里, 以及配置文件里的server.X配置項(xiàng)中。當(dāng)前server實(shí)例在啟動(dòng)的時(shí)候, 先去配置文件里看dataDir的值, 然后去找dataDir/myid這個(gè)文件, 查看文件內(nèi)容, 得知自己的編號(hào), 然后在配置文件里再找對(duì)應(yīng)的server.x查看要開的端口號(hào)。快照文件的后綴, , 是一個(gè)事務(wù)ID. 這是在落地內(nèi)存數(shù)據(jù)

47、庫(kù)這個(gè)過程開始時(shí), 成功執(zhí)行的最后一個(gè)事務(wù)的ID號(hào), 但蛋疼的是, 在落地快照的過程中, server還在接受請(qǐng)求, 執(zhí)行事務(wù), 也就是在落地的過程中, 內(nèi)存數(shù)據(jù)庫(kù)中的數(shù)據(jù)還處于一個(gè)變動(dòng)的過程中, 這就導(dǎo)致落地后的快照文件像是一個(gè)扭曲的文件. 像是你在用手機(jī)拍攝全景照片的過程中, 有一只貓隨著你的鏡頭走, 然后最終拍攝出來(lái)的照片里有一只長(zhǎng)度為17米的貓. 最終落地生成的快照文件里的數(shù)據(jù)狀態(tài)可能和任何一個(gè)時(shí)刻內(nèi)存數(shù)據(jù)庫(kù)的狀態(tài)都對(duì)不上, 就是因?yàn)檫@個(gè)原因. 但ZooKeeper依然可以用這種扭曲的快照文件重建內(nèi)存數(shù)據(jù)庫(kù), 這是因?yàn)閆ooKeeper中的update操作是冪等的, 這就保證了在扭曲的

48、快照文件之上重放事務(wù)日志里的日志, 就可以將進(jìn)程的內(nèi)存狀態(tài)恢復(fù)到日志結(jié)束時(shí)的那個(gè)時(shí)刻。8.2)事務(wù)日志目錄在有update請(qǐng)求的時(shí)候, server的默認(rèn)行為是先寫事務(wù)日志, 再執(zhí)行update操作. 單個(gè)事務(wù)日志里存儲(chǔ)的事務(wù)個(gè)數(shù)超過一個(gè)閾值的時(shí)候, 就會(huì)導(dǎo)致事務(wù)日志新開一個(gè)文件, 同時(shí)會(huì)導(dǎo)致內(nèi)在數(shù)據(jù)庫(kù)落地快照, 這個(gè)閾值在上面的配置項(xiàng)中有提. 日志文件的后綴是日志文件里第一個(gè)日志的ID8.3)文件管理快照文件的格式和事務(wù)日志文件的格式是死的,這就允許你從現(xiàn)網(wǎng)的server機(jī)器上將事務(wù)日志和內(nèi)存快照拷貝至你的開發(fā)機(jī),在你的開發(fā)環(huán)境重現(xiàn)現(xiàn)網(wǎng)的情景, 從而進(jìn)行一些調(diào)試或問題定位操作。使用舊的事務(wù)日

49、志文件和快照文件還能重建過去某個(gè)指定時(shí)刻server的狀態(tài), LogFormatter類可以用來(lái)訪問事務(wù)日志文件, 以獲取可讀的信息. 當(dāng)然使用的時(shí)候需要有管理員權(quán)限, 因?yàn)閿?shù)據(jù)是加密的。server進(jìn)程本來(lái)是沒有刪除事務(wù)日志和快照文件的能力的, 但這在3.4版本中也隨著新的配置項(xiàng)autopurge.snapRetainCount和autopurge.purgeInterval添加上了。9)要避免的事情下面是幾個(gè)你應(yīng)當(dāng)在部署運(yùn)維的時(shí)候極力避免的事情:-ensemble中各個(gè)server使用的配置文件中,server.X配置表不一致. 所有的配置文件中, 都要以server.X配置項(xiàng)的形式列出當(dāng)

50、前ensemble中的所有server, 包括自己. 如果這個(gè)東西不一致, 會(huì)炸。-事務(wù)日志目錄設(shè)置不合理。將事務(wù)日志目錄指向一個(gè)IO繁忙的磁盤, 會(huì)導(dǎo)致server始終處于一個(gè)半死不活的狀態(tài);-不正確的java heap size。頻繁的swap操作會(huì)嚴(yán)重拖慢性能. 保守起見, 如果你的機(jī)器有4G內(nèi)存, 把java heap size設(shè)置為3G就好了;-部署的時(shí)候不考慮安全性。建議在生產(chǎn)環(huán)境中合理配置防火墻;五、Zookeeper常見問題匯總1)zookeeper client 3.4.5 ping時(shí)間間隔算法有問題,在遇到網(wǎng)絡(luò)抖動(dòng)等原因?qū)е乱淮蝡ing失敗后會(huì)斷開連接。3.4.6解決了這個(gè)

51、問題 Bug1751。2)zookeeper client如果因?yàn)榫W(wǎng)絡(luò)抖動(dòng)斷開了連接,如果后來(lái)又重連上了,zookeeper client會(huì)自動(dòng)的將之前訂閱的watcher等又全部訂閱一遍,而Zookeeper默認(rèn)對(duì)單個(gè)數(shù)據(jù)包的大小有個(gè)1M的限制,這往往就會(huì)超限,最后導(dǎo)致一直不斷地的重試。這個(gè)問題在較新的版本得到了修復(fù)。Bug7063)拋出UnresolvedAddressException異常導(dǎo)致Zookeeper選舉線程退出,整個(gè)集群無(wú)法再選舉,處于崩潰的邊緣。這個(gè)問題是,某次OPS遷移機(jī)器,將老的機(jī)器回收了,所以老的機(jī)器的IP和機(jī)器名不復(fù)存在,最后拋出UnresolvedAddressE

52、xception這個(gè)異常,而Zookeeper的選舉線程(QuorumCnxManager類里的Listener)只捕獲了IOException,導(dǎo)致該線程退出,該線程一旦退出只要現(xiàn)在的leader出現(xiàn)問題,需要重新選舉,則不會(huì)選出新的leader來(lái),整個(gè)集群就會(huì)崩潰。Bug23194)由于文件損壞導(dǎo)致實(shí)例不能啟動(dòng)ZooKeeper的server進(jìn)程在事務(wù)日志文件被損壞的情況下是起不來(lái)的. 這時(shí)運(yùn)行日志會(huì)說在載入ZooKeeper database時(shí)出現(xiàn)IOException. 這種情況下, 你需要做的是:-通過四字命令stat檢查ensemble中的其它實(shí)例是否正常工作-如果其它實(shí)例正常,

53、那么把當(dāng)前實(shí)例dataDir目錄下的version-2子目錄中的所有文件刪除, 再把dataLogDir下的version-2子目錄下的所有文件刪除, 然后重啟就可以了.這種情況是當(dāng)前實(shí)例的事務(wù)文件損壞, 不能重建內(nèi)存數(shù)據(jù)庫(kù), 刪除掉事務(wù)日志和數(shù)據(jù)庫(kù)快照后, 當(dāng)前的實(shí)例在重啟后會(huì)通過其它實(shí)例拉取內(nèi)在數(shù)據(jù)庫(kù), 重建事務(wù)日志和快照文件.六、Zookeeper中的Znode特性說明在ZooKeeper中,節(jié)點(diǎn)也稱為znode。由于對(duì)于程序員來(lái)說,對(duì)zookeeper的操作主要是對(duì)znode的操作,因此,有必要對(duì)znode進(jìn)行深入的了解。 ZooKeeper采用了類似文件系統(tǒng)的的數(shù)據(jù)模型,其節(jié)點(diǎn)構(gòu)成了

54、一個(gè)具有層級(jí)關(guān)系的樹狀結(jié)構(gòu)。Zookeeper擁有一個(gè)命名空間就像一個(gè)精簡(jiǎn)的文件系統(tǒng),不同的是它的命名空間中的每個(gè)節(jié)點(diǎn)擁有它自己或者它下面子節(jié)點(diǎn)相關(guān)聯(lián)的數(shù)據(jù)。Zookeeper中必須使用絕對(duì)路徑也就是使用“/”開頭。例如,下圖展示了zookeeper節(jié)點(diǎn)的層級(jí)樹狀結(jié)構(gòu)。圖中,根節(jié)點(diǎn) / 包含了兩個(gè)字節(jié)點(diǎn) /module1,/module2,而節(jié)點(diǎn) /module1 又包含了三個(gè)字節(jié)點(diǎn) /module1/app1,/module1/app2,/module1/app3。在zookeeper中,節(jié)點(diǎn)以絕對(duì)路徑表示,不存在相對(duì)路徑,且路徑最后不能以 / 結(jié)尾(根節(jié)點(diǎn)除外)。ZooKeeper以一種類

55、似于文件系統(tǒng)的樹形數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)名稱空間。名稱空間中的每個(gè)節(jié)點(diǎn)都是一個(gè)znode。znode和文件系統(tǒng)的路徑不一樣,在文件系統(tǒng)中,路徑只是一個(gè)名稱,不包含數(shù)據(jù)。而znode不僅是一個(gè)路徑,還攜帶數(shù)據(jù)。此外,znode還維護(hù)了包括版本號(hào)和時(shí)間戳的狀態(tài)信息。通過版本號(hào)和時(shí)間戳信息,可以讓ZooKeeper驗(yàn)證緩存、協(xié)調(diào)每次的更改操作。每當(dāng)znode數(shù)據(jù)發(fā)生更改時(shí),版本號(hào)都會(huì)遞增??蛻舳藱z索znode時(shí),同時(shí)也會(huì)收到關(guān)于該節(jié)點(diǎn)的狀態(tài)信息。當(dāng)客戶端執(zhí)行更改、刪除操作時(shí),它必須提供它正在更改的znode數(shù)據(jù)的版本,如果它提供的版本與數(shù)據(jù)的實(shí)際版本不匹配,則更新將失敗。Zookeeper目錄樹中每個(gè)節(jié)點(diǎn)對(duì)應(yīng)

56、一個(gè)Znode。每個(gè)Znode維護(hù)這一個(gè)屬性,當(dāng)前版本、數(shù)據(jù)版本、建立時(shí)間和修改時(shí)間等,看下圖:Zookeeper就是使用這些屬性來(lái)實(shí)現(xiàn)特殊功能的。當(dāng)一個(gè)客戶端要對(duì)某個(gè)節(jié)點(diǎn)進(jìn)行修改時(shí),必須提供該數(shù)據(jù)的版本號(hào),當(dāng)節(jié)點(diǎn)數(shù)據(jù)發(fā)生變化是其版本號(hào)就會(huì)增加。如下圖:0)Znode節(jié)點(diǎn)特性- Watches:客戶端可以在節(jié)點(diǎn)上設(shè)置Watches(可以叫做監(jiān)視器)。當(dāng)節(jié)點(diǎn)狀態(tài)發(fā)生變化時(shí),就會(huì)觸發(fā)監(jiān)視器對(duì)應(yīng)的操作,當(dāng)監(jiān)視器被觸發(fā)時(shí),zookeeper服務(wù)器會(huì)向客戶端發(fā)送且只發(fā)送一個(gè)通知-數(shù)據(jù)訪問:zookeeper上存儲(chǔ)的數(shù)據(jù)需要被原子性的操作(要么修改成功要么回到原樣),也是就讀操作將會(huì)讀取節(jié)點(diǎn)相關(guān)所有數(shù)據(jù),

57、寫操作也會(huì)修改節(jié)點(diǎn)相關(guān)所有數(shù)據(jù),而且每個(gè)節(jié)點(diǎn)都有自己的ACL。節(jié)點(diǎn)類型:zookeeper中有幾種節(jié)點(diǎn)類型,節(jié)點(diǎn)類型在節(jié)點(diǎn)創(chuàng)建的時(shí)候就被確定且不可改變- 臨時(shí)節(jié)點(diǎn)(EPHEMERAL):臨時(shí)創(chuàng)建的,會(huì)話結(jié)束節(jié)點(diǎn)自動(dòng)被刪除,也可以手動(dòng)刪除,臨時(shí)節(jié)點(diǎn)不能擁有子節(jié)點(diǎn)- 臨時(shí)順序節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL):具有臨時(shí)節(jié)點(diǎn)特征,但是它會(huì)有序列號(hào),分布式鎖中會(huì)用到該類型節(jié)點(diǎn)-持久節(jié)點(diǎn)(PERSISTENT):創(chuàng)建后永久存在,除非主動(dòng)刪除。-持久順序節(jié)點(diǎn)(PERSISTENT_SEQUENTIAL):該節(jié)點(diǎn)創(chuàng)建后持久存在,相對(duì)于持久節(jié)點(diǎn)它會(huì)在節(jié)點(diǎn)名稱后面自動(dòng)增加一個(gè)10位數(shù)字的序列號(hào),這

58、個(gè)計(jì)數(shù)對(duì)于此節(jié)點(diǎn)的父節(jié)點(diǎn)是唯一,如果這個(gè)序列號(hào)大于232-1就會(huì)溢出。1)znode節(jié)點(diǎn)類型根據(jù)節(jié)點(diǎn)的存活時(shí)間,可以對(duì)節(jié)點(diǎn)劃分為持久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn)。節(jié)點(diǎn)的類型在創(chuàng)建時(shí)就被確定下來(lái),并且不能改變。- 持久節(jié)點(diǎn)的存活時(shí)間不依賴于客戶端會(huì)話,只有客戶端在顯式執(zhí)行刪除節(jié)點(diǎn)操作時(shí),節(jié)點(diǎn)才消失。- 臨時(shí)節(jié)點(diǎn)的存活時(shí)間依賴于客戶端會(huì)話,當(dāng)會(huì)話結(jié)束,臨時(shí)節(jié)點(diǎn)將會(huì)被自動(dòng)刪除(當(dāng)然也可以手動(dòng)刪除臨時(shí)節(jié)點(diǎn))。利用臨時(shí)節(jié)點(diǎn)的這一特性,我們可以使用臨時(shí)節(jié)點(diǎn)來(lái)進(jìn)行集群管理,包括發(fā)現(xiàn)服務(wù)的上下線等。 ZooKeeper規(guī)定,臨時(shí)節(jié)點(diǎn)不能擁有子節(jié)點(diǎn)。持久節(jié)點(diǎn)使用命令create可以創(chuàng)建一個(gè)持久節(jié)點(diǎn)create /module

59、1 module1這樣,便創(chuàng)建了一個(gè)持久節(jié)點(diǎn)/module1,且其數(shù)據(jù)為module1。臨時(shí)節(jié)點(diǎn)使用create命令,并加上-e參數(shù),可以創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn)create -e /module1/app1 app1這樣,便創(chuàng)建了一個(gè)臨時(shí)節(jié)點(diǎn) /module1/app1,數(shù)據(jù)為app1。關(guān)閉會(huì)話,然后輸入命令get /module1/app1可以看到有以下提示,說明臨時(shí)節(jié)點(diǎn)已經(jīng)被刪除Node does not exist: /module1/app1順序節(jié)點(diǎn)ZooKeeper中還提供了一種順序節(jié)點(diǎn)的節(jié)點(diǎn)類型。每次創(chuàng)建順序節(jié)點(diǎn)時(shí),zk都會(huì)在路徑后面自動(dòng)添加上10位的數(shù)字(計(jì)數(shù)器),例如 0000000

60、001,0000000002,這個(gè)計(jì)數(shù)器可以保證在同一個(gè)父節(jié)點(diǎn)下是唯一的。在zk內(nèi)部使用了4個(gè)字節(jié)的有符號(hào)整形來(lái)表示這個(gè)計(jì)數(shù)器,也就是說當(dāng)計(jì)數(shù)器的大小超過2147483647時(shí),將會(huì)發(fā)生溢出。順序節(jié)點(diǎn)為節(jié)點(diǎn)的一種特性,也就是,持久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn)都可以設(shè)置為順序節(jié)點(diǎn)。這樣一來(lái),znode一共有4種類型:持久的、臨時(shí)的,持久順序的,臨時(shí)順序的。使用命令create加上-s參數(shù),可以創(chuàng)建順序節(jié)點(diǎn)(-e參數(shù)為創(chuàng)建臨時(shí)節(jié)點(diǎn),如果不帶參數(shù)則創(chuàng)建持久節(jié)點(diǎn))。例如create -s /module1/app app輸出Created /module1/app0000000001便創(chuàng)建了一個(gè)持久順序節(jié)點(diǎn) /mo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論