Parallelisierung von rsync

Ich bin gerade umgezogen und habe nach einigen Versuchen und Fehlern festgestellt, dass irgendwo zwischen meinem Zuhause und meinem Remote-Server eine Drosselung stattfindet...aber die Drosselung ist nicht sehr intelligent. Es drosselt nur einzelne Verbindungen. Wenn ich also eine 1 GB-Datei kopiere, wird es bei 150 kBps fröhlich weitergehen. Aber wenn ich 10 Kopien initialisiere, wird jede von ihnen mit 150 kBps gehen (dh ich bekomme viel höhere aggregierte Bandbreite über mehrere Verbindungen).

Ich benutze rsync ziemlich oft, um synchronisieren Sie einige große Datensätze von der Arbeit nach Hause (zum Glück in Form vieler Dateien). Gibt es eine Möglichkeit, rsync anzuweisen, über mehrere Verbindungen herunterzuladen? Theoretisch sollte es möglich sein, da rsync, soweit ich das beurteilen kann, zuerst einen Durchlauf durchführt, um die erforderlichen Änderungen zu bestimmen, und dann die eigentliche Übertragung durchführt. Bonuspunkte, wenn es eine magische Möglichkeit gibt, rsync mitzuteilen, dass er einzelne Dateien in N Teile aufteilen und sie dann wieder zusammenfügen soll. Ich glaube, CuteFTP ist tatsächlich schlau genug, um das abzuziehen.

Author: Hennes, 2011-11-02

9 answers

Ich hatte gerade ein ähnliches Problem, dass ich mehrere TB von einem NAS auf ein anderes NAS verschieben musste, ohne dass ich eine Sicherungs - /Wiederherstellungsfunktion hatte, mit der ich nur 1 Satz auf das andere übertragen konnte.

Also habe ich dieses Skript geschrieben, um xargs zu verwenden und mehrere rsyncs für jedes Verzeichnis auszuführen, auf das es stößt. Es hängt davon ab, ob Sie die Quellverzeichnisse auflisten können (achten Sie darauf, ARG 3 zu umgehen), aber ich denke, Sie könnten diese Phase mit einer nicht rekursiven rsync festlegen, die nur Dateien und Verzeichnisse in die entsprechenden kopiert Ebene.

Es bestimmt auch, wie viele Rsyncs basierend auf der Anzahl der Prozessoren ausgeführt werden sollen, aber Sie möchten dies möglicherweise optimieren.

#! /bin/bash
SRC_DIR=$1
DEST_DIR=$2
LIST=$3
CPU_CNT=`cat /proc/cpuinfo|grep processor |wc -l`
#  pseudo random heuristic
let JOB_CNT=CPU_CNT*4
[ -z "$LIST" ] && LIST="-tPavW --exclude .snapshot --exclude hourly.?"
echo "rsyncing From=$SRC_DIR To=$DEST_DIR DIR_LIST=$LIST"
mkdir -p /{OLD,NEW}_NAS/home
[ -z "$RSYNC_OPTS" ] && RSYNC_OPTS="-tPavW --delete-during --exclude .snapshot --exclude hourly.?"
cd $SRC_DIR
echo $LIST|xargs -n1 echo|xargs -n1 -P $JOB_CNT -I% rsync ${RSYNC_OPTS} ${SRC_DIR}/%/ ${DEST_DIR}/%/
 13
Author: kkron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-07-08 21:08:43

GNU Parallel hat eine Lösung

Ich habe 15 TB durch 1 Gbps bewegt und es kann die 1 Gbps-Verbindung sättigen.

Im Folgenden wird eine rsync pro große Datei in src-dir zu dest-dir auf dem Server fooserver starten:

cd src-dir; find . -type f -size +100000 | \
parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \
  rsync -s -Havessh {} fooserver:/dest-dir/{}

Die erstellten Verzeichnisse haben möglicherweise falsche Berechtigungen und kleinere Dateien werden nicht übertragen. Um diese zu beheben, führen Sie rsync ein letztes Mal aus:

rsync -Havessh src-dir/ fooserver:/dest-dir/
 6
Author: Ole Tange,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-05-15 20:27:57

{[0],} ja. Eine solche Funktion existiert.

Es gibt ein Dienstprogramm namens pssh, das die beschriebene Funktionalität bereitstellt.

Dieses Paket enthält parallele Versionen der openssh-Tools. Eingeschlossen in der Verteilung:

  • Parallel-ssh (pssh)
  • Paralleles scp (pscp)
  • Parallel rsync (prsync)
  • [[10]}Parallele Atombombe (pnuke)
  • Parallel schlürfen (pslurp)

Ich bin mir nicht sicher, wie einfach es ist einrichten, aber es könnte nur den Trick tun!

 3
Author: Tim Bielawa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-11-03 01:06:35

Ich kann keinen Kommentar abgeben, daher habe ich eine neue Antwort mit einem etwas besseren Code als dem vorherigen Code (nice & smart) hinzugefügt.

Überprüfen Sie die Zeile rsync, da sie einen optionalen ionice Tweak enthält.

