Linux Rsync 增量同步與快速刪除

增量同步

rsync [args] SRC [DEST] 情形:同時維護着兩份不同的data_center,但以old_data_center爲標準。因爲權限的緣故沒有開啓rsync自動同步,只是每隔一段時間手動同步一下。SRCDEST都是採用mount形式,如果每一次都完整地copy,耗時很長,這時候就想到採用增量同步的方法,因爲兩份data_center同時由不同人維護,所以內容略有不同,data_center同步的時候不光要完全同步old_data_center的所有內容,而且要刪除自身多餘的內容,保持完全一致。

http://static.cyblogs.com/1559267-20190509170938551-832776092.png

rsync -a 
--delete 
--progress /old_vip_data_center/test_envs/trainer/resource /vip_data_center/test_envs/trainer/resource/

--delete: 刪除DEST端存在但是SRC端不存在的文件,如果不使用此參數,則DEST端會同步SRC端的文件,但DEST端已有的文件不受影響。

快速刪除大量文件

  1. 先建一個空目錄,隨便位置

    mkdir /local/empty_dir
    
  2. 用rsync刪除目標目錄

    rsync --delete-before -avH --progress /local/empty_dir/ /local/trainer_test/
    

trainer_test清空之後可以再用rm -rf trainer_test刪除

注意不要忘了文件夾最後的/

rsync提供了一些跟刪除相關的參數

rsync --help | grep delete
--del an alias for --delete-during
--delete-before receiver deletes before transfer (default)

選項說明: -a 遞歸方式傳輸文件,並保持文件屬性 --delete-before 接收者在傳輸之前進行刪除操作 --progress 在傳輸時顯示傳輸過程 -- 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性 -H 保持硬連接的文件 -v 詳細輸出模式 -stats 給出某些文件的傳輸狀態

不過在使用上面的命令進行清理時,存在一個問題,清空後,目標目錄的權限會和源目錄的權限一樣。如:/tmp/emptyroot:root,而maildrop之前是postfix:postdrop ,執行之後也會maildrop目錄的權限也會變成root:root 。由於-a權限是-rlptogD幾個參數的集合,所以可以將og(owner:group)兩個參數去掉。清空時自動保持之前的目錄權限,如下:

rsync --delete -rlptD /tmp/empty/ /var/spool/postfix/maildrop/

爲什麼rsync這麼快呢?

rm刪除內容時,將目錄的每一個條目逐個刪除(unlink),需要循環重複操作很多次;

rsync刪除內容時,建立好新的空目錄,替換掉老目錄,基本沒開銷。

If you want to conquer fear, don't sit home and think about it. Go out and get busy.

實戰

今天因爲用代碼生成SQL腳本的時候,本來是說100W的數據生成一個的,結果因爲一個運算符的問題導致了生成上百萬的小文件。

while ((line = br.readLine()) != null) {
    if (count < skipHeadCount) {
        count++;
        continue;
    }
    // 每MAX_SIZE就會生成一個,MAX_SIZE=1000000
    int fileExtName = (count - skipHeadCount) / MAX_SIZE; // 當時種類count - skipHeadCount忘記打括號了
    if (fileExtName > currentFileExtName) {
        bw.flush();
        currentFileExtName = fileExtName;
        bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(String.format(fileOutputPath, currentFileExtName)))));
    }
    String formatStr = genService.format(line);
    bw.write(formatStr);
    bw.newLine();
    log.info("count:{}", count);
    count++;
}

刪除的時候會報錯

Argument list too long

實戰後發現效率貴高的一種方式:

http://static.cyblogs.com/WechatIMG461.png

參考地址

如果大家喜歡我的文章,可以關注個人訂閱號。歡迎隨時留言、交流。如果想加入微信羣的話一起討論的話,請加管理員簡棧文化-小助手(lastpass4u),他會拉你們進羣。

簡棧文化服務訂閱號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章