Rsync को समानांतर करना


30

मैं बस चला गया और कुछ परीक्षण और त्रुटि के बाद पता चला कि कहीं मेरे घर और मेरे रिमोट सर्वर के बीच कुछ थ्रॉटलिंग चल रही है ... लेकिन थ्रॉटलिंग बहुत बुद्धिमान नहीं है। यह केवल व्यक्तिगत कनेक्शन को थ्रॉटल करता है। इसलिए अगर मैं एक 1 जीबी फ़ाइल की प्रतिलिपि बनाता हूं, तो यह 150 केबीपीएस पर तेजी से आगे बढ़ेगा। लेकिन अगर मैं 10 प्रतियों को इनिशियलाइज़ करता हूँ, तो उनमें से प्रत्येक 150 kBps पर जाएगी (यानी मुझे कई कनेक्शनों पर अधिक उच्च बैंडविड्थ प्राप्त होती है)।

मैं कुछ बड़े डेटासेट को घर से काम करने के लिए (सौभाग्य से कई फ़ाइलों के रूप में) सिंक्रनाइज़ करने के लिए अक्सर rsync का उपयोग करता हूं। क्या कई कनेक्शनों का उपयोग करके डाउनलोड करने के लिए rsync को बताने का कोई तरीका है? सैद्धांतिक रूप से यह संभव होना चाहिए क्योंकि जहां तक ​​मैं बता सकता हूं, rsync पहले आवश्यक बदलावों को निर्धारित करने के लिए एक पास करता है और फिर वास्तविक प्रसारण करता है। बोनस अंक अगर rsync को एन टुकड़ों में अलग-अलग फ़ाइलों को स्लाइस करने और फिर उन्हें एक साथ वापस विभाजित करने का एक जादुई तरीका है। मेरा मानना ​​है कि प्याराएफटीपी वास्तव में इतना स्मार्ट है कि इसे बंद कर दें।

जवाबों:


13

मुझे बस एक ही समस्या थी कि कई टीबी को एक एनएएस से एक अलग एनएएस में ले जाया जाए जिसमें कोई बैकअप / पुनर्स्थापना क्षमता नहीं है जो मुझे दूसरे को सिर्फ 1 सेट खिलाने की अनुमति देगा।

इसलिए मैंने इस स्क्रिप्ट को प्रत्येक निर्देशिका के लिए 1 rsync चलाने के लिए लिखा था। यह स्रोत निर्देशिकाओं (एआरजी 3 से बचने के लिए सावधान रहें) को सूचीबद्ध करने में सक्षम होने पर निर्भर करता है, लेकिन मुझे लगता है कि आप उस चरण को एक गैर-पुनरावर्ती rsync के साथ सेट कर सकते हैं जो उचित स्तर पर फ़ाइलों और निर्देशिकाओं की प्रतिलिपि बनाता है।

यह यह भी निर्धारित करता है कि प्रोसेसर की संख्या के आधार पर कितने rsync को चलाना है लेकिन आप इसे ट्विक करना चाहते हैं।

अन्य संभावित विकल्प जो मन में आता है वह है: rsync - in-only मोड।

यह आपको उन सभी फाइलों को देगा जिन्हें अपडेट करने की आवश्यकता है, फिर अपनी सूची में प्रत्येक फ़ाइल के लिए 1 rsync चलाएं यदि आपने xsgs का उपयोग किया था तो आपके द्वारा जाने वाले 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 का उपयोग करने की अवधारणा सुंदर उपन्यास है।
मटकाप

6

जीएनयू समानांतर में एक समाधान है । 

मैंने 1 जीबीपीएस के माध्यम से 15 टीबी स्थानांतरित किए हैं और यह 1 जीबीपीएस लिंक को संतृप्त कर सकता है।

सर्वर फोसर्वर पर डेस्ट-डीआईआर के लिए src-dir में एक बड़ी फ़ाइल प्रति rsync शुरू होगी:

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
क्या आप अपने जवाब में "EXAMPLE: पैरेललाइजिंग rsync" अनुभाग को चिपकाने का मन बना लेंगे। बस भविष्य में लिंक टूटने की स्थिति में।
पिकोबिट

3

हाँ। ऐसी सुविधा मौजूद है।

पीएसएच नामक एक उपयोगिता है जो वर्णित कार्यक्षमता प्रदान करती है।

यह पैकेज ओपनश टूल के समानांतर संस्करण प्रदान करता है। वितरण में शामिल:

  • समानांतर 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

लगता है कि किसी ने आपके लिए यह उपयोगिता लिखी है। यह समानांतर विखंडू में स्थानांतरण को तोड़ता है। यह जीएनयू समानांतर के तहत सूचीबद्ध "समानांतर बड़ी फ़ाइल" संस्करण की तुलना में बेहतर कार्यान्वयन है:

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

इसके अलावा, lftp ftp, ftps, http, https, hftp, fish, sftp के जरिए फाइल ट्रांसफर को समानांतर कर सकता है। बहुत बार, lftp का उपयोग करने के कुछ फायदे हैं, क्योंकि rsync के लिए अनुमतियाँ, प्रतिबंधित पहुंच आदि का प्रबंधन करना चुनौतीपूर्ण हो सकता है।


जब यह काम करता है, तो यह डिस्क विखंडन की एक बड़ी मात्रा को जल्दी से पैदा कर सकता है, क्योंकि आप बस एक ही फ़ाइल को डाउनलोड करने के लिए कई कनेक्शन का उपयोग नहीं कर रहे हैं।
bparker

1

नहीं, ऐसी कोई सुविधा मौजूद नहीं है। आप कई कॉल में सिंक्र को विभाजित कर सकते हैंrsyncयदि आप वास्तव में चाहते थे तो आप ।

मैं आपको सुझाव दूंगा कि जो कुछ भी यह है वह इस दर-सीमित कर रहा है और जो भी इसे बनाए रखता है / प्रबंधित करता है उसके साथ एक गंभीर बात की है।


4
बार-बार उन प्रतिबंधों को कुछ ISP से आता है जैसे 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 स्थापित किया है । मेरा 3 जी कनेक्शन एफ़टीपी सर्वर के 5 कनेक्शन के साथ पूर्ण शक्ति पर काम करता है।


1
क्या आप अपने उत्तर को उपयोगी बनाने के लिए उस पर विस्तार करना चाहेंगे?
कपड़ा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.