【问题标题】:Stream rdiff - delta differencing?流 rdiff - 增量差异?
【发布时间】:2011-02-16 20:33:33
【问题描述】:

我有一个使用 rdiff 进行在线备份的产品。目前发生的情况是:

  1. 将文件复制到暂存区(这样文件在我们处理时不会消失或被修改)

  2. 散列原始文件,并计算 rdiff 签名(用于差异差异) 计算 rdiff delta 差异(如果我们没有之前的版本,则跳过此步骤)

  3. 压缩和加密产生的差异差异

目前,这些阶段的执行方式各不相同。最终结果是我们多次迭代文件。对于小文件,这没什么大不了的(尤其是考虑到磁盘缓存),但对于大文件(10 甚至 100 GB)来说,这是一个真正的性能杀手。

我想将所有这些步骤整合到一个读/写通道中。

为此,我们必须能够以流方式执行上述所有步骤,同时仍保留所有“输出”——文件哈希、rdiff 签名、压缩和加密的增量差异文件。这将需要从源文件中读取一个数据块(比如 100k?),然后在内存中迭代文件以更新哈希、rdiff 签名、进行增量差分,然后将输出写入压缩/加密输出流.目标是大大减少我们所做的磁盘抖动量。

目前我们使用 rdiff.exe(它是底层 librsync 库之上的一个薄层)来计算签名并生成二进制增量。这意味着这些是在一个单独的过程中完成的,并且是一次性完成的,而不是流式的。

如何使用 librsync 库完成我需要的工作?

【问题讨论】:

    标签: python diff backup-strategies delta


    【解决方案1】:

    您可以完全跳过第 1 步。该文件在打开时不能被删除,并且在打开它时选择适当的锁定标志也可以防止它被修改。例如,CreateFile 函数采用 dwShareMode 参数。

    在开始创建 rdiff 增量之前,您需要计算整个 rdiff 签名。您可以通过计算签名来避免读取整个文件,然后每次对文件的每个(例如)100 MB 块进行增量。这样会损失一些压缩效率*。您也可以考虑从 rdiff 切换到 xdelta,这样可以在输入中一次性创建一个 delta 文件。

    压缩和加密可以在计算增量的同时进行。如果压缩和加密由单独的程序完成,它们通常允许从标准输入读取并写入标准输出。这可以通过批处理文件中的管道最简单地使用,例如:

    rdiff signature oldfile oldfile.sig
    rdiff delta oldfile.sig newfile | gzip -c | gpg -e -r ... > compressed_encrypted_delta
    

    如果您在程序中使用库进行压缩/加密,则需要选择支持流式操作的库。

    *如果数据在文件中四处移动,则会损失很多效率。如果有人在 10 GB 文件前添加 100 MB,rdiff 将生成大约 100 MB 的 delta 文件。一次以 100 MB 或更少的块完成 rdiff 将产生大约 10 GB 的增量。 200 MB 的块将产生大约 5 GB 的增量,因为每个块中只有一半的数据来自旧版本文件的相应块。

    【讨论】:

    • 你是什么意思,“适当的锁定标志”?我该如何做到这一点?另外,您说“压缩和加密可以与计算增量并行完成”,这是如何完成的?我只是不明白(经过数小时的尝试实现这一点)这是怎么可能的。你会怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多