Rsync 守护程序最大连接数交通拥堵

Rsync 守护程序最大连接数交通拥堵

我更喜欢使用 rsync 守护进程来满足我的所有 rync 需求,因为它提供了干净的集中管理并节省了系统资源。因此,我的/etc/rsyncd.conf包含多个模块条目。

我的实际 rsync 命令的包装脚本都是while循环,在连接断开的情况下将立即/重复地重新连接 rsync。

问题:
max connections = 1正在读取每个模块的变量 条目全球而不是单独地每个模块。从而导致@ERROR: max connections (1) reached -- try again later发生(无论哪个 rsync 守护进程首先连接,都会获得单个可用的不正确的全局 max connection = 1,导致所有其他连接失败..烦人)。

如果没有max connections = 1while循环就能够启动无限的线程并消耗不必要的资源,因此每个模块的连接数受到限制。同时,每个文档max connections = 1都有随附的file.lock。per module

这是我的/etc/rsyncd.conf

[home]
path = /home/username
list = yes
use chroot = false
strict modes = false
uid = root
gid = root
read only = yes
# Data source information
max connections = 1
lock file = /var/run/rsyncd-home.lock

[prod-bkup]
path = /media/username/external/Server-Backups/Prod/today
list = yes
use chroot = false
strict modes = false
uid = root
gid = root
# Don't allow to modify the source files
read only = yes
max connections = 1
lock file = /var/run/rsyncd-prod-bkup.lock

[test-bkup]
path = /media/username/external/Server-Backups/Test/today
list = yes
use chroot = false
strict modes = false
uid = root
gid = root
# Don't allow to modify the source files
read only = yes
max connections = 1
lock file = /var/run/rsyncd-test-bkup.lock

[VminRoot2]
path = /root/VDI-Files
list = yes
use chroot = false
strict modes = false
uid = root
gid = root
# Don't allow to modify the source files
read only = yes
max connections = 1
lock file = /var/run/rsyncd-VminRoot2.lock

这是我的 rsync-daemon 包装脚本之一的示例:

#!/bin/sh
#
#
while [ 1 ]
do

   cputool --load-limit 7.5 -- nice -n -15 rsync -avxP --no-i-r --rsync-path="rsync" --log-file=/var/log/rsync-home.log --exclude 'snap'  --exclude 'lost+found' --exclude=".*" --exclude=".*/" 127.0.0.1::home /media/username/external/home-files-only && sync && echo 3 > /proc/sys/vm/drop_caches
   
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 10
    fi
done

#end of shell script

问题
我怎样才能摆脱这个ERROR: max connections (1) reached -- try again later错误?

答案1

我最终得出的解决方案是确保while loop如果连接尚未建立和/或连接断开,则我只执行一次。

笔记:根据文档 rsync-daemon 配置,我的解决方案(而不是解决方法)应该是不必要的,但似乎尽管.lock为每个模块都有单独命名的文件,但第一个带有 a 的脚本while loop仍然能够以某种方式连接(而不是阻止)其他.lock文件被其他相应的脚本使用。 (rsync 错误?)

解决方案 1(快速且肮脏):

flock -n <lock file> <script>

或者就我而言,使用此命令执行我的 cron 作业:

flock -n /var/run/rsyncd-home.lock /path/to/my_script.sh

警告- 这使得您的脚本容易受到过时的锁定文件的影响,这可能会阻止在下一个时间间隔执行。

解决方案2:
所以,我用了一个防弹方法(所以我认为......如果需要的话,我邀请人们纠正我的理解)......

首先,我做了apt install procmail

从那里我编辑/usr/local/bin/backupscript.sh如下:

#!/bin/bash
#
LOCK=/var/run/rsyncd-home.lock
remove_lock()
{
    rm -f "$LOCK"
}
another_instance()
{
    echo "There is another instance running, exiting"
    exit 1
}
lockfile -r 0 -l 3600 "$LOCK" || another_instance
trap remove_lock EXIT

#new using rsyncd & perpetual restart
while [ 1 ]
do
   cputool --load-limit 7.5 -- nice -n -15 rsync -avxP --no-i-r --rsync-path="rsync" --log-file=/var/log/rsync-home.log --exclude 'lost+found' --exclude=".*" --exclude=".*/" 127.0.0.1::home /media/username/external/home-files-only && sync && echo 3 > /proc/sys/vm/drop_caches
   
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 10
    fi
done

#end of shell script

普雷斯托:
该脚本只会连接到 rsync 守护进程一次,由于 while 循环,它将在断开的连接上重新连接,并且不存在过时的锁定文件在未来间隔中断我的备份过程的危险......(即问题已解决)。

相关内容