Паралелізація rsync


30

Я просто переїхав і після деяких спроб і помилок виявив, що десь між моїм домом та моїм віддаленим сервером відбувається деяке дроселювання ... але дроселювання не дуже розумне. Це лише заглушує окремі з'єднання. Тож якщо я скопіюю один 1 Гб файл, він буде тривати зі швидкістю 150 кбіт / с. Але якщо я ініціалізую 10 копій, кожна з них піде зі швидкістю 150 кбіт / с (тобто я отримаю набагато більшу сукупну пропускну здатність за декількох з'єднань).

Я досить часто використовую rsync для синхронізації деяких великих наборів даних з роботи додому (на щастя у вигляді багатьох файлів). Чи є спосіб сказати rsync для завантаження за допомогою декількох з'єднань? Теоретично це повинно бути можливим, оскільки, наскільки я можу сказати, rsync спочатку робить пропуск для визначення необхідних змін, а потім виконує фактичну передачу. Бонусні бали, якщо є магічний спосіб сказати rsync розрізати окремі файли на N шматочків, а потім з'єднати їх назад. Я вважаю, що CuteFTP насправді досить розумний, щоб зняти це.

Відповіді:


13

У мене просто була подібна проблема з тим, щоб перенести кілька туберкульозу з однієї NAS на іншу NAS без можливості резервного копіювання / відновлення, що дозволило б мені просто подати 1 набір в інший.

Тому я написав цей скрипт, щоб запустити 1 rsync для кожного каталогу, який він стикається. Це залежить від можливості перелічити каталоги-джерела (будьте обережні, щоб уникнути ARG 3), але я думаю, ви могли б встановити цей етап за допомогою нерекурсивної rsync, яка просто копіювала файли та каталоги на відповідний рівень.

Він також визначає, скільки rsync буде запущено, виходячи з кількості процесорів, але ви можете налаштувати це.

Інший можливий варіант, який спадає на думку, - запустити rsync в режимі - тільки для списку.

Це дасть вам усі файли, які потрібно оновити. Потім запустіть 1 rsync для кожного файлу у вашому списку, якщо ви використовували xargs для управління кількістю rsyncs, у яких ви збиралися, це може бути дуже елегантним. Насправді, мабуть, більш елегантне рішення, ніж мій маленький сценарій тут ...

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

2
Це працює - ви можете зробити багато вдосконалень у тому, як це працює, але концепція використання xargs для паралелізації вашої програми досить нова.
MattPark

6

GNU Parallel має рішення

Я перемістив 15 ТБ на 1 Гбіт / с, і це може наситити посилання 1 Гбіт / с.

Далі розпочнеться один rsync на великий файл у src-dir до dest-dir на нижньому сервері:

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

Створені режими можуть призвести до неправильних дозволів, і менші файли не передаються. Щоб виправити ці функції запуску rsync:

rsync -Havessh src-dir/ fooserver:/dest-dir/

1
Не заперечуєте вставити розділ "ПРИКЛАД: Паралелізація rsync" у свою відповідь. Про всяк випадок, якщо в майбутньому посилання розірветься.
пікобіт

3

Так. Така особливість існує.

Існує утиліта під назвою pssh, яка забезпечує описану функціональність.

Цей пакет пропонує паралельні версії інструментів opensh. У дистрибуцію включено:

  • Паралельний ssh ​​(pssh)
  • Паралельний scp (pscp)
  • Паралельна rsync (prsync)
  • Паралельна нукера (pnuke)
  • Паралельна сусп (pslurp)

Я не впевнений, наскільки легко налаштувати, але це може просто зробити трюк!


26
Утиліти pssh використовуються для розповсюдження команд на декілька серверів, не виконуйте одну й ту ж команду ще раз на одному сервері. Зокрема, prsync підтримує лише надсилання файлу на локальній машині на декілька зовнішніх машин. Він не підтримує завантаження віддаленого файлу з декількома з'єднаннями.
Дерек Дамер

1
Враховуючи коментар @ DerekDahmer, афіша цієї відповіді може захотіти її зняти?
mc0e

3

Я не можу коментувати, тому я додав нову відповідь з трохи кращим кодом, ніж попередній (приємний та розумний) код.

Перевірте rsyncрядок, оскільки вона містить необов’язковий ioniceнастрой.

#!/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
DST_BASE=user@hostname.domain.local:/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

2

Схоже, хтось написав цю утиліту для вас. Це розбиває передачу на паралельні шматки. Це краща реалізація, ніж версія "паралельно великий файл", перелічена під GNU Parallel:

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

Також lftp може паралельно передавати файли через ftp, ftps, http, https, hftp, fish, sftp. Багато разів є деякі переваги щодо використання lftp, оскільки керування дозволами, обмеженим доступом тощо для rsync може бути складним завданням.


Хоча це працює, це може викликати велику кількість фрагментації диска швидко, оскільки ви не просто використовуєте декілька з'єднань для завантаження одного файлу.
bparker

1

Ні. Такої функції немає. Ви можете розділити синхронізацію на кілька дзвінків, rsyncякщо цього дуже хотіли.

Я б запропонував вам знайти що-небудь, що робить це обмеження швидкості, і поговорити серйозно з тим, хто підтримує / керує ним.


4
Часто такі обмеження мають деякі провайдери, такі як Comcast. Удачі вам з ними будь-які розумні розмови.
Джеймс Мур

1

Я хотів одночасно перенести кілька каталогів (з багатьма файлами), тому створив цей невеликий сценарій:

#!/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
DST_BASE=user@example.com:/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."

Я зробив цей сценарій досить швидко, тому, будь ласка, перегляньте його та протестуйте перед використанням у виробничих умовах.


0

Я створив наступний сценарій, щоб паралельно завантажувати багато папок із зображеннями. Ви запускаєте його спочатку ціллю синхронізації, а потім усіма назвами папок, які потрібно скопіювати.

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

Він додає ім'я папки жовтим кольором до всіх вихідних даних консолі rsync, щоб зробити її красивою.


-1

Aria2 - це хороша клієнтська програма для завантаження даних, використовуючи безліч з'єднань із багатьох дзеркал. Він не підтримує SFTP. Отже, я встановив FTP-сервер - vsftpd . Моє 3g з'єднання працює на повну потужність з 5 підключеннями до FTP-сервера.


1
Чи хотіли б ви розширити це питання, щоб зробити вашу відповідь корисною?
Тог
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.