我有一个包含大约 150 万个文件的文件夹,我需要尽可能频繁地将它们复制到辅助服务器。您有什么建议吗?因为显然标准 rsync 命令无法做到这一点,因为仅发送增量文件列表(同时使用 rsync -Pcr 选项)就需要大约 30 分钟……而文件传输大约需要 10 秒。系统管理员们,您如何解决这个问题?
我目前使用以下命令,间隔 30 分钟:
rsync -Pcr /var/primary/storage /var/secondary/ --log-file=/tmp/rsync.log
注意:/var/primary/storage 是通过 NFS 挂载到辅助服务器的文件夹
更新:
我现在还尝试了以下命令:
cp -aur /var/primary/storage /var/secondary/
但奇怪的是,命令询问我是否允许覆盖与源文件修改日期完全相同的目标文件。如果源文件比目标文件更新(或经过修改),更新选项不是应该默认监视并复制吗?
答案1
我认为最好的办法是监控或记录哪些文件已更改。尽管可以使用 SDS 解决这个问题,但由于您使用的是 rsync,我建议您使用普通文件系统。
因此,我认为inotifywait
以守护进程身份运行是您最好的选择:
sudo inotifywait --daemon --outfile /tmp/fschanges --recursive /path/to/watch \
--event modify --event move --event create --event delete --event close_write
当将其嵌入到一个简单的 bash 脚本中时,该脚本 1)读取文件,2)推送更改,3)完成后清除内容,您应该得到一个非常“即时”的解决方案:
#!/bin/bash
logfile="/tmp/fschanges"
path="/home/roy/Downloads"
# Stop deamon upon exit
trap "killall inotifywait" EXIT
# Init deamon
inotifywait --daemon --outfile $logfile --recursive $path \
--event modify --event move --event create --event delete --event close_write &
while true; do
# Loop trough file
while read change; do
srcpath=$(echo "$change" | cut -d' ' -f1)
action=$(echo "$change" | cut -d' ' -f2)
file=$(echo "$change" | cut -d' ' -f3)
if [[ $action == *"DELETE"* ]]; then
echo "DELETE: rsync $srcpath$file"
elif [[ $action == *"CREATE"* ]]; then
echo "CREATE: rsync $srcpath$file"
elif [[ $action == *"WRITE"* ]]; then
echo "WRITE: rsync $srcptah$file"
fi
done < $logfile
# Clear the log
> $logfile
# Allow for cooldown
sleep 1
done
当然,上面的脚本需要正确完成,但你已经了解了大致的想法。
答案2
我找到了解决方案,但它有点复杂,需要一些思考。如果你不想读它,那么TLDR:没有 NFS,没有问题,给予比获得更好
所以我尝试将文件从 FileServer-1 同步到 FileServer-2。为了减轻 FileServer-1 的压力,我想我可以在 FileServer-2 上执行 rsync 命令并从 FileServer-1 复制文件。我将其反转并从 FileServer-1 运行 rsync 命令以将文件夹增量文件列表复制到 FileServer-2。奇迹发生了,速度更快。仍然令人无法接受,但速度更快了。
过了一会儿,我不得不从两个文件服务器卸载一个 NFS 文件夹。我偶然从文件服务器 1 运行了 rsync 命令,将文件从本地计算机复制到文件服务器 2。现在真正的奇迹发生了,因为它在大约 2 分钟内就完成了。
我从 FileServer-2 删除了大约 600MB 的数据,然后再次启动 rsync,只是为了看看 rsync 需要多长时间才能复制所有文件(大约 10,000 个文件)。它花了不到 5 分钟!
自从我卸载了文件夹(与我尝试 rsync 的文件无关)后,rsync 就开始像野兽一样工作。
有谁能解释一下为什么 Rsync 和 NFS 会这样互相加热?或者这只是我的系统上非常独特的现象?使用 CentOS 7,我忘了说这个了。