我需要加快服务器之间同步日志文件的过程。
生成日志的机器 (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 升温,而不会提高速度。