使用 rsync 同步 1.5m 文件的建议

使用 rsync 同步 1.5m 文件的建议

我有一个包含大约 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,我忘了说这个了。

相关内容