rsync đến nhiều điểm đến bằng cách sử dụng cùng một filelist?


22

Tôi tự hỏi liệu rsync có thể sao chép một thư mục sang nhiều đích từ xa trong một lần hay thậm chí là song song. (không cần thiết, nhưng sẽ hữu ích.)

Thông thường, một cái gì đó như sau sẽ hoạt động tốt:

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup

Và nếu đó là lựa chọn duy nhất, tôi sẽ sử dụng nó. Tuy nhiên, / rác nằm trên một ổ đĩa chậm với khá nhiều tệp và việc xây dựng lại filelist của khoảng ~ 12.000 tệp mỗi lần chậm một cách khó chịu (~ 5 phút) so với chuyển / cập nhật thực tế. Có thể làm một cái gì đó như thế này, để hoàn thành điều tương tự:

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 

Cảm ơn đã tìm kiếm!

Câu trả lời:


12

Dưới đây là thông tin từ trang man cho rsync về chế độ hàng loạt.

CHẾ ĐỘ BATCH

Chế độ hàng loạt có thể được sử dụng để áp dụng cùng một bộ cập nhật cho nhiều hệ thống giống hệt nhau. Giả sử người ta có một cây được sao chép trên một số máy chủ. Bây giờ giả sử một số thay đổi đã được thực hiện cho cây nguồn này và những thay đổi đó cần được truyền đến các máy chủ khác. Để thực hiện việc này bằng chế độ hàng loạt, rsync được chạy với tùy chọn ghi hàng loạt để áp dụng các thay đổi được thực hiện cho cây nguồn cho một trong các cây đích. Tùy chọn write-batch khiến máy khách rsync lưu trữ trong "tệp bó" tất cả thông tin cần thiết để lặp lại thao tác này với các cây đích giống hệt nhau khác.

Tạo tệp bó một lần giúp tiết kiệm phải thực hiện trạng thái tệp, tổng kiểm tra và tạo khối dữ liệu nhiều lần khi cập nhật nhiều cây đích. Các giao thức truyền tải đa luồng có thể được sử dụng để chuyển các tệp cập nhật hàng loạt song song cho nhiều máy chủ cùng một lúc, thay vì gửi cùng một dữ liệu đến từng máy chủ.

Để áp dụng các thay đổi được ghi lại cho cây đích khác, hãy chạy rsync với tùy chọn đọc theo lô, chỉ định tên của cùng một tệp bó và cây đích. Rsync cập nhật cây đích bằng cách sử dụng thông tin được lưu trữ trong tệp bó.

Để thuận tiện cho bạn, một tệp script cũng được tạo khi sử dụng tùy chọn write-batch: nó sẽ được đặt tên giống như tệp bó với ".sh" được thêm vào. Tệp tập lệnh này chứa một dòng lệnh phù hợp để cập nhật cây đích bằng cách sử dụng tệp bó được liên kết. Nó có thể được thực thi bằng cách sử dụng shell Bourne (hoặc giống Bourne), tùy ý chuyển vào một tên đường dẫn cây đích thay thế mà sau đó được sử dụng thay vì đường dẫn đích ban đầu. Điều này hữu ích khi đường dẫn cây đích trên máy chủ hiện tại khác với đường dẫn được sử dụng để tạo tệp bó.

   Examples:

          $ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/
          $ scp foo* remote:
          $ ssh remote ./foo.sh /bdest/dir/

          $ rsync --write-batch=foo -a /source/dir/ /adest/dir/
          $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo

