如何优化跨多个对象存储系统的数据传输
随着公司对基于云的存储解决方案越来越依赖,确保拥有适当的工具和技术来有效管理其大数据是至关重要的。在之前的帖子中(例如,这里和这里),我们探讨了从云存储中检索数据的几种不同方法,并展示了它们在不同类型的任务中的有效性。我们发现,最优工具可以根据特定任务的不同(例如,文件格式,数据文件的大小,数据访问模式)以及我们希望优化的指标(例如,延迟,速度或成本)而有所不同。在本文中,我们将探讨另一种流行的基于云的存储管理工具 – 有时被称为“云存储的瑞士军刀” – rclone命令行实用程序。rclone支持超过70个存储服务提供商,支持类似于供应商特定存储管理应用程序(例如Amazon S3的AWS CLI和Google Storage的gsutil)的功能。但它的性能是否足够好以成为一个可行的替代方案?在哪些情况下rclone将成为选择的工具?在下面的几节中,我们将演示rclone的用法,评估其性能,并强调其在特定用例中的价值-在不同的对象存储系统之间传输数据。
免责声明
本文绝不意味着取代官方rclone文档。也不意味着对使用rclone或任何其他我们应该提到的工具的认可。您基于云数据管理的最佳选择将大大取决于您项目的细节,并应按照全面的,用例特定的测试进行选择。请确保根据您阅读本文时的最新可用工具重新评估我们所提出的论述。
使用Rclone从云存储中检索数据
下面的命令行使用rclone sync将云对象存储路径的内容与本地目录进行同步。此示例演示了Amazon S3存储服务的使用,但也可以很容易地使用其他云存储服务。
rclone sync -P \ --transfers 4 \ --multi-thread-streams 4 \ S3store:my-bucket/my_files ./my_files
rclone命令具有许多标志,用于编程其行为。-P标志输出数据传输的进度,包括传输速率和总时间。在上面的命令中,我们包含了两个(众多)可以影响rclone运行时性能的控件:transfers标志确定并发下载的最大文件数,而multi-thread-streams确定用于传输单个文件的最大线程数。在这里,我们将两者都保持默认值(4)。
rclone的功能依赖于适当定义rclone配置文件。下面我们展示了命令行中使用的远程S3存储对象位置的定义。
[S3store] type = s3 provider = AWS access_key_id = <id> secret_access_key = <key> region = us-east-1
现在我们已经看到了rclone的作用,接下来的问题是它是否提供了超过其他云存储管理工具的价值,比如流行的AWS CLI。在接下来的两个章节中,我们将评估rclone在两个我们在之前的文章中详细探讨过的场景中的性能,分别是1)下载2GB文件和2)下载数百个1MB文件。
案例1:下载大文件
以下命令行使用AWS CLI从Amazon S3下载一个2GB的文件。这只是我们之前在一篇文章中评估的众多方法之一。我们使用linux的time命令来测量性能。
time aws s3 cp s3://my-bucket/2GB.bin .
报告的下载时间大约为26秒(即约79 MB/s)。请注意,此值是在我们自己的本地PC上计算的,可能因运行环境而异。等效的rclone copy命令如下:
rclone sync -P S3store:my-bucket/2GB.bin .
在我们的设置中,我们发现rclone的下载时间比标准的AWS CLI慢了两倍以上。通过适当调整rclone控制标志,很有可能可以显著提高性能。
案例2:下载大量小文件
在这个案例中,我们评估下载800个相对较小(每个1MB)文件的运行时性能。在之前的一个博文中,我们在流式数据样本传输到深度学习训练工作负载的上下文中讨论了这个案例,并展示了s5cmd beast模式的卓越性能。在beast模式下,我们创建一个包含对象文件操作列表的文件,s5cmd使用多个并行工作线程(默认为256)来执行这些操作。下面是s5cmd beast模式的示例:
time s5cmd --run cmds.txt
cmds.txt文件包含如下800行:
cp s3://my-bucket/small_files/<i>.jpg <local_path>/<i>.jpg
s5cmd命令平均用时9.3秒(对十次试验取平均)。
Rclone支持与s5cmd的beast模式类似的功能,可以通过files-from命令行选项来实现。下面我们使用256个传输并发值运行rclone copy来处理我们的800个文件,以匹配s5cmd的默认并发设置。
rclone -P --transfers 256 --files-from files.txt S3store:my-bucket /my-local
files.txt文件包含如下800行:
small_files/<i>.jpg
rclone copy处理我们的800个文件的平均时间为8.5秒,略低于s5cmd(对十次试验取平均)。
我们承认到目前为止所展示的结果可能不足以使您优先选择rclone而不是您现有的工具。在下一节中,我们将描述一个使用案例,突出了rclone的潜在优势之一。
对象存储系统之间的数据传输
现如今,开发团队在多个对象存储中维护数据已经不再是罕见的事情。这样做的动机可能是为了防止存储故障,或是决定使用多个云服务提供商的数据处理服务。例如,您在AI开发中可能需要通过使用Amazon S3中的数据在AWS上训练模型,并在Microsoft Azure中使用存储在Azure Storage中的相同数据进行数据分析。此外,您可能还希望在本地存储基础设施(如FlashBlade、Cloudian或VAST)中保留一份数据副本。这些情况要求能够以安全、可靠和及时的方式在多个对象存储之间传输和同步数据。
一些云服务提供商为此类目的提供了专用服务。但是,这些服务并不总能满足您项目的具体需求,或者可能无法提供您所期望的控制水平。例如,Google Storage Transfer在指定存储文件夹内移动所有数据方面表现出色,但(截至本文撰写时)不支持从中传输特定文件子集。
我们还可以考虑将现有的数据管理应用于此目的。但问题是,AWS CLI和s5cmd等工具(截至本文撰写时)不支持为源存储和目标存储系统指定不同的访问设置和安全凭证。因此,迁移存储位置之间的数据需要将其传输到中间(临时)位置。在下面的命令中,我们结合使用s5cmd和AWS CLI,通过系统内存并使用Linux管道将文件从Amazon S3复制到Google Storage:
s5cmd cat s3://my-bucket/file \ | aws s3 cp --endpoint-url https://storage.googleapis.com --profile gcp - s3://gs-bucket/file
虽然这是一种合法但笨拙的传输单个文件的方式,但实际上,我们可能需要能够传输数百万个文件。为了支持这一点,我们需要添加一个额外的层来生成和管理多个并行工作器/处理器。情况可能很快变得混乱不堪。
使用Rclone进行数据传输
与AWS CLI和s5cmd等工具不同,rclone使我们能够为源和目标指定不同的访问设置。在以下rclone配置文件中,我们添加了Google Cloud Storage访问的设置:
[S3store] type = s3 provider = AWS access_key_id = <id> secret_access_key = <key>[GSstore] type = google cloud storage provider = GCS access_key_id = <id> secret_access_key = <key> endpoint = https://storage.googleapis.com
将单个文件从一个存储系统传输到另一个存储系统的格式与将其复制到本地目录相同:
rclone copy -P S3store:my-bucket/file GSstore:gs-bucket/file
然而,rclone的真正强大之处在于将此功能与上面描述的files-from选项相结合。我们不需要为并行化数据迁移编排定制解决方案,而是可以使用一个命令传输一个长列表的文件:
rclone copy -P --transfers 256 --files-from files.txt \ S3store:my-bucket/file GSstore:gs-bucket/file
实际上,我们可以通过将对象文件列表分成更小的列表(例如,每个列表包含1万个文件)并在单独的计算资源上运行每个列表来进一步加速数据迁移。尽管这种解决方案的具体影响因项目而异,但它可以极大地提高开发的速度和效率。
总结
在本文中,我们探讨了使用rclone进行基于云的存储管理,并展示了它在跨多个存储系统维护和同步数据的挑战中的应用。无疑,还有许多其他的数据传输替代方案。但是,rclone的基于方法的便利性和优雅性是不容置疑的。
这只是我们在云存储解决方案效率最大化主题上写的众多文章之一。请务必查看 我们的其他文章关于这个重要主题。