3 Stimmen

Semaphoren und Sperren in Ubuntu

Ich habe einen Backup-Server, der viele rsync Verbindungen im Stundentakt. Da zu viele offene rsync Instanzen zum Absturz bringen könnten, möchte ich die Anzahl der gleichzeitigen Instanzen mit einem Semaphor . Was ich im Sinn habe, ist etwas wie:

ssh root@backup_server "get_semaphore"     #Will hold until semaphore released
rsync -avzrL --super --delete local_directory root@backup_server:`localhost`

Irgendwelche Ideen?

12voto

thkala Punkte 80165

Meiner Meinung nach sollten Sie die Anzahl der gleichzeitigen Verbindungen direkt auf der Serverseite begrenzen, so dass Sie auf der Client-Seite nichts Extremes tun müssen:

(1) Wenn Sie rsync im Daemon-Modus ausführen, gibt es eine max connections Option für rsyncd.conf.

(2) Unter Linux können Sie mit iptables und seine connlimit Modul zu Grenze die Anzahl der gleichzeitigen Verbindungen zu einem Anschluss von einem oder mehreren entfernten Hosts. Möglicherweise müssen Sie alle rsync-Clients dazu zwingen, einen anderen Port als Ihre normalen ssh-Benutzer zu verwenden, und eine sshd-Instanz dazu veranlassen, diesen ebenfalls abzuhören.

(3) Ersetzen Sie Ihre rsync-Binärdatei auf dem Server durch ein Wrapper-Skript, das den --server-Parameter abfängt, der intern von rsync verwendet wird, und die Ausführung solange verzögert, bis ein Slot verfügbar ist. Das besagte Wrapper-Skript sollte sicherstellen, dass nicht mehr als N Instanzen von ihm selbst gleichzeitig ausgeführt werden. z.B..

#!/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

Bitte beachten Sie, dass dieses Skript größtenteils ungetestet ist und dass ihm der notwendige Trap-Code fehlt, um die Sperrdatei zu entfernen, selbst wenn sie unterbrochen wird. Es kümmert sich auch nicht um veraltete Sperrdateien usw. oder um die Erstellung des Sperrverzeichnisses.

Wenn Sie Ihre eigene Semaphor-Implementierung erstellen wollen, könnten Sie sich für die Mutex die ich oben verwendet habe, um die Wettlaufbedingung zwischen dem Zählen der Anzahl der Lockfiles und dem Erstellen eines neuen Lockfiles zu vermeiden, die es zwei (oder mehr) Instanzen ermöglichen könnte, in einem einzigen Slot zu laufen.

In all diesen Fällen sollten Sie sicherstellen, dass Ihre Clients in der Lage sind, Verbindungszeitüberschreitungen oder abgewiesene Verbindungen ordnungsgemäß zu behandeln.

Wenn Sie wirklich ein Semaphor-ähnliches System verwenden wollen, wie Sie es vorgeschlagen haben, könnte das obige Skript mit ein paar Änderungen verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X