1. 程式人生 > >ZooKeeper檢視事務日誌

ZooKeeper檢視事務日誌

zoo.cfg中可以通過dataLogDir來配置zookeeper的事務日誌的輸出目錄。但是這些日誌檔案是二進位制的,無法通過普通的檢視名單看。需要通過org.apache.zookeeper.server.LogFormatter。

 命令如下:

java -cp :/usr/local/zookeeper/zookeeper/lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper/zookeeper/zookeeper-3.4.11.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/zookeeper/dataLogDir/version-2/log.1

ZooKeeper日誌與快照檔案簡單分析

有用過Zookeeper的都知道zoo.cfg配置檔案中有dataDir配置項用於儲存資料,不過可能有些人不太清楚這個目錄具體儲存的是那些資料,預設情況下這個目錄是用於儲存Log(事務日誌)與Snapshot(快照)資料,但是Zookeeper還提供了一個用於Log儲存目錄的配置項dataLogDir而dataDir用於儲存Snapshot資料,Log檔案寫入頻率非常高如果有對Snapshot檔案經常操作或是對Zookeeper效能要求非常高可以為Log與Snapshot分別配置不同的目錄儲存;本文主要是結合原始碼分析Zookeeper的Log與Snapshot檔案,這裡我分別為Log與Snapshot配置了不同的儲存目錄:dataDir=D:/zookeeper-3.4.6/data 、dataLogDir=D:/zookeeper-3.4.6/data/log;   事務日誌與Snapshot的操作是在org.apache.zookeeper.server.persistence包中,這裡也主要是分析該包下的各個類;在FileTxnSnapLog類中看到了它在我們為事務日誌與Snapshot配置的目錄下又建立了一個子目錄version-2同時又指定為該兩種檔案的儲存目,在裡面還可以看到FileTxnLog、FileSnap類分別為處理事務日誌和Snapshot的;

事務日誌檔案

  在Zab協議中我們知道每當有接收到客戶端的事務請求後Leader與Follower都會將把該事務日誌存入磁碟日誌檔案中,該日誌檔案就是這裡所說的事務日誌,下面將詳細分析該日誌檔案;   FileTxnLog類用於處理事務日誌檔案這裡就從此類開始,在該類中看到了preAllocSize、TXNLOG_MAGIC、VERSION、lastZxidSeen、dbId等這樣的屬性:   1. preAllocSize: 預設預分配的日誌檔案的大小65536*1024位元組   2. TXNLOG_MAGIC:日誌檔案魔數為ZKLG   3. VERSION:日誌檔案版本號2   4. lastZxidSeen

:最後的ZXID

  類中還有一個靜態程式碼塊用於讀取配置項中的preAllocSize,也就是說預分配的日誌檔案大小是可配置的,接下來看看該類中最重要的一個方法append,該方法主要功能是建立新的日誌檔案與往日誌檔案中追加新的事務日誌記錄;從中可以看到日誌檔案的相關資訊

  1. 檔名為log,字尾為十六進位制的ZXID   2. 日誌檔案頭有:magic、version、dbid   3. 建立檔案後分配的檔案大小為:67108864位元組+16位元組,其中16位元組為檔案頭   4. 使用Adler32作為日誌檔案的校驗碼   5. 當日志文件寫滿預分配大大小後就擴充日誌檔案一倍大小

正如從程式碼中看到的一樣version-2目錄中儲存著Zookeeper的事務日誌檔案,有看到log.10、log.4f檔案,這些都是Zookeeper的事務日誌檔案;這兩個檔案都有一個特點就是檔名為log.xx,大小為64MB檔案的字尾xx時間最早的 數字總是比最晚的小。如果有了解過Zookeeper的ZAB協議那肯定知道它為每一個事務請求都分配了一個事務ID也就是ZXID,上面章節也知道了xx就是Zookeeper處理請求的ZXID,該ZXID為log檔案中第一條事務的ZXID;ZXID規則為前32 位元組為Leader週期,後32位元組為事務請求序列,所以通過事務日誌就可以輕鬆的知道當前的Leader週期與每個檔案所屬的Leader週期;

