跳转到主要内容

由rsync启发的快速大文件同步

项目描述

https://travis-ci.org/xolox/python-pdiffcopy.svg?branch=master https://coveralls.io/repos/xolox/python-pdiffcopy/badge.svg?branch=master

pdifcopy程序通过执行增量传输并在多个CPU核心上分配其工作,以闪电般的速度在Linux服务器之间同步大型二进制数据文件。它目前在Ubuntu Linux上的Python 2.7、3.5+和PyPy(2.7)上进行了测试,但预计在大多数Linux系统上都可以工作。

状态

虽然pdifcopy的第一个原型是在2019年6月开发的,但直到2020年3月,作为开源项目发布的第一个版本。

有很多功能和改进我想添加,但更重要的是,在考虑将alpha标签更改为beta或成熟之前,这个项目需要实际使用一段时间。

安装

pdiffcopy包可在PyPI上获取,这意味着安装应该非常简单

$ pip install 'pdiffcopy[client,server]'

实际上,安装Python包有众多方式(例如,按用户site-packages目录虚拟环境或仅全局安装)并且我无意在这里讨论这些,所以如果这让你感到害怕,那么在回到这些说明之前先了解一下你的选项吧 😉。

方括号(clientserver)之间的名称被称为“额外功能”,它们允许你选择是否安装客户端依赖项、服务器依赖项或两者都安装。

命令行

用法: pdiffcopy [OPTIONS] [SOURCE, TARGET]

通过执行delta传输并将工作分散到多个CPU核心,以极快的速度在Linux服务器之间同步大型二进制数据文件。

预期SOURCE和TARGET参数之一是本地文件的路径名,另一个参数是提供远程pdiffcopy服务器位置和远程文件名的URL。文件数据将从SOURCE读取并写入TARGET。

如果没有给出位置参数,则启动服务器。

支持选项

选项

描述

-b--block-size=BYTES

自定义delta传输的块大小。可以是普通整数(字节)或像5K、1MiB这样的表达式。

-m--hash-method=NAME

自定义delta传输的哈希方法(默认为‘sha1’,但支持Python hashlib模块提供的所有哈希方法)。

-W--whole-file

禁用delta传输算法(跳过哈希计算并无条件下载所有块)。

-c--concurrency=COUNT

更改并行块哈希/复制操作的数量。

-n--dry-run

扫描源文件和目标文件之间的差异,报告相似性索引,但不要将任何更改的块写入目标。

-B--benchmark=COUNT

通过更改目标文件(必须是本地文件)并重新同步其内容来评估delta传输的有效性。此过程重复COUNT次,相似性有所不同。最后打印概述。

-l--listen=ADDRESS

在指定的IP:PORT或PORT上监听。

-v--verbose

增加日志详细程度(可重复)。

-q--quiet

减少日志详细程度(可重复)。

-h--help

显示此信息并退出。

基准测试

命令行界面提供了一种简单的方法来评估delta传输实现的有效性,并将其与rsync进行比较。以下章节中的表格基于该基准测试。

低并发

并发性:

4个CPU核心上的6个进程

磁盘:

磁存储(较慢)

文件大小

1.79 GiB

下表显示了在两个裸机服务器上对1.79 GiB数据文件的基准测试结果,这两个服务器各自有四个CPU核心和旋转磁盘,其中pdiffcopy以六个并发执行[1]

变化量

数据大小

pdiffcopy

rsync

10%

183 MiB

3.20秒

38.55秒

20%

366 MiB

4.15秒

44.33秒

30%

549 MiB

5.17秒

49.63秒

40%

732 MiB

6.09秒

53.74秒

50%

916 MiB

6.99秒

57.49秒

60%

1.07 GiB

8.06秒

1分钟和0.97秒

70%

1.25 GiB

9.06秒

1分钟和2.38秒

80%

1.43 GiB

10.12秒

1分钟和4.20秒

90%

1.61 GiB

10.89秒

1分钟和3.80秒

100%

1.79 GiB

12.05秒

1分钟和4.14秒

高并发

并发性:

48个CPU核心上的10个进程

磁盘:

NVMe(较快)

文件大小

5.5 GiB

以下是基于5.5 GB数据文件的基准测试,该数据文件在两个裸机服务器之间同步,每个服务器有48个CPU核心和高端NVMe磁盘,其中pdiffcopy以十个并发执行

变化量

数据大小

pdiffcopy

rsync

10%

562 MiB

4.23秒

49.96秒

20%

1.10 GiB

6.76秒

1分钟和2.38秒

30%

1.65 GiB

9.43秒

1分钟和13.73秒

40%

2.20 GiB

12.41秒

1分钟和19.67秒

50%

2.75 GiB

14.54秒

1分钟和25.86秒

