ขนาน rsync


30

ฉันเพิ่งย้ายและค้นพบหลังจากการทดลองและข้อผิดพลาดที่ระหว่างบ้านและเซิร์ฟเวอร์ระยะไกลของฉันมีการควบคุมปริมาณที่เกิดขึ้น ... แต่การควบคุมปริมาณไม่ฉลาดมาก มัน จำกัด เฉพาะการเชื่อมต่อของแต่ละบุคคล ดังนั้นถ้าฉันคัดลอกหนึ่งไฟล์ 1 GB มันจะดำเนินต่อไปอย่างสนุกสนานที่ 150 kBps แต่ถ้าฉันเริ่มต้น 10 สำเนาแต่ละชุดจะอยู่ที่ 150 kBps (เช่นฉันจะได้รับแบนด์วิดธ์รวมที่สูงขึ้นมากผ่านการเชื่อมต่อหลายจุด)

ฉันใช้ rsync ค่อนข้างบ่อยในการซิงโครไนซ์ชุดข้อมูลขนาดใหญ่บางส่วนจากที่บ้านไปที่บ้าน (โชคดีในรูปแบบของไฟล์จำนวนมาก) มีวิธีบอก rsync ให้ดาวน์โหลดโดยใช้การเชื่อมต่อที่หลากหลายหรือไม่? ในทางทฤษฎีแล้วมันควรจะเป็นไปได้ตั้งแต่ที่ฉันบอกได้ rsync จะผ่านการตรวจสอบการเปลี่ยนแปลงที่จำเป็นก่อนแล้วจึงทำการส่งจริง คะแนนโบนัสหากมีวิธีที่วิเศษในการบอก rsync ให้แบ่งไฟล์แต่ละไฟล์ออกเป็น N ส่วนแล้วต่อกลับมารวมกัน ฉันเชื่อว่า CuteFTP ฉลาดพอที่จะดึงมันออกมาได้

คำตอบ:


13

ฉันเพิ่งมีปัญหาคล้ายกันที่ต้องย้าย TB หลาย ๆ ตัวจาก 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 ขนานมีทางออก 

ฉันย้าย 15 TB ผ่าน 1 Gbps และสามารถเชื่อมโยง 1 Gbps ให้อิ่มตัว

ต่อไปนี้จะเริ่มต้นหนึ่ง rsync ต่อไฟล์ขนาดใหญ่ใน src-dir เพื่อ dest-dir บนเซิร์ฟเวอร์ fooserver:

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

dirs ที่สร้างขึ้นอาจจบลงด้วยการอนุญาตที่ไม่ถูกต้องและไฟล์ขนาดเล็กจะไม่ถูกถ่ายโอน หากต้องการแก้ไขการเรียกใช้ rsync ในครั้งสุดท้าย:

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

1
คุณต้องการวางส่วน "ตัวอย่าง: การขนาน rsync" ลงในคำตอบของคุณหรือไม่ ในกรณีที่การเชื่อมโยงในอนาคต
picobit

3

ใช่. คุณสมบัติดังกล่าวมีอยู่

มียูทิลิตีที่ชื่อpsshที่จัดเตรียมการทำงานที่อธิบายไว้

แพ็กเกจนี้จัดเตรียมเครื่องมือ openssh เวอร์ชันขนาน รวมอยู่ในการจัดจำหน่าย:

  • ssh แบบขนาน (pssh)
  • SCP แบบขนาน (pscp)
  • rsync แบบขนาน (prsync)
  • nuke ขนาน (pnuke)
  • Slurp แบบขนาน (pslurp)

ฉันไม่แน่ใจว่ามันง่ายแค่ไหนในการตั้งค่า แต่มันอาจจะทำเคล็ดลับ!


26
ยูทิลิตี pssh ถูกใช้เพื่อกระจายคำสั่งไปยังเซิร์ฟเวอร์หลายเครื่องโดยไม่ใช้คำสั่งเดียวกันหลายครั้งในเซิร์ฟเวอร์เดียว โดยเฉพาะ prsync รองรับเฉพาะการส่งไฟล์บนเครื่องท้องถิ่นของคุณไปยังเครื่องภายนอกหลายเครื่อง ไม่รองรับการดาวน์โหลดไฟล์ระยะไกลที่มีการเชื่อมต่อหลายจุด
Derek Dahmer

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
ข้อ จำกัด เหล่านี้มักมาจาก ISP บางรายเช่น Comcast โชคดีที่มีบทสนทนาที่สมเหตุสมผลกับพวกเขา
James Moore

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
คุณต้องการขยายเพื่อให้คำตอบของคุณมีประโยชน์หรือไม่
Tog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.