轉自 :@ni掌櫃nileader@gmail.com 地址
數據文件管理
默認情況下,ZK的數據文件和事務日志是保存在同一個目錄中,建議是將事務日志存儲到單獨的磁盤上。
1 數據目錄
ZK的數據目錄包含兩類文件:
A、myid – 這個文件只包含一個數字,和serverid對應。
B、snapshot. - 按zxid先后順序的生成的數據快照。
集群中的每台ZK server都會有一個用於惟一標識自己的id,有兩個地方會使用到這個id:myid文件和zoo.cfg文件中。myid文件存儲在dataDir目錄中,指定了當前server的server id。在zoo.cfg文件中,根據server id,配置了每個server的ip和相應端口。Zookeeper啟動的時候,讀取myid文件中的server id,然后去zoo.cfg 中查找對應的配置。
zookeeper在進行數據快照過程中,會生成snapshot文件,存儲在dataDir目錄中。文件后綴是zxid,也就是事務id。(這個zxid代表了zk觸發快照那個瞬間,提交的最后一個事務id)。注意,一個快照文件中的數據內容和提交第zxid個事務時內存中數據近似相同。僅管如此,由於更新操作的冪等性,ZK還是能夠從快照文件中恢復數據。數據恢復過程中,將事務日志和快照文件中的數據對應起來,就能夠恢復最后一次更新后的數據了。
2 事務日志目錄
dataLogDir目錄是ZK的事務日志目錄,包含了所有ZK的事務日志。正常運行過程中,針對所有更新操作,在返回客戶端“更新成功”的響應前,ZK會確保已經將本次更新操作的事務日志寫到磁盤上,只有這樣,整個更新操作才會生效。每觸發一次數據快照,就會生成一個新的事務日志。事務日志的文件名是log.,zxid是寫入這個文件的第一個事務id。
3 文件管理
不同的zookeeper server生成的snapshot文件和事務日志文件的格式都是一致的(無論是什么環境,或是什么樣的zoo.cfg 配置)。因此,如果某一天生產環境中出現一些古怪的問題,你就可以把這些文件下載到開發環境的zookeeper中加載起來,便於調試發現問題,而不會影響生產運行。另外,使用這些較舊的snapshot和事務日志,我們還能夠方便的讓ZK回滾到一個歷史狀態。
另外,ZK提供的工具類LogFormatter能夠幫助可視化ZK的事務日志,幫助我們排查問題,關於事務日志的可以化,請查看這個文章《可視化zookeeper的事務日志》.
需要注意的一點是,zookeeper在運行過程中,不斷地生成snapshot文件和事務日志,但是不會自動清理它們,需要管理員來處理。(ZK本身只需要使用最新的snapshot和事務日志即可)關於如何清理文件,上面章節“日常運維”有提到。
在使用zookeeper過程中,我們知道,會有dataDir和dataLogDir兩個目錄,分別用於snapshot和事務日志的輸出(默認情況下只有dataDir目錄,snapshot和事務日志都保存在這個目錄中)。
關於這兩個目錄的詳細說明,請看《ZooKeeper管理員指南》)。
ZK在完成若干次事務日志之后(在ZK中,凡是對數據有更新的操作,比如創建節點,刪除節點或是對節點數據內容進行更新等,都會記錄事務日志),ZK會觸發一次快照(snapshot),將當前server上所有節點的狀態以快照文件的形式dump到磁盤上去,即snapshot文件。這里的若干次事務日志是可以配置的,默認是100000,具體參看下文中關於配置參數“snapCount”的介紹。
考慮到ZK運行環境的差異性,以及對於這些歷史文件,不同的管理員可能有自己的用途(例如作為數據備份),因此默認ZK是不會自動清理快照和事務日志,需要交給管理員自己來處理。
https://issues.apache.org/jira/browse/ZOOKEEPER-957
http://zookeeper-user.578899.n2.nabble.com/PurgeTxnLog-td6304244.html
第一種,也是運維人員最常用的,寫一個刪除日志腳本,每天定時執行即可:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
#snapshot file dir
dataDir=/home/nileader/taokeeper/zk_data/version-2
#tran log dir
dataLogDir=/home/nileader/taokeeper/zk_log/version-2
#zk log dir
logDir=/home/nileader/taokeeper/logs
#Leave 60 files
count=60
count=$[
$count
+1]
ls -t
$dataLogDir
/
log
.* | tail -n +
$count
| xargs rm -f
ls -t
$dataDir
/snapshot.* | tail -n +
$count
| xargs rm -f
ls -t
$logDir
/zookeeper.
log
.* | tail -n +
$count
| xargs rm -f
|
以上這個腳本定義了刪除對應兩個目錄中的文件,保留最新的60個文件,可以將他寫到crontab中,設置為每天凌晨2點執行一次就可以了。
第二種,使用ZK的工具類PurgeTxnLog,它的實現了一種簡單的歷史文件清理策略,可以在這里看一下他的使用方法:http://zookeeper.apache.org/doc/r3.4.3/api/index.html,可以指定要清理的目錄和需要保留的文件數目,簡單使用如下:
-
java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir><snapDir> -n <count>
第三種,對於上面這個Java類的執行,ZK自己已經寫好了腳本,在bin/zkCleanup.sh中,所以直接使用這個腳本也是可以執行清理工作的。
第四種,從3.4.0開始,zookeeper提供了自動清理snapshot和事務日志的功能,通過配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 這兩個參數能夠實現定時清理了。這兩個參數都是在zoo.cfg中配置的:
autopurge.purgeInterval 這個參數指定了清理頻率,單位是小時,需要填寫一個1或更大的整數,默認是0,表示不開啟自己清理功能。
autopurge.snapRetainCount 這個參數和上面的參數搭配使用,這個參數指定了需要保留的文件數目。默認是保留3個。
本文出自 “ni掌櫃的IT專欄” 博客,請務必保留此出處http://nileader.blog.51cto.com/1381108/932156
------------------------------------------------------------------------------------------------------
網上有一種方法,是優化了第二種方法,用java的清理命令做了一個定時任務。還有列出了第四種方法的運用,即zookeeper3.4版本之后,可以在zoo.cfg下配置清理, 具體如下:
-----------------------------
zookeeper定時清理log
shell_dir=$(cd "$(dirname "$0")"; pwd) cd $shell_dir && java -cp zookeeper-3.4.5.jar:lib/log4j-1.2.15.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:conf/log4j.properties org.apache.zookeeper.server.PurgeTxnLog /zoo-datadir/ /zoo-datadir/ -n 5
其中/zoo-datadir對應dataDir和dataLogDir,-n代表保留的snapshot的數量,默認是3,加入crontab,每天執行crontab -e
0 */1 * * * /root/zookeeper/zookeeper-3.4.5/purgeTxnLog.sh
service crond restart
如果是zookeeper3.4之后的版本,可以通過修改zoo.cfg配置文件的形式,zookeeper自動清理
# 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=1
E-mail: huahuiyang@gmail.com https://cn.linkedin.com/pub/huahui-yang/91/13a/105