Trong các ví dụ này, rsync được sử dụng để cập nhật / adest / dir / from / source / dir / và thông tin để lặp lại thao tác này được lưu trữ trong "foo" và "foo.sh". Máy chủ "từ xa" sau đó được cập nhật với dữ liệu theo đợt đi vào thư mục / bdest / dir. Sự khác biệt giữa hai ví dụ cho thấy một số tính linh hoạt mà bạn có trong cách bạn xử lý các lô:

  • Ví dụ đầu tiên cho thấy rằng bản sao ban đầu không phải là cục bộ - bạn có thể đẩy hoặc kéo dữ liệu đến / từ một máy chủ từ xa bằng cách sử dụng cú pháp shell-remote hoặc cú pháp rsync daemon, như mong muốn.

  • Ví dụ đầu tiên sử dụng tệp "foo.sh" đã tạo để có các tùy chọn rsync phù hợp khi chạy lệnh đọc lô trên máy chủ từ xa.

  • Ví dụ thứ hai đọc dữ liệu bó thông qua đầu vào tiêu chuẩn để tệp bó không cần được sao chép vào máy từ xa trước. Ví dụ này tránh tập lệnh foo.sh vì nó cần sử dụng tùy chọn --read-batch đã sửa đổi, nhưng bạn có thể chỉnh sửa tệp tập lệnh nếu bạn muốn sử dụng tập lệnh này (chỉ cần chắc chắn rằng không có tùy chọn nào khác đang cố sử dụng tiêu chuẩn đầu vào, chẳng hạn như tùy chọn "--exclude-from = -").

    Hãy cẩn thận:

    Tùy chọn đọc theo đợt mong muốn cây đích mà nó đang cập nhật giống hệt với cây đích được sử dụng để tạo tập tin cập nhật hàng loạt. Khi gặp phải sự khác biệt giữa các cây quốc gia, bản cập nhật có thể bị loại bỏ với cảnh báo (nếu tệp có vẻ đã được cập nhật) hoặc sau đó có thể thử cập nhật tệp, nếu tệp không thể xác minh , bản cập nhật bị loại bỏ với một lỗi. Điều này có nghĩa là sẽ an toàn khi chạy lại thao tác đọc theo lô nếu lệnh bị gián đoạn. Nếu bạn muốn buộc cập nhật theo đợt luôn luôn được cố gắng bất kể kích thước và ngày của tệp, hãy sử dụng tùy chọn -I (khi đọc lô). Nếu xảy ra lỗi, cây đích có thể sẽ ở trạng thái được cập nhật một phần. Trong trường hợp đó,

    Phiên bản rsync được sử dụng trên tất cả các điểm đến ít nhất phải mới như phiên bản được sử dụng để tạo tệp bó. Rsync sẽ chết vì lỗi nếu phiên bản giao thức trong tệp bó quá mới để rsync đọc hàng loạt xử lý. Xem thêm tùy chọn --protatio để biết cách tạo rsync tạo tệp bó mà rsync cũ có thể hiểu được. (Lưu ý rằng các tệp bó đã thay đổi trong phiên bản 2.6.3, do đó, việc trộn các phiên bản cũ hơn phiên bản mới hơn sẽ không hoạt động.)

    Khi đọc tệp bó, rsync sẽ buộc giá trị của một số tùy chọn nhất định khớp với dữ liệu trong tệp bó nếu bạn không đặt chúng giống như lệnh ghi hàng loạt. Các tùy chọn khác có thể (và nên) được thay đổi. Ví dụ: các thay đổi --write-batch thành --read-batch, --files-from bị loại bỏ và các tùy chọn --filter / - include / - không cần thiết trừ khi một trong các tùy chọn --delete được chỉ định .

    Mã tạo tệp BATCH.sh sẽ chuyển đổi bất kỳ tùy chọn bộ lọc / bao gồm / loại trừ nào thành một danh sách được thêm vào dưới dạng tài liệu "ở đây" vào tệp tập lệnh shell. Người dùng nâng cao có thể sử dụng điều này để sửa đổi danh sách loại trừ nếu muốn thay đổi nội dung bị xóa bởi --delete. Một người dùng bình thường có thể bỏ qua chi tiết này và chỉ sử dụng tập lệnh shell như một cách dễ dàng để chạy lệnh --read-batch thích hợp cho dữ liệu theo đợt.

    Chế độ hàng loạt ban đầu trong rsync dựa trên "rsync +", nhưng phiên bản mới nhất sử dụng cách triển khai mới.

Tôi sẽ tưởng tượng bạn có thể thử

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup

Lệnh được đề xuất không hoạt động:remote destination is not allowed with --read-batch
kynan

Hiển thị lệnh hoàn chỉnh. -đối với tên tệp có nghĩa là đọc từ đầu vào tiêu chuẩn và STDIN cũng được đọc từ footrong ví dụ, một tệp cục bộ.
Chloe

2
Đây dường như là giải pháp chính xác tối đa cho những gì tôi đã cố gắng thực hiện, mặc dù trường hợp sử dụng của tôi cho việc này từ lâu đã bốc hơi vào Ether. : D
Jessie

4

Bạn có thể thử sử dụng unison . Nó sẽ nhanh hơn nhiều trong việc xây dựng danh sách tập tin vì nó giữ một bộ đệm của các tập tin.


2
Lưu ý: Unison không giữ 'bộ đệm' của các tệp. Nó chỉ giữ một cơ sở dữ liệu về tên tệp, dấu thời gian, tổng kiểm tra. Nó vẫn thực hiện quét hệ thống tệp và tạo tổng kiểm tra để so sánh với điều khiển từ xa. Ưu điểm duy nhất của Unison là đồng bộ hai chiều. Tôi đề nghị Unison, nhưng nó sẽ không giúp ở đây.
Chloe

4

Các rsync --batch-modehỗ trợ phát đa hướng. Nếu điều này là có thể trên mạng của bạn, nó có thể đáng để xem xét điều đó.


2

Làm thế nào về việc thay đổi hệ thống tập tin?

