我有一个备份服务器,每小时收到许多rsync
个连接。由于具有太多开放rsync
实例可能会使其崩溃,因此我想使用Semaphore来限制并发实例的数量。我想到的是:
ssh root@backup_server "get_semaphore" #Will hold until semaphore released
rsync -avzrL --super --delete local_directory root@backup_server:`localhost`
有什么想法吗?
答案 0 :(得分:12)
在我看来,您应该考虑直接在服务器端限制并发连接的数量,这样您就不必在客户端做任何极端的事情了:
(1)如果在守护进程模式下运行rsync,则rsyncd.conf有max connections
选项。
(2)在Linux上,您可以使用iptables
及其connlimit
模块来limit从一个或多个远程主机到端口的并发连接数。您可能必须强制任何rsync客户端使用与普通ssh用户不同的端口,并让sshd实例也听取它。
(3)使用包装器脚本替换服务器上的rsync二进制文件,该脚本将捕获rsync内部使用的--server参数并停止,直到插槽可用。所述包装器脚本应该确保同时执行的N个实例不超过N个。 E.g。
#!/bin/bash
N=5
mutex_hold() {
while ! mkdir /var/lock/rsync/mutex 2>/dev/null; do
sleep 1
done
}
mutex_release() {
rmdir /var/lock/rsync/mutex
}
if [[ "$1" = "--server" ]]; then
shopt -s nullglob
while mutex_hold && A=(/var/lock/rsync/[0-9]*) && [[ "${#A[@]}" -ge "$N" ]] && mutex_release; do
sleep 1
done
touch /var/lock/rsync/$$
mutex_release
rsync.bin "$@"
rm -f /var/lock/rsync/$$
else
rsync.bin "$@"
fi
请注意,此脚本大部分未经测试,并且即使被中断,它也缺少必要的陷阱代码来删除锁定文件。它也不会处理任何过时的锁文件等或创建锁目录。
如果您已经开始制作自己的信号量实现,您可能会对我上面使用的mutex感兴趣,以避免计算锁定文件数和创建新锁文件之间的竞争条件,这可能是允许两个(或多个)实例在单个插槽中运行。
在所有这些情况下,您应该确保您的客户端可以优雅地处理连接超时或拒绝连接。
如果你真的想要使用你提出的信号量风格的系统,上面的脚本可能会有一些修改。