zookeeper服務器會產生三類日志:事務日志、快照日志和log4j日志。
在zookeeper默認配置文件zoo.cfg(可以修改文件名)中有一個配置項dataDir,該配置項用于配置zookeeper快照日志和事務日志的存儲地址。在官方提供的默認參考配置文件zoo_sample.cfg中,只有dataDir配置項。其實在實際應用中,還可以為事務日志專門配置存儲地址,配置項名稱為dataLogDir,在zoo_sample.cfg中并未體現出來。在沒有dataLogDir配置項的時候,zookeeper默認將事務日志文件和快照日志文件都存儲在dataDir對應的目錄下。建議將事務日志(dataLogDir)與快照日志(dataLog)單獨配置,因為當zookeeper集群進行頻繁的數據讀寫操作是,會產生大量的事務日志信息,將兩類日志分開存儲會提高系統性能,而且,可以允許將兩類日志存在在不同的存儲介質上,減少磁盤壓力。
log4j用于記錄zookeeper集群服務器運行日志,該日志的配置地址在conf/目錄下的log4j.properties文件中,該文件中有一個配置項為“zookeeper.log.dir=.”,表示log4j日志文件在與執行程序(zkServer.sh)在同一目錄下。當執行zkServer.sh 時,在該文件夾下會產生zookeeper.out日志文件。下面主要介紹事務日志與快照日志。
事務日志
事務日志指zookeeper系統在正常運行過程中,針對所有的更新操作,在返回客戶端“更新成功”的響應前,zookeeper會保證已經將本次更新操作的事務日志已經寫到磁盤上,只有這樣,整個更新操作才會生效。
根據上文所述,可以通過zoo.cfg文件中的dataLogDir配置項找到事物日志存儲地點:
dataDir=/home/kafka/data/zookeeper
在datalog/目錄下存在一個文件夾version-2,該文件夾中保存著事物日志文件:
log.504e25800
日志文件的命名規則為log.**,文件大小為64MB,**表示寫入該日志的第一個事務的ID,十六進制表示。
事務日志可視化
zookeeper的事務日志為二進制文件,不能通過vim等工具直接訪問。其實可以通過zookeeper自帶的jar包讀取事務日志文件。
首先將libs中的slf4j-api-1.6.1.jar文件和zookeeper根目錄下的zookeeper-3.4.9.jar文件復制到臨時文件夾tmplibs中,然后執行如下命令,將日志內容輸出至a.txt文件中:
java -classpath .:slf4j-api-1.6.1.jar:zookeeper-3.4.6.jar org.apache.zookeeper.server.LogFormatter /home/kafka/data/zookeeper/version-2/log.504e25800 > a.txt

**日志分析**
第一行: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,1sessionID 為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
**快照日志**
zookeeper的數據在內存中是以樹形結構進行存儲的,而快照就是每隔一段時間就會把整個DataTree的數據序列化后存儲在磁盤中,這就是zookeeper的快照文件。
zookeeper快照日志的存儲路徑同樣可以在zoo.cfg中查看,如上文截圖所示。訪問dataDir路徑可以看到version-2文件夾:
dataDir=/home/kafka/data/zookeeper
zookeeper快照文件的命名規則為snapshot.**,其中**表示zookeeper觸發快照的那個瞬間,提交的最后一個事務的ID。
與日志文件一樣Zookeeper也為快照文件提供了可視化的工具org.apache.zookeeper.server包中的SnapshotFormatter類,接下來就使用該工具輸出該事務日志文件,并解釋該數據;
SnapshotFormatter工具的使用方法:
java -classpath .:slf4j-api-1.6.1.jar:zookeeper-3.4.6.jar org.apache.zookeeper.server.SnapshotFormatter /home/kafka/data/zookeeper/version-2/snapshot.501154259 |more


