Song song rsync bằng GNU Parallel


18

Tôi đã sử dụng một rsynctập lệnh để đồng bộ hóa dữ liệu tại một máy chủ với dữ liệu tại một máy chủ khác. Dữ liệu có nhiều tệp kích thước nhỏ góp phần lên tới gần 1,2TB.

Để đồng bộ các tệp đó, tôi đã sử dụng rsynclệnh như sau:

rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/

Nội dung của proj.lst như sau:

+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *

Để thử nghiệm, tôi đã chọn hai trong số các dự án đó (8,5 GB dữ liệu) và tôi đã thực hiện lệnh trên. Là một quá trình tuần tự, nó hoàn thành 14 phút 58 giây. Vì vậy, đối với 1,2TB dữ liệu sẽ mất vài giờ.

Nếu tôi sẽ có thể nhiều rsyncquá trình song song (sử dụng &, xargshoặc parallel), nó sẽ tiết kiệm thời gian của tôi.

Tôi đã thử với lệnh bên dưới với parallel(sau khi cdvào thư mục nguồn) và phải mất 12 phút 37 giây để thực thi:

parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .

Điều này sẽ mất ít hơn 5 lần thời gian, nhưng nó đã không. Tôi nghĩ rằng, tôi đang đi sai ở đâu đó.

Làm thế nào tôi có thể chạy nhiều rsyncquy trình để giảm thời gian thực hiện?


1
Bạn có bị giới hạn bởi băng thông mạng? Đĩa iops? Băng thông đĩa?
Ole Tange

Nếu có thể, chúng tôi muốn sử dụng 50% tổng băng thông. Nhưng, song song nhiều rsyncs là ưu tiên hàng đầu của chúng tôi.
Mandar Shinde

Bạn có thể cho chúng tôi biết: Băng thông mạng, vòng lặp đĩa, băng thông đĩa và băng thông thực sự được sử dụng không?
Ole Tange

Trong thực tế, tôi không biết về các thông số trên. Hiện tại, chúng ta có thể bỏ qua phần tối ưu hóa. Nhiều rsyncs song song là trọng tâm chính bây giờ.
Mandar Shinde

Không có điểm nào đi song song nếu giới hạn không phải là CPU. Nó có thể / thậm chí sẽ làm cho vấn đề tồi tệ hơn (xung đột chuyển động của cánh tay trên đĩa nguồn hoặc đĩa đích).
xenoid

Câu trả lời:


16

Các bước sau đã làm công việc cho tôi:

  1. Chạy rsync --dry-runđầu tiên để có được danh sách các tập tin sẽ bị ảnh hưởng.
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
    --human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
  1. Tôi ăn đầu ra của cat transfer.logđể parallelđể chạy 5 rsyncs song song, như sau:
$ cat /tmp/transfer.log | \
    parallel --will-cite -j 5 rsync -avzm --relative \
      --stats --safe-links --ignore-existing \
      --human-readable {} REMOTE-HOST:/data/ > result.log

Ở đây, --relativetùy chọn ( liên kết ) đảm bảo rằng cấu trúc thư mục cho các tệp bị ảnh hưởng, tại nguồn và đích, vẫn giữ nguyên ( /data/thư mục bên trong ), do đó lệnh phải được chạy trong thư mục nguồn (ví dụ /data/projects:).


5
Điều đó sẽ làm một rsync trên mỗi tập tin. Có lẽ sẽ hiệu quả hơn khi tách toàn bộ danh sách tệp bằng cách sử dụng splitvà đưa các tên tệp đó thành song song. Sau đó sử dụng rsync --files-fromđể lấy tên tệp ra khỏi mỗi tệp và đồng bộ hóa chúng. sao lưu rm. * split -l 3000 backup.list sao lưu. Sao lưu ls. * | song song --line-đệm --verbose -j 5 rsync --progress -av --files-từ {} / local / PHỤ HUYNH / PATH / REMOTE_HOST: REMOTE_PATH /
Sandip Bhattacharya

1
Làm thế nào để lệnh rsync thứ hai xử lý các dòng trong result.log không phải là tệp? tức receiving file list ... done created directory /data/.
Mike D

1
Trên các phiên bản mới hơn của rsync (3.1.0+), bạn có thể sử dụng --info=namethay thế -vvà bạn sẽ chỉ nhận được tên của các tệp và thư mục. Bạn cũng có thể muốn sử dụng --protect-args để chuyển rsync 'bên trong' nếu bất kỳ tệp nào có thể có dấu cách hoặc ký tự đại diện trong đó.
Cheetah

13

Cá nhân tôi sử dụng đơn giản này:

ls -1 | parallel rsync -a {} /destination/directory/

Điều này chỉ hữu ích khi bạn có nhiều hơn một vài thư mục gần như trống rỗng, cuối cùng bạn sẽ có gần như mọi rsyncchấm dứt và người cuối cùng làm tất cả công việc một mình.


Điều này hoạt động rất tốt - khó để biết nó có làm gì không, vì vậy một -v để song song làm cho nó trở nên trò chuyện hơn. Ngoài ra, -j 30 đến song song (tức là trước lệnh rsync) làm cho nó chạy 30 công việc, không chỉ một công việc trên mỗi lõi CPU là mặc định.
Criggie

12

