ZooKeepr日志清理【轉】


轉自 :@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是不會自動清理快照和事務日志,需要交給管理員自己來處理。

     正常運行過程中,ZK會不斷地把快照數據和事務日志輸出到這兩個目錄,並且如果沒有人為操作的話,ZK自己是不會清理這些文件的,需要管理員來清理,這里介紹4種清理日志的方法。在這4種方法中,推薦使用第一種方法,對於運維人員來說,將日志清理工作獨立出來,便於統一管理也更可控。畢竟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,可以指定要清理的目錄和需要保留的文件數目,簡單使用如下:

 

 
         
  1. 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

在zookeeper的目錄下新建一個腳本,內容如下(zookeeper bin下面也有zkCleanup.sh腳本,原理一樣,都是調用java類)
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM