2010-11-30 50 views
3

我有一臺備份服務器,它每小時接收很多rsync連接。由於打開太多的實例可能會導致崩潰,因此我想使用Semaphore來限制併發實例的數量。我想到的是這樣的:Ubuntu中的信號燈和鎖

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

任何想法?

回答

12

在我看來,你應該看在服務器端直接限制併發連接數,這樣你就不必做任何極端的客戶端:

(1)如果您在守護進程模式下運行rsync,rsyncd.conf有一個max connections選項。 (2)在Linux上,可以使用iptables及其connlimit模塊至limit從一個或多個遠程主機到端口的併發連接數。您可能必須強制任何rsync客戶端使用與普通ssh用戶不同的端口,並讓sshd實例也可以監聽。 (3)用包裝腳本替換服務器上的rsync二進制文件,該腳本將捕獲rsync內部使用的--server參數,並停止運行,直到有可用的插槽爲止。所述包裝腳本應該確保同時執行不超過N個本身的實例。例如。

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

請注意,這個腳本主要是未經測試並缺乏必要的陷阱代碼,如果中斷,甚至刪除鎖文件。它也不會處理任何陳舊的鎖定文件等或創建鎖定目錄。

如果您對制定自己的信號量有所建議,您可能會對我上面使用的mutex感興趣,以避免計算鎖文件數量和創建新的鎖文件之間的競爭狀態,這可能允許兩個(或更多)實例在單個插槽中運行。

在所有這些情況下,您應確保您的客戶端可以正常處理連接超時或拒絕連接。

如果您確實想按照您的建議使用信號樣式系統,則上面的腳本可能會進行一些修改。