Tôi đặc biệt không khuyến khích bất kỳ ai sử dụng câu trả lời được chấp nhận, một giải pháp tốt hơn là thu thập dữ liệu thư mục cấp cao nhất và khởi chạy một số lượng hoạt động rync theo tỷ lệ.

Tôi có một khối lượng zfs lớn và nguồn của tôi là một cifs mount. Cả hai đều được liên kết với 10G và trong một số điểm chuẩn có thể bão hòa liên kết. Hiệu suất được đánh giá bằng cách sử dụng zpool iostat 1.

Ổ đĩa nguồn được gắn kết như sau:

mount -t cifs -o username=,password= //static_ip/70tb /mnt/Datahoarder_Mount/ -o vers=3.0

Sử dụng một rsyncquy trình duy nhất :

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/ /StoragePod

đồng hồ io đọc:

StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.62K      0   130M

Điều này trong các điểm chuẩn tổng hợp (đĩa tinh thể), hiệu suất cho ghi tuần tự đạt tới 900 MB / s có nghĩa là liên kết đã bão hòa. 130MB / s không tốt lắm, và sự khác biệt giữa chờ đợi một ngày cuối tuần và hai tuần.

Vì vậy, tôi đã xây dựng danh sách tệp và cố gắng chạy lại đồng bộ hóa (tôi có máy 64 lõi):

cat /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount.log | parallel --will-cite -j 16 rsync -avzm --relative --stats --safe-links --size-only --human-readable {} /StoragePod/ > /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount_result.log

và nó đã có hiệu suất tương tự!

StoragePod  29.9T   144T      0  1.63K      0   130M
StoragePod  29.9T   144T      0  1.62K      0   130M
StoragePod  29.9T   144T      0  1.56K      0   129M

Để thay thế, tôi chỉ cần chạy rsync trên các thư mục gốc:

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/Marcello_zinc_bone /StoragePod/Marcello_zinc_bone
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/fibroblast_growth /StoragePod/fibroblast_growth
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/QDIC /StoragePod/QDIC
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/sexy_dps_cell /StoragePod/sexy_dps_cell

Điều này thực sự tăng hiệu suất:

StoragePod  30.1T   144T     13  3.66K   112K   343M
StoragePod  30.1T   144T     24  5.11K   184K   469M
StoragePod  30.1T   144T     25  4.30K   196K   373M

Để kết luận, khi @Sandip Bhattacharya đưa ra, hãy viết một đoạn script nhỏ để lấy các thư mục và song song đó. Hoặc, chuyển một danh sách tập tin cho rsync. Nhưng đừng tạo phiên bản mới cho mỗi tệp.


5

Một cách được thử nghiệm để thực hiện rsync song song là: http://www.gnu.org/software/abul/man.html#EXAMPLE:-Parallelizing-rsync

rsync là một công cụ tuyệt vời, nhưng đôi khi nó sẽ không lấp đầy băng thông có sẵn. Đây thường là một vấn đề khi sao chép một số tệp lớn qua các kết nối tốc độ cao.

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/ 

Nếu bạn không thể đẩy dữ liệu, nhưng cần phải kéo chúng và các tệp được gọi là Digit.png (ví dụ 000000.png) bạn có thể thực hiện:

seq -w 0 99 | parallel rsync -Havessh fooserver:src/*{}.png destdir/

Bất kỳ thay thế khác để tránh find?
Mandar Shinde

1
Giới hạn -maxdepth của tìm.
Ole Tange

Nếu tôi sử dụng --dry-runtùy chọn trong rsync, tôi sẽ có một danh sách các tệp sẽ được chuyển. Tôi có thể cung cấp danh sách tập tin đó parallelđể song song với quá trình không?
Mandar Shinde

1
tập tin mèo | song song -v ssh fooserver mkdir -p / Dest-dir / {//} \; rsync -s -Havessh {} fooserver: / Dest-dir / {}
Ole Tange

Bạn có thể vui lòng giải thích mkdir -p /dest-dir/{//}\;phần? Đặc biệt là {//}điều hơi khó hiểu.
Mandar Shinde

1

Đối với đồng bộ hóa đa đích, tôi đang sử dụng

parallel rsync -avi /path/to/source ::: host1: host2: host3:

Gợi ý: Tất cả các kết nối ssh được thiết lập với các khóa công khai trong ~/.ssh/authorized_keys


1

Tôi luôn google cho rsync song song vì tôi luôn quên lệnh đầy đủ, nhưng không có giải pháp nào hiệu quả với tôi như tôi muốn - có thể bao gồm nhiều bước hoặc cần cài đặt parallel. Tôi đã kết thúc bằng cách sử dụng một lớp lót này để đồng bộ nhiều thư mục:

find dir/ -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo dir/%/ host:/dir/%/)'

-P 5 là số lượng quá trình bạn muốn sinh ra - sử dụng 0 cho không giới hạn (rõ ràng là không nên).

--bwlimit để tránh sử dụng tất cả băng thông.

-I %đối số được cung cấp bởi find (thư mục tìm thấy trong dir/)

$(echo dir/%/ host:/dir/%/)- in các thư mục nguồn và đích được đọc bởi rsync làm đối số. % được thay thế bằng xargstên thư mục được tìm thấy bởi find.

Giả sử tôi có hai thư mục trong /home: dir1dir2. Tôi chạy find /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'. Vì vậy, lệnh rsync sẽ chạy dưới dạng hai quy trình (hai quy trình vì /homecó hai thư mục) với các đối số sau:

rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
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.