zookeeper 清理snapshot及事務日誌

風靈使發表於2018-07-28

在使用zookeeper過程中,我們知道,會有dataDirdataLogDir兩個目錄,分別用於snapshot和事務日誌的輸出(預設情況下只有dataDir目錄,snapshot和事務日誌都儲存在這個目錄中,關於這兩個目錄的詳細說明,請看《ZooKeeper管理員指南》)。

第一種,也是運維人員最常用的,寫一個刪除日誌指令碼,每天定時執行即可:

#!/bin/bash

#snapshot file dir
dataDir=/user/upload/zookeeper/version-2
#tran log dir
dataLogDir=/user/upload/zookeeper/version-2
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點執行一次就可以了。

crontab -e
2 2 * * * /bin/bash /root/clean_zook_log.sh > /dev/null 2>&1

第二種,使用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.snapRetainCountautopurge.purgeInterval 這兩個引數能夠實現定時清理了。這兩個引數都是在zoo.cfg中配置的:

  • autopurge.purgeInterval 這個引數指定了清理頻率,單位是小時,需要填寫一個1或更大的整數,預設是0,表示不開啟自己清理功能。
  • autopurge.snapRetainCount 這個引數和上面的引數搭配使用,這個引數指定了需要保留的檔案數目。預設是保留3個。

通過配置 autopurge.snapRetainCountautopurge.purgeInterval 這兩個引數能夠實現定時清理了。
這兩個引數都是在zoo.cfg中配置的,將其前面的註釋去掉,根據需要修改日誌保留個數:
這裡寫圖片描述

    tickTime=2000  
    initLimit=10  
    syncLimit=5  
    dataDir=/usr/upload/zookeeper/version-2
    dataLogDir=/usr/upload/zookeeper/logs  
    clientPort=2181  
    autopurge.snapRetainCount=20  
    autopurge.purgeInterval=48  
    server.1=u04rtv01.yaya.corp:2888:3888  
    server.2=u04rtv02.yaya.corp:2888:3888  
    server.3=u04rtv03.yaya.corp:2888:3888  
    server.4=u04rtv04.yaya.corp:2888:3888  
    server.5=u04rtv05.yaya.corp:2888:3888  

此處我們的配置就是:保留48小時內的日誌,並且保留20個檔案

相關文章