Linux Rsync 增量同步与快速删除

简栈文化 2020/6/30 9:56:26

增量同步 rsync [args] SRC [DEST] 情形:同时维护着两份不同的data_center,但以old_data_center为标准。因为权限的缘故没有开启rsync自动同步,只是每隔一段时间手动同步一下。SRC和DEST都是采用mount形式,如果每一次都完整地copy,耗时很长,这时候就想到采用增量同步…

增量同步

rsync [args] SRC [DEST] 情形:同时维护着两份不同的data_center,但以old_data_center为标准。因为权限的缘故没有开启rsync自动同步,只是每隔一段时间手动同步一下。SRCDEST都是采用mount形式,如果每一次都完整地copy,耗时很长,这时候就想到采用增量同步的方法,因为两份data_center同时由不同人维护,所以内容略有不同,data_center同步的时候不光要完全同步old_data_center的所有内容,而且要删除自身多余的内容,保持完全一致。

https://user-gold-cdn.xitu.io/2020/6/29/172ff25e93810baf?w=418&h=274&f=png&s=9094

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
复制代码

实战后发现效率贵高的一种方式:

https://user-gold-cdn.xitu.io/2020/6/29/172ff25e93818675?w=1756&h=244&f=png&s=266673

参考地址

  • www.cnblogs.com/sayiqiu/p/1…

如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管理员简栈文化-小助手(lastpass4u),他会拉你们进群。

简栈文化服务订阅号

随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[Linux Rsync 增量同步与快速删除]http://www.zyiz.net/tech/detail-141563.html

上一篇:【每日鲜蘑】IntelliJ IDEA优化配置

下一篇:云图说|管理与部署域家族云图说重磅推出:一图在手,谁与争锋!

赞(0)

共有 条评论 网友评论

验证码: 看不清楚?
    关注微信小程序
    程序员编程王-随时随地学编程

    扫描二维码或查找【程序员编程王】

    可以随时随地学编程啦!

    技术文章导航 更多>
    扫一扫关注最新编程教程