Cách đây một thời gian, tôi đã chuyển đổi một FS nhiều terabyte từ ext3 sang XFS. Thời gian để quét các thư mục (với khoảng 600.000 tệp lần trước tôi đã kiểm tra) đã đi từ 15-17 phút đến dưới 30 giây!


1

Không phải là câu trả lời trực tiếp, nhưng nếu bạn sử dụng rsync phiên bản 3+, nó sẽ bắt đầu chuyển trước khi tạo toàn bộ filelist.

Một lựa chọn khác, vẫn không hiệu quả lắm, sẽ là chạy chúng như một công việc để một số ít chạy cùng một lúc.

Ngoài ra, tôi chỉ nghĩ về sự kỳ lạ này nếu bạn không phiền khi sử dụng tar:

tar cf - . | tee >(ssh localhost 'cat > test1.tar') >(ssh localhost 'cat > test2.tar') >/dev/null

Tất nhiên, mỗi localhost sẽ là các máy chủ khác nhau (giả sử đăng nhập dựa trên khóa). Không bao giờ sử dụng ở trên trước mặc dù.


Hừm! Thật kỳ lạ, cwrsync (rsync 3.0.7) dường như không làm điều đó. Tuy nhiên, tôi sẽ phải xem xét lý do tại sao điều đó sẽ giúp ích rất nhiều trong việc cắt giảm những khoảng thời gian khổng lồ này. Cảm ơn!
Jessie

Phiên bản đó ở cả hai bên?
Kyle Brandt

Không, thực sự; máy cục bộ là cwrsync 3.0.7 và máy chủ từ xa (tốt, máy tôi đang làm việc với bây giờ) là rsync 3.0.3 trên Debian Lenny. Có vẻ như đó không phải là một sự khác biệt quá lớn đối với phiên bản sai đối với nó, nhưng tôi không biết .. Tôi sẽ xem xét nâng cấp phía Debian.
Jessie

1
Thật là một ít lẻ một lót. Tuy nhiên, điều đó có thể hoạt động nếu tôi không tận dụng thực tế rằng rsync không cần lặp lại một vài hợp đồng dữ liệu trên một số liên kết chậm khi, nhiều nhất, chỉ vài trăm kb đã thay đổi. Ngoài ra, việc nhận cả hai đầu vào (cw) rsync 3.0.7 vẫn thực hiện việc xây dựng danh sách tệp và chuyển giao một cách an toàn. Không quá quan tâm về điều đó, mặc dù.
Jessie

Không phải là "tar cf -." giống như "tar c." ?
Johan Boulé

1

Làm thế nào về việc chạy các công việc rsync từ host1, host2 và host3? Hoặc, chạy một công việc để sao chép vào host1, và sau đó chạy nó trên host2 và host3 để lấy nó từ host1.


1

Một giải pháp tốt hơn sẽ là tạo một kho lưu trữ với git và chỉ cần đẩy lên 3 máy chủ. Nhanh hơn, bạn sẽ không cần phần danh sách tập tin và nó tiêu tốn ít tài nguyên hơn.

Chúc may mắn,
João Miguel Neves


10
git không bảo toàn thời gian sửa đổi cũng như quyền (ngoại trừ bit thực thi) và sẽ yêu cầu lưu trữ bản sao dữ liệu thứ hai dưới dạng đối tượng git .git/mặc dù đẩy đến điều khiển từ xa có hầu hết dữ liệu sẽ nhanh hơn. git không phải là sự thay thế cho rsync.
Dân D.

Thêm vào đó, git có thể xem công khai, trừ khi bạn trả tiền.
Chloe

8
@Chloe, bạn nhầm git với GitHub. Git chính nó là mã nguồn mở miễn phí hệ thống phân phối kiểm soát phiên bản, và bất cứ ai có thể lưu trữ kho git bằng bất kỳ phương tiện, bao gồm http, nfsafp. GitHub là một trang web chăm sóc việc tạo và duy trì git repos cho bạn và đặt chúng ở chế độ công khai (trừ khi bạn trả tiền).
toriningen

1
@Chloe GitHub có thể xem công khai, nhưng BitBucket cung cấp repos riêng.
trao đổi

2
Ngoài ra, Git không theo dõi các thư mục trống.
Flimm

1

Khi tự mình tìm kiếm câu trả lời này, tôi nghĩ rằng trước tiên bạn cần tạo một lô bằng cách sử dụng rsync và sau đó gửi cho tất cả mọi người, điều này sẽ khiến cho danh sách tệp chỉ cần được xử lý một lần, và sau đó bạn có thể chỉ cần nền tất cả ba rsyncs để chạy chúng song song.


1

Một giải pháp khả thi khác là chỉ chạy song song nhiều quá trình rsync như bạn có máy chủ, tức là fork.

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.