60%

3.29 GiB

17.21秒

1分钟和26.97秒

70%

3.84 GiB

19.79秒

1分钟和27.46秒

80%

4.39 GiB

23.10秒

1分钟和26.15秒

90%

4.94 GiB

25.19秒

1分钟和21.96秒

100%

5.43 GiB

27.82秒

1分钟和19.17秒

这个基准测试显示了pdiffcopy通过在大量CPU核心上运行如何提升其性能。请注意,变化量越小,pdiffcopy相对于rsync的优势就越大。这是因为pdiffcopy同时使用许多CPU核心来计算本地和远程文件之间的差异。此操作只需要读取,并且在现代NVMe磁盘上并行化得非常好。

愚蠢并发

并发性:

48个CPU核心上的20个进程

磁盘:

NVMe(较快)

文件大小

5.5 GiB

如果您看了上面的高并发基准测试,注意到了可用的CPU核心数量,并且想知道进一步增加并发性是否会有所不同,本节就是为您准备的。由于我投入了开发pdiffcopy并使其能够在多个CPU核心上运行的精力,所以我好奇地重新运行了高并发基准测试,使用了20个进程而不是10个。以下是结果

变化量

数据大小

pdiffcopy

rsync

10%

562 MiB

3.80秒

49.71秒

20%

1.10 GiB

6.25秒

1分钟和3.37秒

30%

1.65 GiB

8.90秒

1分钟和12.40秒

40%

2.20 GiB

11.44秒

1分钟和19.57秒

50%

2.75 GiB

14.21秒

1分钟和25.43秒

60%

3.29 GiB

16.45秒

1分钟和28.12秒

70%

3.84 GiB

19.05秒

1分钟和28.34秒

80%

4.39 GiB

21.95秒

1分钟和25.49秒

90%

4.94 GiB

24.60秒

1分钟和22.27秒

100%

5.43 GiB

26.42秒

1分钟18.73秒

如您所见,将并发性从10增加到20确实使基准测试略快,然而这种差距非常小,几乎不值得麻烦。我认为这意味着这些服务器上的NVMe磁盘使用8-12个写进程可以或多或少地饱和。

限制

虽然受到rsync的启发,但目标绝对不是与rsync功能完全相同。目前,只能传输单个文件,并且只复制文件数据,而不是元数据。这是一个能工作的概念验证,但很有限。虽然我可能想添加对目录树和文件元数据的同步支持,因为这很方便,但我的意图绝对不是在同步大型目录树领域与rsync竞争,因为我很可能会失败。

错误处理目前非常有限,使用Ctrl-C中断程序可能会让您陷入一群拒绝关闭的愤怒的多进程工作者中😝。说真的,连续按几次Ctrl-C应该能退出,否则尝试按Ctrl-\(这是一个反斜杠,应该发送QUIT信号)。

历史

2019年6月,我发现自己处于一个想要快速同步大量二进制数据文件(一组非常大的总容量达数百GB的MySQL *.ibd 文件)的情况,这些文件是我可以利用的丰富的计算资源(48个CPU核心、NVMe磁盘、捆绑式网络接口等等)。

我花了很多时间尝试并行运行多个rsync进程,但是少量非常大的文件“堵塞了管道”,不管我做什么。这就是我意识到rsync实际上非常不适合的原因,这对我是令人失望的,因为rsync长期以来一直是我解决Linux服务器上即兴问题的首选程序之一。

无论如何,我决定向自己证明,我所拥有的硬件可以做得比rsync好得多。在一周的周末原型开发后,我有了可以超越rsync(尽管它是用Python编写的,并使用HTTP作为传输)的某个东西😁。在这周末,我决定我的原型值得作为一个开源项目发布,然而直到几个月后我才有时间这么做。

关于名称

pdiffcopy这个名字是为了作为一个(可能有些晦涩的)缩写“并行差异复制”

  • 并行,因为它是为了在多个CPU核心上运行。

  • 差异,因为使用了增量传输机制。

但主要是我需要一个短且独特的名字,比如rsync,这样搜索这个项目时就能找到这个项目,而不是其他 dozen 个项目 😇。

联系

最新版本的 pdiffcopy 可在 PyPIGitHub 上找到。文档托管在 Read the Docs 上,包括一个 变更日志。如有错误报告,请 GitHub 上创建一个问题。如果您有任何问题或建议,请随时通过 peter@peterodding.com 发送电子邮件给我。

许可协议

本软件采用 MIT 许可协议 许可。

© 2020 Peter Odding。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

pdiffcopy-1.0.1.tar.gz (30.4 kB 查看哈希值)

上传时间 源代码

构建分发

pdiffcopy-1.0.1-py2.py3-none-any.whl (26.8 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面