用rsync备份会使服务器无响应

build立:

我想从PRODBACKUP服务器每周备份1TB。 这些服务器在Linux Ubuntu-1004-lucid-64-minimal 2.6.32-35-server下运行。

有BACKUP服务器(我启动rsync程序)和PROD服务器的数据。

我目前使用的命令如下:

time rsync -r --delete [email protected]:/home/myuser/data . 

问题:

与此问题是:PROD服务器变得几乎没有响应。 在PROD服务器上运行的Web应用程序快要死亡了。

更新:当前的工作解决scheme

经过一些反馈,我现在使用这个命令做1TB的数据备份,它绝对正常工作:

rsync -r --delete --rsync-path "ionice -c 3 nice rsync" --bwlimit=30000 [email protected]:/home/myuser/data .

请注意,我已将带宽限制设置为30 Mbps,因为我的PROD和备份服务器之间的连接速度为100 Mbps,并且该带宽与我的Web应用程序的生产stream量共享。

请注意,我在BACKUP服务器上执行此命令,所以这就是为什么我使用rsync-path选项为了在远程服务器(PROD)上进行更好的离子化。


我可能的解决scheme的原始问题

我如何控制rsync(在BACKUP服务器上启动)的影响?

你将如何解决这个问题?

我的小研究带出了以下可能性:

  • 以某种方式执行rsync,以便1TB以块的forms同步? 例如

     rsync /source/[0-9]* [email protected]:/source_backup rsync /source/[ah]* [email protected]:/source_backup/ rsync /source/[ip]* [email protected]:/source_backup/ rsync /source/[qz]* [email protected]:/source_backup/ 
  • 用选项来限制带宽会有帮助吗?

     --bwlimit=10000 
  • 在某种程度上可以很好地处理远程机器上的进程吗? 例如

     nice -n19 backup.sh 

我不知道在PROD机器上的过程是否也会被剔除?

任何帮助和想法是非常受欢迎的。

我喜欢rsync。 但是它仍然有一个devise上的缺陷,它想要“加载”正在扫描的目录树中的每个文件的列表。 之前,它曾经等待整个树被加载,然后才开始将列表传送给对等体。 这似乎是现在固定的,它比以前更好地并行。 但是,它仍然要加载整个列表。 影响与文件数量成正比,而不是数据大小。

虽然这一切都涉及I / O从所有分散的目录加载列表,但这种影响不能通过分割来改变,因为所有事情都必须被扫描。 但是,我发现当列表在一次运行中非常大时会产生更大的影响,因为它占用了大量的虚拟内存,并且要求在实际的RAM中保存这个列表的方式也是如此。 这种内存需求迫使其他进程交换。

按照您的build议分解目录树将有助于打破内存需求的影响。

如果您的数据使用硬链接文件,这也有一个缺点。 如果你有硬链接的文件,并且它们在你将目录树分解成的部分之间被硬链接,那么你就失去了rsync在目标(备份服务器)上保持相同硬链接的能力。 这将导致目标上更大的空间使用率,并且根据你使用硬链接的方式,可能会破坏数据的工作方式(例如,希望在另一个文件中看到一个文件的更改)。 如果你没有明确使用硬链接,那么这方面对你来说不会是一个问题。

计算每个分段中的文件数量。 尽可能保持平衡。 要限制的最佳数字取决于您的可用物理RAM以及其他进程对该RAM的需求。

带宽和好的设置不太可能对内存问题有很大的帮助。 如果还有networking容量问题,带宽仍然可以帮助。