2010-11-30 4 views
3

J'ai un serveur de sauvegarde qui reçoit de nombreuses connexions rsync toutes les heures. Étant donné que trop d'instances ouvertes rsync peuvent le planter, je souhaite limiter le nombre d'instances simultanées en utilisant un Semaphore. Ce que j'ai à l'esprit est quelque chose comme:Sémaphores et verrous dans Ubuntu

ssh [email protected]_server "get_semaphore"  #Will hold until semaphore released 
rsync -avzrL --super --delete local_directory [email protected]_server:`localhost` 

Des idées?

Répondre

12

À mon avis, vous devriez regarder à limiter le nombre de connexions simultanées directement sur le côté serveur, de sorte que vous n'avez rien à faire extrême du côté client:

(1) Si vous exécutez rsync en mode démon, il existe une option max connections pour rsyncd.conf.

(2) Sous Linux, vous pouvez utiliser iptables et son module connlimit pour limit le nombre de connexions simultanées à un port d'un ou de plusieurs hôtes distants. Vous devrez peut-être forcer tous les clients rsync à utiliser un port différent de celui de vos utilisateurs ssh habituels et une instance sshd l'écoutera également.

(3) Remplacez votre binaire rsync sur le serveur par un script wrapper qui interceptera le paramètre --server utilisé en interne par rsync et stall jusqu'à ce qu'un emplacement soit disponible. Ce script wrapper doit s'assurer que pas plus de N instances de lui-même sont exécutées en même temps. Par exemple.

#!/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 "[email protected]" 

    rm -f /var/lock/rsync/$$ 
else 
    rsync.bin "[email protected]" 
fi 

S'il vous plaît noter que ce script est la plupart du temps non testé et qu'il n'a pas le code piège nécessaire pour enlever la lockfile même si elle est interrompue. Il ne prend pas non plus en charge les fichiers de verrous périmés, etc., ou la création du répertoire de verrous.

Si vous êtes en train de faire votre propre implémentation de sémaphore, vous pourriez être intéressé par le mutex utilisé ci-dessus, afin d'éviter la condition de concurrence entre compter le nombre de fichiers lockfile et créer un nouveau fichier lockfile ou plus) les instances à exécuter dans un seul emplacement.

Dans tous ces cas, vous devez vous assurer que vos clients peuvent gérer les délais d'attente de connexion ou les connexions rejetées avec élégance.

Si vous voulez vraiment utiliser un système de style sémaphore comme vous l'avez proposé, le script ci-dessus peut être utilisé avec quelques modifications.