我们花了 2 个小时来处理生成一个大文件(300GB)。然后将该文件通过 SCP 传输到远程服务器,这需要 1.5 个小时。
有没有什么方法可以让我们能够在文件生成后立即将其复制到远程服务器(传输数据)而不是等到文件生成。
或者将单个大文件传输到远程服务器的最佳方法是什么?感谢您的方法
答案1
这种方法有一个很大的缺点,就是不知道文件何时完全写入本地磁盘。完全传输后需要手动停止命令。您可以查看本地和远程的文件大小并进行比较。
开始创建文件。当文件创建完毕并有数据运行时,你可以使用以下命令开始移动数据
tail -c 500G -f /path/to/bigfile | ssh [email protected] "cat > /tmp/del.file"
此命令有多种变体,您还可以做其他事情来使输出更吸引人,但让我们看看这个简单的版本来解释它是如何工作的。
- tail 查看文件的末尾。
- -c 500G 查看文件的最后 500 个字节或其中的一部分,这样您就可以一直看到文件的开头。
- -f 用于跟随文件,即继续等待更多输入并在输入到达时显示。
- 该命令的第二个 ssh 部分打开与远程站点的 ssh 会话,并将从 tail 命令接收的数据流写入磁盘。
您可以做很多类似的好事,比如在命令的尾部和 ssh 部分之间添加 | pv -s 300G,假设已知文件大小为 300GB,则会显示进度报告,如果您将 ssh 命令更改为包含 -C,它可以压缩传输(或者您可以通过 gz 或其他方式进行管道传输,可能解压缩它,而不是在 ssh 命令末尾使用 cat)
最初的想法 - 留在这里作为我想到的其他可能性 - 特别是如果“不知道它的完整性”是一个交易破坏者
还有多种其他解决方案,每种都有各自的优缺点。请尝试以下选项 -
根据数据的不同,使用 DRBD 之类的东西可能(也可能不)合适(或者它的同类产品,更适合长距离复制,火星)。此解决方案的另一种变体可能是使用 ZFS 复制。所有这些都在块设备上工作,可能适合也可能不适合。
一个效率稍低的方法(因为它需要计算哪些块已被校验和更改)可能是用 rsync 替换 scp。您需要多次运行 rsync。 这里是对其工作原理的概述。RSYNC 可以在 ssh 协议上运行,并且是文件级的,因此,尽管效率低很多,但可能更容易实现。
还有一种机制(同样取决于您的使用情况)可能是将文件直接写入远程系统 - 即使用 NFS、SMB 或 SSHFS 挂载远程目录。这可能是最有效的,但这意味着您无法在本地服务器上保留副本,并且连接中断可能会导致更大的挫折。优点是易于设置且 CPU 占用低。