Song song hóa rsync


30

Tôi vừa di chuyển và phát hiện ra sau một số thử nghiệm và lỗi rằng ở đâu đó giữa nhà tôi và máy chủ từ xa của tôi, có một số điều tiết đang diễn ra ... nhưng điều tiết không phải là rất thông minh. Nó chỉ điều chỉnh các kết nối cá nhân. Vì vậy, nếu tôi sao chép một tệp 1 GB, nó sẽ tiếp tục hoạt động với tốc độ 150 kBps. Nhưng nếu tôi khởi tạo 10 bản sao, mỗi bản sẽ có tốc độ 150 kBps (tức là tôi nhận được băng thông tổng hợp cao hơn nhiều trên nhiều kết nối).

Tôi sử dụng rsync khá thường xuyên để đồng bộ hóa một số bộ dữ liệu lớn từ nơi làm việc đến nhà (may mắn thay ở dạng nhiều tệp). Có cách nào để yêu cầu rsync tải xuống bằng nhiều kết nối không? Về mặt lý thuyết nên có thể vì theo như tôi có thể nói, trước tiên, rsync thực hiện một bước để xác định các thay đổi cần thiết và sau đó thực hiện việc truyền thực tế. Điểm thưởng nếu có một cách kỳ diệu để nói rsync cắt các tệp riêng lẻ thành N mảnh và sau đó ghép chúng lại với nhau. Tôi tin rằng CuteFTP thực sự đủ thông minh để thực hiện điều đó.

Câu trả lời:


13

Tôi chỉ gặp một vấn đề tương tự là phải chuyển nhiều TB từ một NAS sang một NAS khác mà không có khả năng sao lưu / khôi phục sẽ cho phép tôi chỉ cung cấp 1 bộ khác.

Vì vậy, tôi đã viết kịch bản này để chạy 1 rsync cho mỗi thư mục mà nó gặp. Nó phụ thuộc vào việc có thể liệt kê các thư mục nguồn (hãy cẩn thận để thoát ARG 3) nhưng tôi nghĩ bạn có thể đặt giai đoạn đó với một rsync không đệ quy chỉ sao chép các tệp và thư mục ở mức phù hợp.

Nó cũng xác định có bao nhiêu rsync để chạy dựa trên số lượng bộ xử lý nhưng bạn có thể muốn điều chỉnh nó.

Tùy chọn khả thi khác xuất hiện trong đầu là: chạy rsync ở chế độ - chỉ dành cho danh sách.

Điều đó sẽ cung cấp cho bạn tất cả các tệp cần được cập nhật Sau đó chạy 1 rsync cho mỗi tệp trong danh sách của bạn nếu bạn sử dụng xargs để quản lý số lượng rsyncs bạn đã sử dụng, điều này có thể rất thanh lịch. Trên thực tế có lẽ là một giải pháp thanh lịch hơn so với kịch bản nhỏ của tôi ở đây ...

#! /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
Điều này hoạt động - bạn có thể thực hiện rất nhiều cải tiến về cách thức hoạt động, nhưng khái niệm sử dụng xargs để song song hóa ứng dụng của bạn là khá mới lạ.
MattPark 17/12/13

6

GNU Parallel có một giải pháp

Tôi đã di chuyển 15 TB qua 1 Gbps và nó có thể bão hòa liên kết 1 Gbps.

Sau đây sẽ bắt đầu một rsync cho mỗi tệp lớn trong src-dir đến Dest-dir trên máy chủ fooserver:

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

Các thư mục được tạo có thể kết thúc với quyền sai và các tệp nhỏ hơn không được chuyển. Để khắc phục những lần chạy rsync lần cuối:

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

1
Bạn có phiền khi dán phần "VÍ DỤ: Song song hóa rsync" vào câu trả lời của bạn không. Chỉ trong trường hợp liên kết bị phá vỡ trong tương lai.
picobit

3

Vâng. Một tính năng như vậy tồn tại.

Có một tiện ích gọi là pssh cung cấp chức năng được mô tả.

Gói này cung cấp các phiên bản song song của các công cụ openssh. Bao gồm trong phân phối:

  • Song song ssh (pssh)
  • Scp song song (pscp)
  • Rsync song song (prsync)
  • Song song nuke (pnuke)
  • Bùn song song (pslurp)

Tôi không chắc cách dễ dàng để thiết lập, nhưng nó có thể chỉ là một mẹo nhỏ!


26
Các tiện ích pssh được sử dụng để truyền bá các lệnh trên nhiều máy chủ, không thực hiện cùng một lệnh nhiều lần trên một máy chủ. Cụ thể, prsync chỉ hỗ trợ gửi tệp trên máy cục bộ của bạn ra nhiều máy bên ngoài. Nó không hỗ trợ tải xuống một tập tin từ xa với nhiều kết nối.
Derek Dahmer

1
Đưa ra nhận xét của @ DerekDahmer, người đăng câu trả lời này có thể muốn rút lại không?
mc0e

3

Tôi không thể nhận xét, vì vậy tôi đã thêm một câu trả lời mới, với mã tốt hơn một chút so vớitrước đây (đẹp & thông minh).

Kiểm tra rsyncdòng, bởi vì nó chứa một ionicetinh chỉnh tùy chọn .

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

Có vẻ như ai đó đã viết tiện ích này cho bạn. Nó phá vỡ sự chuyển giao thành các khối song song. Đây là một triển khai tốt hơn so với phiên bản "tệp lớn song song" được liệt kê trong GNU Parallel:

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

Ngoài ra, lftp có thể song song chuyển tập tin qua ftp, ftps, http, https, hftp, fish, sftp. Rất nhiều lần, có một số lợi thế khi sử dụng lftp, bởi vì việc quản lý quyền, quyền truy cập bị hạn chế, v.v ... cho rsync có thể là một thách thức.


Trong khi điều này hoạt động, nó có thể gây ra sự phân mảnh đĩa lớn một cách nhanh chóng, vì bạn không chỉ đơn giản là sử dụng nhiều kết nối để tải xuống cùng một tệp.
bparker

1

Không. Không có tính năng như vậy tồn tại. Bạn có thể chia đồng bộ thành nhiều cuộc gọi rsyncnếu bạn thực sự muốn.

Tôi khuyên bạn nên tìm bất cứ điều gì đang làm hạn chế tỷ lệ này và nói chuyện nghiêm túc với bất cứ ai duy trì / quản lý nó.


4
Thường thì những hạn chế đó là từ một số ISP như Comcast. Chúc may mắn có bất kỳ loại cuộc trò chuyện hợp lý với họ.
James Moore

1

Tôi muốn chuyển một số thư mục (có nhiều tệp) cùng một lúc, vì vậy tôi đã tạo tập lệnh nhỏ này:

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

Tôi đã thực hiện kịch bản này khá nhanh, vì vậy vui lòng sửa lại và kiểm tra nó trước khi sử dụng trong môi trường sản xuất.


0

Tôi đã tạo tập lệnh sau để tải lên nhiều thư mục có hình ảnh song song. Bạn chạy nó với mục tiêu đồng bộ hóa đầu tiên và sau đó tất cả các tên thư mục sẽ sao chép.

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

Nó tiền tố tên thư mục màu vàng cho tất cả đầu ra giao diện điều khiển rsync để làm cho nó trông đẹp.


-1

Aria2 là một chương trình máy khách tốt để tải xuống dữ liệu bằng nhiều kết nối từ nhiều máy nhân bản. Nó không hỗ trợ SFTP. Vì vậy, tôi đã cài đặt máy chủ FTP - vsftpd . Kết nối 3g của tôi hoạt động hết công suất với 5 kết nối với máy chủ FTP.


1
Bạn có quan tâm đến việc mở rộng về điều đó để làm cho câu trả lời của bạn hữu ích?
Tog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.