![使用 Rsync 以一种方式移动然后同步大量数据](https://linux22.com/image/196056/%E4%BD%BF%E7%94%A8%20Rsync%20%E4%BB%A5%E4%B8%80%E7%A7%8D%E6%96%B9%E5%BC%8F%E7%A7%BB%E5%8A%A8%E7%84%B6%E5%90%8E%E5%90%8C%E6%AD%A5%E5%A4%A7%E9%87%8F%E6%95%B0%E6%8D%AE.png)
编辑:根据两个深入的答案,我试了一下:
rsync --progress -v -az -e “ssh” /archive/images/dcam/ [email protected]:/data/archive/images/dcam --dry-run
那么 --progress 来查看结果 -v 使其变得详细? -az 将其存档(从而获得时间戳),z 将其压缩以节省网络流量。 -e 通过ssh登录,其中10.xxxxx机器在授权密钥中确实有源ssh密钥。唉,我收到了这个错误:
rsync: Failed to exec \#342\#200\#234ssh\#342\#200\#235: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(84) [sender=3.0.6]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in IPC code (code 14) at io.c(600) [sender=3.0.6]
这很奇怪,因为远程计算机有一个 /data/archive/images/dcam ,其中已经包含数据。
我一定不完全理解 rsync 是如何工作的。我有两台服务器......其中一台有大量数据我想转移到另一台。所以...我 NFS 将文件夹从服务器 B(备份所在的位置)安装到服务器 A。
然后因为这是一个重要的实时服务器,所以我很紧张让 RSYNC 在 2TB 数据上运行...我像这样手动运行:(在 /archive/images 文件夹内)rsync -r imageDateXX/ /mnt/backup/ archive/images/imageDateXX 并对 2TB 文件夹和数据重复此操作。我终于让它工作了。所以我很高兴我没有让服务器瘫痪,然后这个数据整个晚上都会更新。因此,为了让服务器 B 保持最新数据,我设置了一个 cronjob:
0 8 * * * rsync -r /archive/images/ /mnt/backup/archive/images
这已经开始了(我猜),但仍然需要 2 天的时间才能完成。看起来它不仅仅是查看服务器 A 上的新增/或更改内容并将其放入服务器 B,而是将所有文件再次覆盖到服务器 B。我不知道如何检验这个理论,但它需要很长时间。我是否缺少 rsync 中的开关,或者我逐个文件夹运行 rsync 是否使我在父文件夹上运行 rsync 看起来与 rsync 看起来“不同”,因为它认为它是所有新数据并复制所有内容,即使它位于同一位置服务器b?
不确定如何检验这个理论或确定。认为这很简单,rsync 会自动覆盖文件或复制文件(如果文件在 serverB 上不存在或在服务器 A 上已更改)。
答案1
rsync --progress -av -e "ssh" /archive/images/ username@[serverIP-or-domainname]:/archive/images --dry-run
样本:
rsync --progress -av -e "ssh" /archive/images/ [email protected]:/archive/images --dry-run
这是假设两台机器上的目录都是 /archive/images,并且您已经设置了密钥,并且远程系统正在运行 sshd,我很确定它确实如此。
--dry-run
对于查看该操作会做什么总是有用的,有助于避免讨厌的错误。
-v
添加输出详细信息,这对于跟踪操作的位置很有用。
--delete
从目标中删除源上不再存在的文件,如果要在远程系统上创建数据镜像,通常需要这样做。如果您的数据变化很大,您可能需要查看--delete-before
、--delete-after
、 ,--delete-during
看看哪一个最能满足您的需求。我发现--delete
通常工作得很好,但是对于 TiB 的数据,这可能很重要。--delete-before
例如,如果您正在处理几乎已满的远程磁盘,则非常有用。
删除时要小心!!它将删除远程路径中在本地路径中找不到的所有内容,这意味着,如果您提供错误的路径,它会很高兴地开始删除或尝试删除该远程目录中的所有内容。--delete
没有第一次就不要使用,--dry-run
至少可以确保您没有犯错误!
-rtvz
是比-a
.我发现这个对于大多数应用程序来说已经足够了。
-a
基本上创建了源的几乎真实的镜像(-aHAX
大部分是完整的镜像)。-a
/与(no , , )--archive
相同。-rlptgoD
-H
-A
-X
--progress
显示作业运行时的进度,这很有用。
-e "ssh"
正在执行 ssh,如果您需要在命令中使用更多 ssh 选项或其他选项(例如特定的 ssh 端口),那么这可能是一个更长的命令。样本:-e "ssh -p 423"
-z
:如果您想降低 CPU 使用率,并且带宽没有太大变化(假设是图像等二进制文件),请删除-z
压缩选项。
--bwlimit
:如果您担心占用机器之间太多的网络带宽,则很有用,最小速度大小是 1k、1 KiB/s,可以是 1m、又名 1 MiB/s 等。如果您不这样做,这非常有用不想耗尽网络传输的所有带宽。正如 man 所说,请参阅--max-size
不同单位的语法。
单位字符串的第一个字母可以是 B(字节[不适用于
--bwlimit
)、K (kilo)、M (mega)、G (giga)、T (tera) 或 P (peta)。如果字符串是单个字符或添加了“ib”(例如“G”或“GiB”),则单位是 1024 的倍数。如果使用以“B”结尾的两个字母后缀(例如"kb") 那么你得到的单位是 1000 的倍数。字符串的字母可以是你想要使用的大小写的任意组合。
--partial
:如果您认为传输可能会中断,这很有用,这可以防止 rsync 在中断时默认删除部分传输。
请注意,第一次完全同步后,所有后续同步都会大大加快,因为仅更新更改的文件。一旦逻辑工作正常,您总是希望--delete
在将来的同步中使用以保持本地和远程文件同步,删除已删除或重命名的文件等。在某些配置中,仅更新文件上已更改的数据,例如,如果该文件具有可以更改的元数据,但二进制核心数据不会更改,只有元数据部分会更改。不太适用于图像,但适用于其他数据类型,可以使同步速度提高 100 倍。
rsync 和 nfs
特别是如果使用 ext4,则通过 nfs 进行 rsync 将失败,因为它不支持所有文件系统属性(如果您要传输这些属性,就像在 -a 的情况下所做的那样)。它也很慢。 nfs 适合通过本地网络进行较小的传输,在这种情况下您不会遇到扩展文件属性问题,但我不会在生产中使用它。我曾经使用 rsync 通过 nfs 进行备份,当 ext4 出现时不得不停止,因为太多属性无法传输。
重新同步手册页
在使用这些系统时,没有什么比花一些时间阅读 rysnc 手册页更有用的了,例如,--partial
直到今天我才意识到这是一件事,并且一直在努力应对非常大的文件传输中断并不得不重新开始下次启动时中断的文件。
不过,我不会粉饰这一点,尽管在我看来,rysnc 是有史以来最好的 cli 软件之一,但它的手册页很糟糕,急需重新组织,在其中找到东西太难了,我没有例如,直到今天阅读它之前,我什至知道其中的一些内容,例如,不知道--partial
使我损失了数不清的时间,因为大文件传输中断而重新启动失败。
给 Andrew Tridgell 寄一份披萨,哈哈,当人们想付钱给他制作 rsync 时,这就是他所要求的,但更好的是,帮助修复手册页以使其更可用,将其分解为逻辑部分,这确实是阅读和使用时遇到困难。但它是优秀的文档,但没有经过很好的重组。
答案2
您的解决方案存在两个主要问题,这就是为什么每个副本需要很长时间才能完成的原因:
- 您没有复制文件时间,因此
rsync
无法识别和跳过已复制的文件。因此每次调用都会复制所有内容 - 您正在将
rsync
本地文件系统的一部分复制到另一部分。在这种情况下,您不会获得增量副本,但对文件的任何更改都会导致整个文件被完整复制
修复
- 包括
--times
(-t
) 或考虑--archive
(-a
) 以一次性获取大部分元数据。即使您必须继续使用 NFS,也请执行此操作 - 不要使用 NFS,而是使用
ssh
到 NFS 服务器的传输(remoteHost
在我的示例中) --compress
使用(-z
)压缩网络上的流量
例子
rsync -az /archive/images/ remoteHost:/mnt/backup/archive/images
如果交互式运行,我通常也包含--partial --progress --verbose
( )-Pv
在您的情况下第一次运行此修改后的命令时,您会发现它仍然需要很长时间才能完成。这是因为rsync
没有快速的方法来识别哪些文件是最新的 - 并且它通过文件时间和大小来实现 - 因此它必须比较每个文件对(源和目标)以发现只有元数据不同。此后,rsync
仅当文件大小或时间不同时才会考虑复制该文件,因此将跳过未更改的文件。