Zookeeper 運維實踐手冊_第1頁
Zookeeper 運維實踐手冊_第2頁
Zookeeper 運維實踐手冊_第3頁
Zookeeper 運維實踐手冊_第4頁
Zookeeper 運維實踐手冊_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

2、業(yè)務模塊名/zookeeper運行日志輸出目錄:/var/log/業(yè)務模塊名/zookeeperZookeeper所有端口需要提前開通防火墻入站規(guī)則對外服務端口:默認2181,可自定義通信端口:2888,可自定義選舉端口:3888,可自定義autoperge默認關閉,建議自行編寫腳本在業(yè)務低谷期清理快照和事務日志查詢狀態(tài):sh /opt/業(yè)務模塊名/zookeeper/zkServer.sh status啟動服務:sh /opt/業(yè)務模塊名/zookeeper/zkServer.sh start停止服務:sh /opt/業(yè)務模塊名/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最佳實踐必須了解以下ZK知識點,才能熟練地對ZK進行維護:-zookeeper集群里分三種角色: Leader, Follower和Observer。Leader和Follower參與投票,Observer只會聽投票的結(jié)果,不參與投票。-投票集群里的節(jié)點數(shù)要求是奇數(shù)-一個集群

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

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

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

17、不會給Client提供長連接服務,也不負責長連接的心跳,這大大的減輕了核心Group的壓力,因為在實際環(huán)境中,一個Zookeeper集群要為上萬臺機器提供服務,維持長連接和心跳還是要消耗一定的資源的。因為Observer是不參與投票的所以加Observer并不會降低整體的吞吐量,而且Observer掛掉不會影響整個集群的健康。但是這里要注意的是,分Observer Group只能解決部分問題,因為畢竟所有的寫入還是要交給核心Group來處理的,所以對于寫入量特別大的應用來說,還是需要進行集群上的隔離,比如Storm和Kafka就對Zookeeper壓力比較大,你就不能將其與服務發(fā)現(xiàn)的集群放在一

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

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

20、一些定制化的配置寫在這里,而不是直接去修改Zookeeper自帶的腳本。#!/usr/bin/env bashZOO_LOG_DIR=/var/log/kevintest/zookeeper_22181/ #日志文件放置的路徑ZOO_LOG4J_PROP=INFO,ROLLINGFILE #設置日志輪轉(zhuǎn)新版本的zk中是用java.env這個參數(shù)文件來配置的if -f $ZOOCFGDIR/java.env then. $ZOOCFGDIR/java.envfi其中$ZOOCFGDIR/java.env就是設置jvm內(nèi)存大小的文件,這個文件默認情況下是沒有的,需要手動創(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)地址在實際環(huán)境中,我們可能因為各種原因比如機器過保,硬件故障等需要遷移Zookeeper集群,所以Zookeeper的地址是一個很頭痛的事情。這個地址有兩方面,第一個是提供給Client的地址,建議這個地址通過配置的方式下

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

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

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

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

26、布式鎖,這會頻繁的和Zookeeper交互,對Zookeeper壓力較大,而且一旦出現(xiàn)問題影響面廣。但是可以使用粗粒度的鎖(其實leader選舉也是一種鎖)。d)不建議做通用配置的第二個理由是,通用配置要提供給特別多特別多系統(tǒng)使用,而且一些公共配置甚至所有系統(tǒng)都會使用,一旦這樣的配置發(fā)生變更,Zookeeper會廣播給所有的watcher,然后所有Client都來拉取,瞬間造成非常大的網(wǎng)絡流量,引起所謂的驚群。而自己實現(xiàn)通用配置系統(tǒng)的時候,一般會對這種配置采取排隊或分批通知的方式。三、Zookeeper操作命令手冊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登錄后命令行里面的一些簡單操作如下:- 顯示根目錄下、文件: ls / #使用 ls 命令來查看當前 ZooKeeper 中所包含的內(nèi)容- 顯示根目錄下、文件: ls2 / #查看當前節(jié)點數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)- 創(chuàng)建文件,并設置初始內(nèi)容: create /zk test #創(chuàng)建一個新的 znode節(jié)點“ zk ”以及與它關聯(lián)的字符串- 獲取文件內(nèi)容: get /zk #確認 znode 是否包含我們所創(chuàng)建的字符串- 修改文件內(nèi)容: set /zk

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

44、一些字段是與操作系統(tǒng)平臺相關的, 輸出每一行的格式是key t value, 下面是一個示例:# 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ù)文件管理將事務日志文件和

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論