简短的故事:我们需要一个坚如磐石的可靠的文件移动程序。我们有经常被写入的源目录,我们需要从中移动文件。文件成对出现 - 一个大的二进制文件和一个小的 XML 索引。我们得到一个定义这些文件包的 CTL 文件。有一个进程在文件进入目标目录后对其进行操作;完成后将其删除。rsync 能做得最好吗,还是我们需要更复杂?长话短说如下:
我们有多个来源可供提取:一组目录位于 Windows 机器上(确实有 Cygwin 和 SSH 守护程序),一大堆目录位于一组 SFTP 服务器上(其中大多数也是 Windows)。我们的目的地是 AIX 服务器上的目录列表。
当 Windows/Cygwin 机器是我们唯一的来源时,我们曾经在它上面使用非常可靠的 Perl 脚本。但是,我们正在努力摆脱那台机器,现在有了其他来源,即 SFTP 服务器,我们目前无法在其上运行我们自己的脚本。
出于安全原因,我们无法在 AIX 服务器上运行复制作业 - 它们无法访问源服务器。我们目前在 Linux 机器上有一个自行开发的 Java 程序,它使用 SFTP 从各种新的 SFTP 源目录中提取内容,复制到本地 tmp 目录,验证所有内容是否存在,然后将其复制到 AIX 机器,然后从源中删除文件。但是,我们发现了许多错误或处理不当的错误检查。我们都不是 Java 专家,因此修复/改进这个问题可能很困难。
我们担心的是:
- 使用远程源 (SFTP) 时,rsync 是否会保留任何仍在写入的文件?其中一些文件很大。
- 从阅读文档来看,rysnc 似乎非常擅长在目标可靠写入之前不删除源。有没有人有证实或反驳这一点的经验?
- 附加信息我们将关注文件进入目标目录后对文件进行操作的提取过程。我们不希望它在复制文件的过程中对文件进行操作;它会等到小型 XML 索引文件出现。我们当前的复制作业应该最后复制 XML 文件。
- 有时网络出现问题,有时 SFTP 源服务器出现故障。有时我们输入了错误的配置文件,导致目标目录不存在。我们绝不想因为这种错误而丢失文件。
- 我们需要好的日志
如果向您展示这个问题,您会编写一些 rsync 脚本吗?或者您会构建或购买一个工具,如果会,它会是什么(或者它会使用什么技术?)我(以及我团队中的其他人)对 Perl 很在行。
答案1
编辑:Rsync 进行端到端检查:文件传输后,它会计算目标上该文件的校验和,并将其与源上的校验和进行比较。只有当校验和匹配时,它才会宣布传输成功。这反映在最终的退出状态代码中 - 如果所有传输的文件都通过了测试,则退出代码将为 0(成功)。
在类似的设置中,我编写了自己的基于 rsync 的解决方案。它用于夜间备份,我们不会自动删除文件。
为了解决您的一些疑虑:
- Rsync 永远不会修改源端的任何内容(除非您使用该
--remove-source-files
选项)。 - 如果网络长时间中断,Rsync 将放弃并给出适当的退出状态。我在脚本中检查了这一点,对于特定的退出代码(我在实践中通过记录观察到的),我让脚本重试 rsync 命令最多 3 次。
- 是的,您的脚本应该尽可能多地记录日志。时间戳、总运行时间、Rsync 存在状态、Rsync --stats 输出(传输量)。我还在
find
传输结束时运行以计算文件数量并du *
获取目录大小并记录下来。
基本上,您需要注意脚本中的几件事。主要是:收集退出状态、一些统计数据,并在成功传输时删除源文件。
您可以相信 rsync 的退出状态,即所有请求的文件都已传输,但在您删除源计算机上的文件(源目录)之前,您应该考虑您对脚本向 rsync 提供正确文件(源目录)的信任程度。find
在您的脚本自动删除文件之前,也许先在源计算机上计数文件,然后在目标计算机上计数文件(然后检查这些数字是否匹配)会是一个很好的最终检查。
尝试 10 到 20 次来开发和测试您的脚本。您需要在 Windows 机器上安装带有 rsync 和 ssh 客户端的 Cygwin。
通过确切了解应用程序的工作原理,可以对它充满信心。我从未使用过商业备份软件 - 但如果你能找到一个坚如磐石的软件并信任它 - 那就去买吧 - 它可以为你节省很多时间。