#!/bin/bash
start_time=$(date +%s.%N)
# Transfer files in parallel using rsync (simple script)
# MAXCONN: maximum number "rsync" processes running at the same time:
MAXCONN=6
# Source and destination base paths. (not need to end with "/")
SRC_BASE=/home/user/public_html/images
[email protected]:/home/user/public_html/images
RSYNC_OPTS="-ah --partial"
# Main loop:
for FULLDIR in $SRC_BASE/*; do
    NUMRSYNC=`ps -Ao comm | grep '^'rsync'$' | wc -l `
    while [ $NUMRSYNC -ge $MAXCONN ]; do
        NUMRSYNC=`ps -Ao comm | grep '^'rsync'$' | wc -l `
        sleep 1
    done
    DIR=`basename $FULLDIR`
    echo "Start: " $DIR
    ionice -c2 -n5 rsync $RSYNC_OPTS $SRC_BASE/${DIR}/ $DST_BASE/${DIR}/ &
    # rsync $RSYNC_OPTS $SRC_BASE/${DIR}/ $DST_BASE/${DIR}/ &
    sleep 5
done

execution_time=$(echo "$(date +%s.%N) - $start" | bc)
printf "Done. Execution time: %.6f seconds\n" $execution_time
 3
Author: Widmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-20 10:04:35

Sieht so aus, als hätte jemand dieses Dienstprogramm für Sie geschrieben. Es zerlegt die Übertragung in parallele Teile. Dies ist eine bessere Implementierung als die unter GNU Parallel aufgeführte Version "parallel big file":

Https://gist.github.com/rcoup/5358786

Außerdem lftp kann parallelisieren Dateiübertragungen über ftp, ftps, http, https, hftp, fish, sftp. Oft gibt es einige Vorteile bei der Verwendung von lftp, da die Verwaltung von Berechtigungen, eingeschränktem Zugriff usw. für rsync sein kann herausfordernd.

 2
Author: Erik Aronesty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-10-30 16:45:11

Nein. Eine solche Funktion existiert nicht. Sie könnten die Synchronisierung in mehrere Aufrufe von rsync aufteilen, wenn Sie es wirklich wollten.

Ich würde vorschlagen, dass Sie finden, was auch immer es ist, das diese Ratenbegrenzung tut und ein ernstes Gespräch mit wem auch immer es unterhält / verwaltet.

 1
Author: David Schwartz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-11-02 23:59:27

Ich wollte mehrere Verzeichnisse (mit vielen Dateien) gleichzeitig übertragen, also habe ich dieses kleine Skript erstellt:

#!/bin/bash
# Transfer files in parallel using rsync (simple script)
# MAXCONN: maximum number "rsync" processes running at the same time:
MAXCONN=10
# Source and destination base paths. (not need to end with "/")
SRC_BASE=/home/sites
[email protected]:/var/www
RSYNC_OPTS="--stats -ilrtpog"
# Main loop:
for FULLDIR in $SRC_BASE/*/; do
    NUMRSYNC=`ps -Ao comm | grep '^'rsync'$' | wc -l `
    while [ $NUMRSYNC -ge $MAXCONN ]; do
        NUMRSYNC=`ps -Ao comm | grep '^'rsync'$' | wc -l `
        sleep 10
    done
    DIR=`basename $FULLDIR`
    rsync $RSYNC_OPTS $SRC_BASE/${DIR}/ $DST_BASE/${DIR}/ & 
    sleep 1 
done
echo "Done."

Habe ich dieses Skript sehr schnell, so bitte überarbeiten und testen Sie vor der Verwendung in einer Produktionsumgebung.

 1
Author: lepe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-04-14 10:26:07

Ich habe das folgende Skript erstellt, um viele Ordner mit Bildern parallel hochzuladen. Sie führen es zuerst mit dem Synchronisierungsziel und dann mit allen zu kopierenden Ordnernamen aus.

#!/bin/sh

dest="$1"
shift

if [ "$dest" = "" ]; then
    echo "USAGE: $0 TARGET:/foo/bar <dir1> [dir2] [dir3]"
    exit 1
fi

RCol='\x1B[0m' # Text Reset
BYel='\x1B[1;33m';

for i in "$@"; do
    prefix=`printf "$BYel%50s:$RCol" "$i"`
    echo "$prefix * Starting $i"
    echo "$prefix -> syncing '$i/' to '$dest/$i/'"
    (rsync -rv "$i/" "$dest/$i/") 2>&1 | sed "s/^/$prefix /g" &
    sleep 0.5
done

echo "* Waiting for all to complete"
wait

Der Ordnername wird allen rsync-Konsolenausgaben gelb vorangestellt, damit sie hübsch aussehen.

 0
Author: konrad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-05-15 17:30:40

Aria2 ist ein gutes Clientprogramm zum Herunterladen von Daten mit vielen Verbindungen von vielen Spiegeln. Es unterstützt nicht SFTP. Also habe ich FTP server - vsftpd installiert. Meine 3G-Verbindung funktioniert mit voller Leistung mit 5 Verbindungen zum FTP-Server.

 -1
Author: puchu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-09-06 10:44:39