日誌檔案視覺化   事務日誌檔案中儲存的都是二進位制的資料,如果不借助其他工具是很難知道里面儲存的內容的,Zookeeper也給我們提供了這樣的工具,在org.apache.zookeeper.server包中的LogFormatter類為我們提供了把事務日誌檔案以我們看得懂的資料輸出的功能,這裡就使用該工具輸出該事務日誌檔案,並解釋該資料;  LogFormatter工具的使用方法: java -cp ../../../zookeeper-3.4.6.jar;../../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.1

日誌分析:   第一行:ZooKeeper Transactional Log File with dbid 0 txnlog format version 2   上面的程式碼分析中有說到每個日誌檔案都有一個這就是那裡所說的日誌頭,這裡magic沒有輸出,只輸出了dbid還有version;

  第二行:15-8-12 下午03時59分53秒 session 0x14f20ea71c10000 cxid 0x0 zxid 0x1 createSession 4000   這也就是具體的事務日誌內容了,這裡是說xxx時間有一個sessionid為0x14f20ea71c10000、cxid為0x0、zxid為0x1、型別為createSession、超時時間為4000毫秒

  第三行:15-8-12 下午03時59分54秒 session 0x14f20ea71c10000 cxid 0x1 zxid 0x2 create '/solinx0000000000,#736f6c696e78,v{s{31,s{'world,'anyone}}},F,1   sessionID為0x14f20ea71c10000,cxid:0x01、zxid:0x02、建立了一個節點路徑為:/solinx0000000000、節點內容為:#736f6c696e78(經過ASCII,實際內容為solinx)、acl為world:anyone任何人都可以管理該節點、節點不是ephemeral節點的、父節點子版本:1

  第四行:15-8-12 下午04時15分56秒 session 0x14f20ea71c10000 cxid 0x0 zxid 0x3 closeSession null   這裡是說xxx時間有一個sessionid為0x14f20ea71c10000、cxid為0x0、zxid為0x3、型別為closeSession

快照檔案

  快照檔案的處理在FileSnap類中,與事務日誌檔案一樣快照檔案也一樣有SNAP_MAGIC、VERSION、dbId這些,這作用也只是用來標識這是一個快照檔案;Zookeeper的資料在記憶體中是以DataTree為資料結構儲存的,而快照就是每間隔一段時間Zookeeper就會把整個DataTree的資料序列化然後把它儲存在磁碟中,這就是Zookeeper的快照檔案,快照檔案是指定時間間隔對資料的備份,所以快照檔案中資料通常都不是最新的,多久抓一個快照這也是可以配置的snapCount配置項用於配置處理幾個事務請求後生成一個快照檔案;   與事務日誌檔案一樣快照檔案也是使用ZXID作為快照檔案的字尾,在FileTxnSnapLog類中的save方法中生成檔案並呼叫FileSnap類序列化DataTree資料並且寫入快照檔案中;

快照檔案視覺化   與日誌檔案一樣Zookeeper也為快照檔案提供了視覺化的工具org.apache.zookeeper.server包中的SnapshotFormatter類,接下來就使用該工具輸出該事務日誌檔案,並解釋該資料;  SnapshotFormatter工具的使用方法: 

java -cp ../../zookeeper-3.4.6.jar;../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.17

快照分析   快照檔案就很容易看得懂了,這就是Zookeeper整個節點資料的輸出;

  第一行:ZNode Details (count=11):   ZNode節點數總共有11個

  /cZxid = 0x00000000000000   ctime = Thu Jan 01 08:00:00 CST 1970   mZxid = 0x00000000000000   mtime = Thu Jan 01 08:00:00 CST 1970   pZxid = 0x00000000000016   cversion = 7   dataVersion = 0   aclVersion = 0   ephemeralOwner = 0x00000000000000   dataLength = 0

這麼一段資料是說,根節點/:   cZxid:建立節點時的ZXID   ctime:建立節點的時間   mZxid:節點最新一次更新發生時的zxid   mtime:最近一次節點更新的時間   pZxid:父節點的zxid   cversion:子節點更新次數   dataVersion:節點資料更新次數   aclVersion:節點acl更新次數   ephemeralOwner:如果節點為ephemeral節點則該值為sessionid,否則為0   dataLength:該節點資料的長度

快照檔案的末尾:   Session Details (sid, timeout, ephemeralCount):   0x14f211584840000, 4000, 0   0x14f211399480001, 4000, 0   這裡是說當前抓取快照檔案的時間Zookeeper中Session的詳情,有兩個session超時時間都是4000毫秒ephemeral節點為0;