Zookeeper 由 Apache Hadoop 的 Zookeeper 子項目發展而來,Google Chubby的一個開源實現。它是一個分佈式應用程序協調服務,提供的功能包括:配置管理,名字服務,提供分佈式同步、隊列管理、集羣管理等。 從設計模式角度來看,是一個基於觀察者模式設計的分佈式服務管理框架,它負責存儲和管理你們都關心的數據,而後接受觀察者的註冊,一旦這些數據的狀態發生變化,Zookeeper 就將負責通知已經在 Zookeeper 上註冊的那些觀察者作出相應的反應,從而實現集羣中相似 Master/Slave 管理模式。html
Zookeeper有兩種運行模式:java
獨立模式(standalone mode):只運行在一臺服務器上,適合測試環境。
複製模式(replicated mode):運行於一個集羣上,適合生產環境,這個計算機集羣被稱爲一個「集合體」(ensemble)node
複製模式的Zookeeper經過複製來實現高可用性,只要集合體中半數以上的機器處於可用狀態,它就可以保證服務繼續。這跟Zookeeper的複製策略有關:Zookeeper確保對znode樹的每個修改都會被複制到集合體中超過半數的機器上。
Zookeeper服務有兩個角色,一個是leader,負責寫服務和數據同步,剩下的是follower,提供讀服務,leader失效後會在follower中從新選舉新的leader。在整個Zookeeper集羣模式下,整個集羣是一個總體,在集羣中的任何一個Zookeeper節點共享整個集羣的服務。linux
環境:算法
操做系統:CentOS Linux release 7.3.1611 (Core)Zookeeper:zookeeper-3.4.12
IP:10.55.2.81-83
Zookeeper下載地址:http://zookeeper.apache.org/releases.html#download數據庫
[root@zk-2-82-0001 soft]# tar -xvf zookeeper-3.4.12.tar.gz [root@zk-2-82-0001 soft]# mv zookeeper-3.4.12 zookeeper [root@zk-2-82-0001 soft]# mv zookeeper /app [root@zk-2-82-0001 soft]# cd /app/zookeeper [root@zk-2-82-0001 zookeeper]# mkdir data [root@zk-2-82-0001 zookeeper]# mv conf/zoo_sample.cfg conf/zoo.cfg [root@zk-2-82-0001 zookeeper]# vim conf/zoo.cfg # The number of milliseconds of each tick tickTime=2000 //Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,每隔tickTime時間就會發送一個心跳,單位毫秒,最小的session過時時間爲tickTime的兩倍,ZK中的其餘時間都是以這個爲倍數的。 # The number of ticks that the initial # synchronization phase can take initLimit=10 //表示容許從服務器(相對於leader來講的客戶端)鏈接到leader並完成數據同步的時間,它是以tickTime的倍數來表示的,也就是從服務器與主服務器完成初始化鏈接和數據同步是可以容忍多少個心跳時間,若是超過這個時間不能完成初始化鏈接的創建則表示鏈接失敗。默認是10.若是你的數據量過大並且從服務器數量也多那麼這個值能夠設置大一點。。總的時間長度就是 initLimit * tickTime 秒。 #LeaderServes 用於配置Leader服務器是否接受客戶端的鏈接,是否容許Leader向客戶端直接提供服務,默認是能夠的。 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 //配置 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 syncLimit * tickTime 秒 ,若是在這個時間內從服務器不能與主服務器通訊,則表示該從服務器失敗。默認爲5.若是集羣環境網絡不佳能夠調整大一點。 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/app/zookeeper/data //Zookeeper 保存數據的數據庫快照的位置,默認是/tmp/zookeeper,快照文件並非實時的,運行一段時間纔會有。 dataLogDir=/app/zookeeper/logs //事務日誌日誌路徑,若沒提供的話則用dataDir。zookeeper的持久化都存儲在這兩個目錄裏,對ZK的讀和寫都是在內存中完成,因此速度很是快,可是若是中止ZK再啓動數據仍是須要保證的,因此就會有這樣一個路徑用來保存事務日誌,當ZK再次啓動時加載到內存重演過程來恢復數據。dataLogDir裏是放到的順序日誌(WAL),指定的目錄下有version-2文件夾(下有log.1文件),這個目錄肯定了當前事務日誌的版本號,當下次某個版本的ZK對其進行修改時,版本號發生變化。日誌文件大小爲64M,若是數據比較多就會有多個這樣大小的文件。而dataDir裏放的是內存數據結構的snapshot,便於快速恢復。爲了達到性能最大化,通常建議把dataDir和dataLogDir分到不一樣的磁盤上,建議將事物日誌保存到單獨的磁盤並且是高速磁盤。由於爲了一致性,ZK對於客戶端的寫入請求在返回以前就要把本次操做寫入到事物日誌中 # the port at which the clients will connect clientPort=2181 //Zookeeper服務器監聽的端口,以接受客戶端的訪問請求。 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 限制鏈接到ZK上的客戶端數量,而且限制併發鏈接數量,它經過IP來區分不一樣客戶端。值爲0表示不作任何限制。注意這裏的限制是針對單臺客戶端到服務器的,並非控制全部客戶端鏈接的。默認60. #minSessionTimeout=120 最小會話超時時間,默認爲tickTime的2倍。不建議把這個值設置的比tickTime小。客戶端鏈接到ZK時若是在這個最小時間內沒有和ZK聯繫則標記爲超時,也就是說會斷開。 #maxSessionTimeout=2400 最大會話超時時間,默認爲20倍的最小會話超時時間。不建議把這個值設置的比tickTime小。客戶端鏈接到ZK時若是在這個最大時間內沒有和ZK聯繫則標記爲超時。因此上面的參數和這個參數組成了一個時間範圍,也就是客戶端鏈接ZK時若是在這個時間範圍內沒有成功鏈接則會標記爲超時。若是客戶端設置的時間範圍不在這個服務器設置的範圍內,則會被強制應用服務器設置的範圍。 # # 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 自動清理日誌,該參數設置保留多少個快照文件和對應的事務日誌文件,默認爲3,若是你設置的小於3則會被自動的調整爲3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 自動清理日誌,該參數設置自動清理頻率,上面的參數配套使用。客戶端在和ZK服務器交互中服務器會產生不少日誌,並且ZK會將內存中的數據做爲快照保存起來,並且這些數據不會自動刪除,那麼磁盤空間就會被佔用,能夠設置這2個參數來自動清理,不過若是ZK服務器比較繁忙併且遇上刪除日誌任務就會影響性能,因此通常不設置這個自動清理,而是在ZK訪問量少的時候經過Linux的定時任務來處理。0表示不開啓自動清理功能。 #globalOutstandingLimit ZK的最大請求堆積數,客戶端請求比較多,爲了防止客戶端資源過分消耗,服務器必須限制同時處理的請求數量。 #preAllocSize 用於配置ZK事務日誌預先分配的空間,默認是64M #snapCount 用於配置相鄰兩次快照之間的事物日誌次數,默認是10萬。也就是10萬條事務以後作一次快照同時結轉事務日誌 #clientPortAddres 這個參數針對多網卡的ZK服務器,容許爲每一個IP地址指定不一樣的監聽端口。 #fsync.warningthresholdms 用於設置ZK服務器事物日誌同步操做時消耗時間的報警閾值,若是實際消耗時長超過這個時間日誌就會記錄。 #electionAlg 用於配置Leader選舉算法,目前只有一種選舉算法,因此不用配置。 #cnxTimeout 用於Leader選舉時各個服務器之間進行的TCP鏈接建立超時時間,默認爲5. #forceSync 這個參數用於配置ZK服務器是否在事物提交時是否強制寫入磁盤(LINUX的延遲寫入),默認是YES。 #jute.maxbuffer 用於配置單個數據節點上最大數量,默認是1MB。一般不須要改動該參數,可是由於Zookeeper不適合存放太多數據因此有時候須要把值改小 #skipACL 是否跳過ACL檢查,默認是no,也就是會對全部客戶端鏈接進行acl檢查。 server.1=10.55.2.81:2888:3888 server.2=10.55.2.82:2888:3888 server.3=10.55.2.83:2888:3888 // server.n n是一個數字,表示這個是第幾號服務器;「=」號後面是對應幾號服務器的IP地址,第一個端口2888是集羣中從服務器(follower)鏈接到主服務器(leader)的端口,也就是做爲leader時使用的,其餘從服務器都鏈接到主服務器的這個端口;第二個端口3888表示的是進行leader選舉時使用的端口。
initLimit、syncLimit、LeaderServes、server.x爲集羣配置,
每一個節點的zoo.cfg配置都同樣,直接複製過去就能夠。單機安裝和集羣配置基本同樣,只是集羣配置文件內容會多"server.id=host:port:port" 配置,以及dataDir目錄裏myid的文件,apache
二、日誌配置vim
編輯$ZK_HOME/bin/zkEnv.sh,找到配置ZOO_LOG_DIR以及ZOO_LOG4J_PROP的位置(大概在Line56,Line61)設計模式
if [ "x${ZOO_LOG_DIR}" = "x" ] then #配置zookeeper日誌輸出存放路徑 ZOO_LOG_DIR="/home/xxx/zookeeper-2181/logs" fi if [ "x${ZOO_LOG4J_PROP}" = "x" ] then #配置日誌輸出級別,這裏把幾個級別一併配上 ZOO_LOG4J_PROP="INFO,CONSOLE,ROLLINGFILE,TRACEFILE" fi
編輯Log4J配置文件log4j.properties,此部分參考Log4J配置api
# Define some default values that can be overridden by system properties zookeeper.root.logger=INFO, CONSOLE, ROLLINGFILE, TRACEFILE zookeeper.console.threshold=INFO zookeeper.log.dir=. zookeeper.log.file=zookeeper.log zookeeper.log.threshold=ERROR zookeeper.tracelog.dir=. zookeeper.tracelog.file=zookeeper_trace.log log4j.rootLogger=${zookeeper.root.logger}
服務器狀態:
LOOKING: 尋找Leader,當服務器出現這個狀態時,它會認爲當前集羣沒有Leader,所以須要進入選舉
FOLLOWING: 跟隨者狀態,表示當前是Follower角色
LEADING: 領導者狀態,表示當前爲Leader角色
OBSERVING:觀察者狀態,表示當前服務器是Observer角色
三、添加myid文件
除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個標識本身身份也就是本身的ID值文件 myid,這個文件在zoo.cfg裏dataDir指定的目錄下,這個文件裏面就只有一個數字,這個數字和server.n的n保持一致,該值範圍能夠是1-255之間,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷究竟是那個 server。
[root@zk-2-82-0001 zookeeper]# echo "2">data/myid
其餘兩個節點相似
四、安裝jdk
[root@zk-2-82-0001 soft]# rpm -ivh jdk-8u151-linux-x64.rpm
五、啓動服務
[root@zk-2-82-0001 zookeeper]# cd bin/ [root@zk-2-82-0001 bin]# ls README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh zookeeper.out [root@zk-2-82-0001 bin]# ./zkServer.sh start ZooKeeper JMX enabled by default Using config: /app/zookeeper/bin/../conf/zoo.cfg Error contacting service. It is probably not running. //少於三臺不會正常工做,三臺都啓動次,而後刪除pid文件再啓動, zookeeper.out裏有不少有用的提示 [root@zk-2-82-0001 bin]# rm -rf ../conf/zoo_sample.cfg [root@zk-2-82-0001 bin]# ./zkServer.sh start ZooKeeper JMX enabled by default Using config: /app/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@zk-2-82-0001 bin]#
使用jps -m能夠查詢進程,Zookeeper的進程爲QuorumPeerMain
[root@zk-2-82-0001 bin]# jps -m 1744 WrapperSimpleApp CloudResetPwdUpdateAgent 2528 QuorumPeerMain /app/zookeeper/bin/../conf/zoo.cfg 21745 Jps -m [root@zk-2-82-0001 bin]#
六、節點狀態查看
[root@zk-2-82-0001 bin]# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /app/zookeeper/bin/../conf/zoo.cfg Mode: leader [root@zk-2-82-0001 bin]# [root@zk-2-81 bin]# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /app/zookeeper/bin/../conf/zoo.cfg Mode: follower [root@zk-2-81 bin]# [root@zk-2-82-0002 bin]# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /app/zookeeper/bin/../conf/zoo.cfg Mode: follower [root@zk-2-82-0002 bin]#
日誌
[root@zk-2-82-0001 bin]# tail -500f zookeeper.out 2018-06-21 15:24:59,618 [myid:] - INFO [main:QuorumPeerConfig@136] - Reading configuration from: /app/zookeeper/bin/../conf/zoo.cfg 2018-06-21 15:24:59,626 [myid:] - INFO [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.81 to address: /10.55.2.81 2018-06-21 15:24:59,626 [myid:] - INFO [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.83 to address: /10.55.2.83 2018-06-21 15:24:59,626 [myid:] - INFO [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.82 to address: /10.55.2.82 2018-06-21 15:24:59,626 [myid:] - INFO [main:QuorumPeerConfig@398] - Defaulting to majority quorums 2018-06-21 15:24:59,628 [myid:2] - INFO [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3 2018-06-21 15:24:59,628 [myid:2] - INFO [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0 2018-06-21 15:24:59,628 [myid:2] - INFO [main:DatadirCleanupManager@101] - Purge task is not scheduled. 2018-06-21 15:24:59,635 [myid:2] - INFO [main:QuorumPeerMain@130] - Starting quorum peer 2018-06-21 15:24:59,639 [myid:2] - INFO [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory 2018-06-21 15:24:59,642 [myid:2] - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181 2018-06-21 15:24:59,646 [myid:2] - INFO [main:QuorumPeer@1158] - tickTime set to 2000 2018-06-21 15:24:59,646 [myid:2] - INFO [main:QuorumPeer@1204] - initLimit set to 10
七、ZooKeeper訪問
[root@zk-2-82-0001 bin]# ./zkCli.sh -server 10.55.2.82:2181 //鏈接loader節點,寫入數據驗證集羣 Connecting to 10.55.2.82:2181 2018-06-21 18:15:33,887 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT ...... WATCHER:: WatchedEvent state:SyncConnected type:None path:null //回車 [zk: 10.55.2.82:2181(CONNECTED) 0] ls / //顯示根目錄下、文件,用ls /命令查看目錄狀況,發現只有一個zookeeper目錄。 [zookeeper] [zk: 10.55.2.82:2181(CONNECTED) 0] help //運行幫助命令 ZooKeeper -server host:port cmd args stat path [watch] set path data [version] ls path [watch] delquota [-n|-b] path ls2 path [watch] setAcl path acl setquota -n|-b val path history redo cmdno printwatches on|off delete path [version] sync path listquota path rmr path get path [watch] create [-s] [-e] path data acl addauth scheme auth quit getAcl path close connect host:port [zk: 10.55.2.82(CONNECTED) 0] ls2 / //顯示根目錄下、文件,查看當前節點數據並能看到更新次數等數據 [zookeeper, 20180621] cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x100000004 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 2 [zk: 10.55.2.82:2181(CONNECTED) 1] create /20180621 "201806211950" //建立文件並設置初始內容,建立一個新的 znode節點「 20180621 」以及與它關聯的字符串 Created /20180621 [zk: 10.55.2.82:2181(CONNECTED) 2] ls / [zookeeper, 20180621] [zk: 10.55.2.82:2181(CONNECTED) 3] get /20180621 //獲取文件內容,確認 znode 是否包含咱們所建立的字符串 201806211950 cZxid = 0x100000004 ctime = Thu Jun 21 19:50:05 CST 2018 mZxid = 0x100000004 mtime = Thu Jun 21 19:50:05 CST 2018 pZxid = 0x100000004 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 12 numChildren = 0 [zk: 10.55.2.82(CONNECTED) 3] set /20180621 "justin 51cto" //修改文件內容,對 20180621 所關聯的字符串進行設置 cZxid = 0x100000004 ctime = Thu Jun 21 19:50:05 CST 2018 mZxid = 0x10000000b mtime = Thu Jun 21 20:23:43 CST 2018 pZxid = 0x100000004 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 12 numChildren = 0 [zk: 10.55.2.82(CONNECTED) 4] get /20180621 justin 51cto cZxid = 0x100000004 ctime = Thu Jun 21 19:50:05 CST 2018 mZxid = 0x10000000b mtime = Thu Jun 21 20:23:43 CST 2018 pZxid = 0x100000004 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 12 numChildren = 0 [zk: 10.55.2.82(CONNECTED) 5] delete /20180621 //修改文件內容,將剛纔建立的 znode 刪除;若是要 刪除目錄(即便非空)使用:rmr 目錄 [zk: 10.55.2.82:2181(CONNECTED) 4] quit Quitting... 2018-06-21 19:50:28,534 [myid:] - INFO [main:ZooKeeper@687] - Session: 0x200004654110000 closed 2018-06-21 19:50:28,535 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@521] - EventThread shut down for session: 0x200004654110000 [root@zk-2-82-0001 bin]#
此時,登錄到其餘節點也能夠看到。在data目錄裏,
snapshot.0:就是咱們存放數據在內存中的快照,zookeeper服務剛啓動時須要用它來恢復數據
log.100000001:日誌文件,默認存放在數據目錄中。
八、ssh遠程開啓Zookeeper服務
[root@zk-2-82-0001 bin]# ssh 10.55.2.81 "source /etc/profile;/app/zookeeper/bin/zkServer.sh status"
這樣咱們就能夠經過腳原本同時管理3個節點了
九、四字命令
經過四字命令更方便地獲取服務端信息, 四字命令的用法:echo 四字命令|netcat localhost 2181 ,經常使用的四字:
conf:輸出Zookeeper服務器配置的詳細信息
cons:輸出全部鏈接到服務器的客戶端的徹底的鏈接/會話的詳細信息。包括「接收/發送」的包數量、會話ID、操做延遲、最後的操做執行等
dump:輸出未經處理的會話和臨時節點
envi:輸出關於服務器運行環境的詳細信息
reqs:輸出未經處理的請求
ruok:測試服務是否處於正確狀態。如果則會返回「imok」,不然不作任何反應
stat:輸出關於性能和鏈接的客戶端的列表。(經過此命令也可查看節點是leader仍是follower)
wchs:輸出服務器watch的詳細信息
wchc:經過session列出服務器watch的詳細信息,它的輸出是一個與watch相關的會話的列表
wchp:經過路徑列出服務器watch的詳細信息,它輸出一個與session相關的路徑
mntr:輸出一些Zookeeper運行時信息,經過對這些返回結果的解析能夠達到監控效果
netcat下載地址:http://sourceforge.net/projects/netcat/files/netcat/
[root@zk-2-82-0001 soft]# echo conf|netcat 10.55.2.81 2181
數據及日誌維護
Zookeeper的數據文件存放在配置中指定的dataDir中,每一個數據文件名都以snapshot開頭,每一個數據文件爲zookeeper某個時刻數據全量快照。在zookeeper中,對數據的更新操做,包括建立節點、更新節點內容、刪除節點都會記錄事務日誌;客戶端對ZK的更新操做都是永久的,不可回退的。爲作到這點,ZK會將每次更新操做以事務日誌的形式寫入磁盤,寫入成功後纔會給予客戶端響應。zookeeper在完成若干次事務日誌(snapCount)後會生成一次快照,把當前zk中的全部節點的狀態以文件的形式dump到硬盤中,生成一個snapshot文件。這裏的事務次數是能夠配置,默認是100000個。
zookeeper服務器會產生三類日誌:事務日誌、快照日誌和log4j日誌。
事務日誌
事務日誌指zookeeper系統在正常運行過程當中,針對全部的更新操做,在返回客戶端「更新成功」的響應前,zookeeper會保證已經將本次更新操做的事務日誌已經寫到磁盤上,只有這樣,整個更新操做纔會生效。
在dataLogDir指定的目錄下存在一個文件夾version-2,該文件夾中保存着事物日誌文件:
[root@zk-2-82-0001 data]# cd version-2/ [root@zk-2-82-0001 version-2]# ls acceptedEpoch currentEpoch log.100000001 [root@zk-2-82-0001 version-2]#
日誌文件的命名規則爲log.,表示寫入該日誌的第一個事務的ID,十六進制表示。
事務日誌可視化
zookeeper的事務日誌爲二進制文件,不能經過vim等工具直接訪問。能夠經過zookeeper自帶的jar包讀取事務日誌文件。執行以下命令:
[root@zk-2-82-0001 zookeeper]# java -classpath .:lib/slf4j-api-1.7.25.jar:zookeeper-3.4.12.jar org.apache.zookeeper.server.LogFormatter data/version-2/log.100000001 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. ZooKeeper Transactional Log File with dbid 0 txnlog format version 2 6/21/18 6:15:33 PM CST session 0x1000045eba30000 cxid 0x0 zxid 0x100000001 createSession 30000 6/21/18 6:59:45 PM CST session 0x1000045eba30000 cxid 0x2 zxid 0x100000002 closeSession null 6/21/18 7:47:53 PM CST session 0x200004654110000 cxid 0x0 zxid 0x100000003 createSession 30000 6/21/18 7:50:05 PM CST session 0x200004654110000 cxid 0x1 zxid 0x100000004 create '/20180621,#323031383036323131393530,v{s{31,s{'world,'anyone}}},F,1 6/21/18 7:50:28 PM CST session 0x200004654110000 cxid 0x5 zxid 0x100000005 closeSession null 6/21/18 7:51:01 PM CST session 0x1000045eba30001 cxid 0x0 zxid 0x100000006 createSession 30000 6/21/18 7:53:30 PM CST session 0x1000045eba30001 cxid 0x4 zxid 0x100000007 closeSession null 6/21/18 8:18:55 PM CST session 0x200004654110001 cxid 0x0 zxid 0x100000008 createSession 30000 6/21/18 8:21:15 PM CST session 0x200004654110002 cxid 0x0 zxid 0x100000009 createSession 30000 6/21/18 8:21:36 PM CST session 0x200004654110001 cxid 0x0 zxid 0x10000000a closeSession null 6/21/18 8:23:43 PM CST session 0x200004654110002 cxid 0x6 zxid 0x10000000b setData '/20180621,#6a757374696e20353163746f,1 6/21/18 8:25:09 PM CST session 0x200004654110002 cxid 0xa zxid 0x10000000c delete '/20180621 6/21/18 8:34:46 PM CST session 0x200004654110002 cxid 0xb zxid 0x10000000d closeSession null EOF reached after 13 txns. [root@zk-2-82-0001 zookeeper]#
快照日誌
zookeeper的數據在內存中是以樹形結構進行存儲的,而快照就是每隔一段時間就會把整個DataTree的數據序列化後存儲在磁盤中,這就是zookeeper的快照文件。在dataDir指定的目錄下存在一個文件夾version-2,該文件夾中保存着快照日誌文件:
[root@zk-2-82-0002 version-2]# ls acceptedEpoch currentEpoch log.100000001 snapshot.100000000 [root@zk-2-82-0002 version-2]#
zookeeper快照文件的命名規則爲snapshot.,其中表示zookeeper觸發快照的那個瞬間,提交的最後一個事務的ID。
日誌清理
在zookeeper 3.4.0之後,zookeeper提供了自動清理snapshot和事務日誌功能,經過配置zoo.cfg下的autopurge.snapRetainCount和autopurge.purgeInterval這兩個參數實現日誌文件的定時清理。
autopurge.snapRetainCount這個參數指定了須要保留的文件數目,默認保留3個;
autopurge.purgeInterval這個參數指定了清理頻率,單位是小時,須要填寫一個1或者更大的數據,0表示不開啓自動清理功能。
[root@zk-2-82-0001 bin]# grep -in "autopurge" ../conf/zoo.cfg 21:# administrator guide before turning on autopurge. 26:#autopurge.snapRetainCount=3 29:#autopurge.purgeInterval=1 [root@zk-2-82-0001 bin]#
或者經過命令去按期清理:
#!/bin/bash #snapshot file dir dataDir=/opt/zookeeper/zkdata/version-2 #tran log dir dataLogDir=/opt/zookeeper/zkdatalog/version-2 #Leave 66 files count=66 count=$[$count+1] ls -t $dataLogDir/log. | tail -n +$count | xargs rm -f ls -t $dataDir/snapshot. | tail -n +$count | xargs rm -f
刪除對應兩個目錄中的文件,保留最新的66個文件,能夠將他寫到crontab中,設置爲天天凌晨2點執行一次就能夠了。ZK本身也已經寫好了腳本,在bin/zkCleanup.sh中,因此直接使用這個腳本也是能夠執行清理工做的。