大量文件上的 inotify 和 rsync

大量文件上的 inotify 和 rsync

我正在使用 inotify 来监视目录并使用 rsync 在服务器之间同步文件。同步工作完美,内存使用基本上不是问题。然而,最近添加了大量文件 (350k),这影响了性能,特别是 CPU 性能。现在,当 rsync 运行时,CPU 使用率飙升至 90%/100%,并且 rsync 需要很长时间才能完成,有 650k 个文件正在监视/同步。

有没有什么办法可以加快rsync的速度并且只rsync已经改变的目录?或者在不同的目录上设置多个 inotifywait。使用的脚本如下。

更新:我添加了 --update 标志,用法似乎基本没有变化

#! /bin/bash

EVENTS="CREATE,DELETE,MODIFY,MOVED_FROM,MOVED_TO"

inotifywait -e "$EVENTS" -m -r --format '%:e %f' /var/www/ --exclude '/var/www/.*cache.*' | (
WAITING="";
while true; do
    LINE="";
    read -t 1 LINE;
    if test -z "$LINE"; then
        if test ! -z "$WAITING"; then
                echo "CHANGE";
                WAITING="";
                rsync --update -alvzr --exclude '*cache*' --exclude '*.git*' /var/www/* root@secondwebserver:/var/www/
        fi;
    else
        WAITING=1;
    fi;
done)

答案1

如果服务器的处理器速度较慢,请避免使用 rsync 进行校验和和压缩。我会删除 rsync 命令中的 ht“-z”选项。

rsync --update -alvr --exclude '*cache*' --exclude '*.git*' /var/www/* root@secondwebserver:/var/www/

请注意,它不会避免 rsync 来比较 650k 文件。您可以将 /var/www 的子目录一一进行 rsync,以减少一次检查的文件数量。

答案2

感谢您发布您的答案 - 这对我真的很有帮助。我认为你可以简化循环:

EVENTS="CREATE,DELETE,MODIFY,MOVED_FROM,MOVED_TO"

sync() {
  rsync --update -alvzr --exclude '*cache*' --exclude '*.git*' /var/www/* root@secondwebserver:/var/www/

}
watch() {
  inotifywait -e "$EVENTS" -m -r --format '%:e %f' /var/www/ --exclude '/var/www/.*cache.*' 
}


watch | (
while true ; do
  read -t 1 LINE && sync
done
)

您可能需要稍微调整一下,但要点应该很清楚。我正在使用 Amazon 的 AWS s3 同步的变体,因此我可能错误地替换了您的 rsync 命令。

答案3

你可以检查一下这个工具同步事物

我正在使用 dockerized 版本这个仓库

我有 411k 个文件要使用此工具同步,我遇到了一些有关以阿拉伯语命名的文件的文件名编码的问题

#!/bin/bash
docker run -d --rm \
  --name=syncthing \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Asia/Jordan \
  -e UMASK_SET=022 \
  -p 8384:8384 \
  -p 22000:22000 \
  -p 21027:21027/udp \
  -v "$(pwd)/config:/config" \
  -v "path_to_sync:/config/Sync" \
  --net host \
  linuxserver/syncthing

注意:使用GUI进行配置

相关内容