**快照分析**
快照文件就很容易看得懂了,這就是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;
日志清理
在zookeeper 3.4.0以后,zookeeper提供了自動清理snapshot和事務日志功能,通過配置zoo.cfg下的autopurge.snapRetainCount和autopurge.purgeInterval這兩個參數實現日志文件的定時清理。
autopurge.snapRetainCount這個參數指定了需要保留的文件數目,默認保留3個;
autopurge.purgeInterval這個參數指定了清理頻率,單位是小時,需要填寫一個1或者更大的數據,默認0表示不開啟自動清理功能。
- 一、日常運維腳本
- 1.1 批量創建用戶并賦予sudo權限
- 1.2 批量主機建立互信
- 1.3create_images.sh
- 1.4monitor.sh
- 1.5ftp腳本
- 1.6格式化分區
- 1.7簡單的遠程執行腳本
- 二、常用服務使用
- 1 ceph (分布式文件系統)
- 1.1 ceph 簡介
- 1.2 準備環境
- 1.3 開始部署
- 1.4 cephfs掛載
- 1.5 RBD塊存儲
- 1.6 object 對象存儲
- 1.7 集群擴展
- 1.7.1 增加刪除MON
- 1.7.2 增加刪除OSD
- 1.7.3 刪除MDS
- 注意事項
- 遇到的問題
- 1.8ceph查找數據文件
- 1.9卸載并清理環境
- 2、mysql (數據庫)
- 2.1 搭建
- 2.2 使用教程
- 2.2.1 mysql基礎配置
- 2.2.1.1 用戶權限管理
- 2.2.1.2用戶資源限制
- 2.2.1.3 密碼管理
- 2.2.1.4用戶lock
- 2.2.2mysql語法詳解
- 2.2.1建庫、表語句
- 2.2.2.2 插入 insert
- 2.2.2.3更新 update
- 2.2.2.4刪除 delete
- 2.2.2.5查詢 select
- 2.2.6視圖 索引 view index
- 2.2.7 修改 alert
- 2.2.2.8清理 truncate drop
- 2.2.9重命名 rename
- 示例語句
- 2.2.3mysql常用函數
- 2.3.1 對比操作符統概
- 2.3.2對比操作符詳解
- 2.3.3邏輯操作符
- 2.2.4分配操作符
- 2.2.5流程控制函數
- 2.2.6字符串函數
- 2.2.7字符串對比函數
- 2.2.8數字函數
- 2.2.9日期和時間函數
- 2.2.10聚合/格式轉換函數
- 2.2.11 子查詢
- 示例語句
- 2.2.4 mysql 高級應用
- 2.2.4.1 存儲過程 函數
- 2.2.4.2流程控制
- 2.2.4.3游標
- 2.2.4.4觸發器
- 課堂練習
- 2.2.2.5 數據庫設計
- 2.2.5.1 數據類型
- 2.2.5.2存儲引擎
- 2.2.6Innodb內核
- 1、innodb事務和多版本控制
- 2、體系結構
- 3、InnoDB配置
- 4、buffer pool設置
- 5、其他配置
- innodb限制
- 2.7 字符集
- 2.8鎖機制和事務
- 2.8.1鎖機制
- 2.8.2事務
- 2.9分區
- 2.9.1 自動分區
- 2.10復制
- 2.11mysql搬移數據目錄
- 2.12組復制 GR
- 簡介
- 搭建
- 2.3日常運維
- 2.3.1定時任務
- 2.4mycat
- 2.4.1 報錯分析
- 2.4.2 修改字符集
- 2.11 mycat使用
- 2.5遇到問題
- 2.5.1 表名庫名忽略大小寫
- 3、PAAS平臺搭建
- 問題匯總
- 1、docker
- 2、日常運維
- 3.1 Kubernetes
- 3.1 kubernetes 高版本搭建
- 4、GlusterFS搭建
- 5、MooseFS搭建
- 5.1搭建
- 5.2運維
- 5.2.1 mfs日志解析
- 5.2.2清理mfs的垃圾數據
- 5.2.3元數據故障恢復
- 5.2.4 MFS優化
- 5.2.5 配置機架感知
- 5.2.6 客戶端工具集
- 6、集群切換命令
- 7、ntp服務
- 8、monggoDB
- 8.1搭建單機
- 2、搭建集群及分片
- 9、MariaDB Galera Cluster
- 9.1源碼安裝MariaDB
- 9.2galera cluster 優劣
- 9.3 rpm安裝mariadb
- 10 HAproxy1.7搭建
- 11、sysbench 搭建使用
- 0.5版本
- 12 percona-xtradb-cluster
- 13http服務相關
- 13.1 http狀態碼解析
- 14 zookeeper
- 14.1 zookeeper日志查看
- 14.2 配置解析
- 14.3 優化
- 15搭建私有pip源
- 16/var/log的日志文件解釋
- 15 ansible的搭建及使用
- 15.1 搭建
- 15.2 使用說明
- 16. 搭建本地yum源
- zookeeper
- 優化
- 四、開發語言
- 1、GO語言
- 1.1go簡介
- 1.1.1hello_world初識GO
- 1.1.2并發介紹
- 1.1.3 chan介紹
- 1.1.4多返回值
- 1.2go基礎
- 1.2.1數據類型
- 1.2.2 go基礎結構
- 1.2.3 const及變量介紹
- 1.2.3os和time介紹
- 1.2.4 字符串
- 1.2.5條件判斷
- 1.2.6 homework
- go--help
- 1.3 go基礎2
- 1.3.1 數組 array
- 1.3.2切片 slice
- 1.3.3 時間和日期
- 1.3.4指針類型
- 1.3.5函數
- 1.3.6可變參數
- 1.3.7 defer
- 1.3.8遞歸
- 1.9閉包
- 1.10 map
- 1.11 sort
- 1.12 struct 結構體
- 2.perl語言
- 2.1 安裝lib包
- 3 python
- 1.語言基礎
- 2、編程教學
- 2.1變量和序列
- 2.2 條件語句