通过 ssh 从一台服务器同步大量文件

通过 ssh 从一台服务器同步大量文件

我需要加快服务器之间同步日志文件的过程。

生成日志的机器 (LOGMACHINE) 在树中创建它们,如下所示:

/Files
/Files/LOGS1/
/Files/LOGS1/logFiles/
/Files/LOGS1/logFiles/typeLog1A
/Files/LOGS1/logFiles/typeLog1B
/Files/LOGS1/logFiles/typeLog1C
/Files/LOGS1/logFiles/typeLog1C/fileLog1C-20210113-0900.xml.gz
/Files/LOGS1/logFiles/typeLog1C/fileLog1C-20210113-0915.xml.gz
/Files/LOGS1/logFiles/typeLog1C/fileLog1C-20210113-0930.xml.gz
/Files/LOGS1/logFiles/typeLog2A
/Files/LOGS1/logFiles/typeLog2A/fileLog2A-20210113-0900.xml.gz
/Files/LOGS1/logFiles/typeLog2A/fileLog2A-20210113-0915.xml.gz
/Files/LOGS1/logFiles/typeLog2A/fileLog2A-20210113-0930.xml.gz

/Files/LOGS2/
/Files/LOGS2/logFiles/
/Files/LOGS2/logFiles/typeLog1A
/Files/LOGS2/logFiles/typeLog1B
/Files/LOGS2/logFiles/typeLog1C
/Files/LOGS2/logFiles/typeLog1C/fileLog1C-20210113-0900.xml.gz
/Files/LOGS2/logFiles/typeLog1C/fileLog1C-20210113-0915.xml.gz
/Files/LOGS2/logFiles/typeLog1C/fileLog1C-20210113-0930.xml.gz
/Files/LOGS2/logFiles/typeLog2A
/Files/LOGS2/logFiles/typeLog2A/fileLog2A-20210113-0900.xml.gz
/Files/LOGS2/logFiles/typeLog2A/fileLog2A-20210113-0915.xml.gz
/Files/LOGS2/logFiles/typeLog2A/fileLog2A-20210113-0930.xml.gz

大约有 4000 个文件夹typeLog1*和 9000 个typeLog2*.每个人每 15 分钟就有一个新文件。

我拥有两台服务器,SERV1 同步 的文件夹,typeLog1*SERV2 同步的文件typeLog2*夹,两者都从 LOGMACHINE 同步它们。每个服务器同步 LOGS1 和 LOGS2 文件夹。

现在我正在使用rsync它只需要 30 分钟即可获取其中一个 LOGS 文件夹。这会导致每个文件大约有 30 分钟到 1 小时的延迟。

rsync我提出了一个并行运行多个的解决方案。不幸的是,我只能ssh并行运行 8 个会话,这是创建日志的计算机的限制。

限制:

  • 我必须使用ssh
  • 我无法在创建日志的计算机中安装任何软件。

有没有什么方法可以加快这个过程,使用rsync或替代?

更新:

当前的rsyncs

  • 在 SERV1 上:

    rsync -avz --rsync-path=/usr/local/bin/rsync --ignore-existing --delete --files-from=<(ssh user@logmachine 'cd /home/user/Files/LOGS1/logFiles/; find . -mtime -1 -type f -name "*fileLog1*.xml.gz"') user@logmachine:/home/user/Files/LOGS1/logFiles/ Files/LOGS1/logFiles/
    
    rsync -avz --rsync-path=/usr/local/bin/rsync --ignore-existing --delete --files-from=<(ssh user@logmachine 'cd /home/user/Files/LOGS2/logFiles/; find . -mtime -1 -type f -name "*fileLog1*.xml.gz"') user@logmachine:/home/user/Files/LOGS2/logFiles/ Files/LOGS2/logFiles/
    
  • 在 SERV2 上:

    rsync -avz --rsync-path=/usr/local/bin/rsync --ignore-existing --delete --files-from=<(ssh user@logmachine 'cd /home/user/Files/LOGS1/logFiles/; find . -mtime -1 -type f -name "*fileLog2*.xml.gz"') user@logmachine:/home/user/Files/LOGS1/logFiles/ Files/LOGS1/logFiles/
    
    rsync -avz --rsync-path=/usr/local/bin/rsync --ignore-existing --delete --files-from=<(ssh user@logmachine 'cd /home/user/Files/LOGS2/logFiles/; find . -mtime -1 -type f -name "*fileLog2*.xml.gz"') user@logmachine:/home/user/Files/LOGS2/logFiles/ Files/LOGS2/logFiles/
    

在文件中查找模式的条件是必要的,因为这些文件夹中还有其他文件。

答案1

使用 tar.gz 压缩日志并使用 rsync 复制它们并检查复制过程的时间。

答案2

当您运行此命令时,您最终可能会影响rsync效率

rsync -avz --rsync-path=/usr/local/bin/rsync --ignore-existing --delete --files-from=<(ssh user@logmachine 'cd /home/user/Files/LOGS1/logFiles/; find . -mtime -1 -type f -name "*fileLog1*.xml.gz"') user@logmachine:/home/user/Files/LOGS1/logFiles/ Files/LOGS1/logFiles/

我建议您针对gz类型 1 的压缩日志尝试此变体,并针对复制类型 2 日志的第二个服务器进行适当修改,

rsync -av --rsync-path=/usr/local/bin/rsync --delete --prune-empty-dirs --include '*.gz' --include '*/' --exclude '*' user@logmachine:'Files/LOGS1/logFiles/typeLog1*/' Files/LOGS1/logFiles/

您可能会发现,当复制最新文件时,仅复制了部分文件,并在下次运行时更新和替换了该文件。这是因为无法识别文件是否已完全写入,logmachine除非它立即移动到目标目录树中并在其他地方写入和压缩。但是,您已经遇到了这个问题,而且更糟:因为您--ignore-existing更新的文件永远不会被复制。

如果您不再需要日志logmachine,请仔细考虑使用--remove-source-files

答案3

不要忘记“压缩两次”会消耗你的 CPU 并且不会提高传输速度:

  • rsync可以使用其标志动态压缩数据-z,但只有在传输“可压缩”数据(各种文本,一些二进制数据)时才有意义。
  • 已经压缩的数据(gz 档案等、MP3 文件、JPG 文件等)已经在大小方面进行了压缩/优化,只会使您的 CPU 升温,而不会提高速度。

相关内容