我有一个涉及 2 台服务器的负载平衡器设置。这两台服务器互为镜像。blanacer 的主要用途是提供静态文件。我们称它们为服务器 A 和服务器 B。
服务器 A 将从不同网络上的远程主机检索文件。检索的远程文件是社区网站的媒体文件,因此 rsync 需要每 30 分钟运行一次才能使文件保持同步。否则用户将看到损坏的图像等。服务器 A 还通过 http 提供文件,峰值时间为 400MB/S
服务器 B 将与服务器 A 上的文件进行 rsync,为了保持一致性,rsync 也每 30 分钟运行一次。服务器 B 还通过 http 提供文件,峰值时间为 400MB/S
A 和 B 上的负载平均非常高:8.00、8.10、7.68 及以上
我如何改进设置以减少服务器负载并提高 rsync 效率?
谢谢
答案1
这取决于导致处理器利用率过高的原因。如果处理器利用率过高是由 Rsync 生成文件校验和引起的,您可以采取一些措施。
您可能根本不需要校验和。默认情况下,rsync 根据修改时间和文件大小判断文件是否不同。如果您添加“ -c
”选项,它将通过比较校验和来判断文件是否不同。如果您不需要校验和,请省略该选项。
如果您确实需要校验和,那么在某些情况下校验和缓存可能会起作用。如果您要同步的文件不经常更改,您可以在 cron 作业中每天生成一次校验和,rsync 将使用生成的校验和。Rsync 仍将为任何新文件或任何修改时间或大小与创建校验和时不同的文件生成校验和。
此信息基于 rsync 3.0.5,但在 3.0.6 中应该同样有效。您需要重新编译 rsync;校验和缓存是一个补丁。以下是我用来编译 rsync 的内容:
rsync_version="3.0.5"
scriptroot="Set this to your working directory."
mkdir -p $scriptroot/rsync-source/rsync-working
cd $scriptroot/rsync-source/rsync-working
tar xvzf ../rsync-${rsync_version}.tar.gz
tar xvzf ../rsync-patches-${rsync_version}.tar.gz
cd $scriptroot/rsync-source/rsync-working/rsync-${rsync_version}
patch -p1 < patches/checksum-reading.diff
./configure
make
然后使用 rsyncsums 生成校验和。调用 rsync 时,使用“ --sumfiles=lax
”选项。
答案2
您没有说明您使用的版本。如果您使用的是 RHEL/Centos,则很可能停留在 2.x 版本。2.x 的问题在于它会在进行任何传输之前扫描所有目录并发送文件列表。这很糟糕,因为如果树足够大,则在传输实际开始时它可能会从缓存中被推出,从而导致磁盘活动增加一倍。此外,如果连接不稳定,您将永远无法传输任何东西,因为连接会提前断开。
但是从 3.0 版开始,目录结构会随着版本更新而扫描。为了在 RHEL/Centos 上升级到 3.x,我刚刚从 Fedora 下载了一个(版本 10 及以下,因为格式发生了变化,与 RHEL 的格式略有不兼容)SRPM。http://koji.feodraproject.org,并发布了:
rpmbuild --rebuild rsync.xxxx.src.rpm
您需要在两台机器上安装新包。
答案3
很多网站都建议使用 -avzuh 进行存档。经过一些测试,我发现是 -z(压缩)让我花了很长时间(从我的 500g 便携式硬盘从工作地点备份到家中),即使没有做任何更改。
使用 -z 大约需要 1 小时(没有变化),不使用则大约需要 30 秒。
答案4
根据文件更改的频率和文件数量,等待修改然后才发送通知可能更好。如果修改频率较低且文件总数较高,这种方法会更好。在这种情况下,rsync 将访问磁盘以 stat() 所有文件以查看它们是否已更改。
http://inotify-tools.sourceforge.net/有一个简单的示例(参见示例 1),说明如何以粗略的方式将 Linux 的 inotify(文件修改监视器)与 rsync 连接起来。
理想情况下,这将被集成到 rsync 本身中(我认为某个地方有一些实验版本可以做到这一点,但现在找不到它......)