Liệu rsync --inplace ghi vào toàn bộ tệp, hoặc chỉ vào các phần cần được cập nhật? (đối với các bản sao lưu btrfs + rsync)


21

Tôi đã đọc một số hướng dẫn về cách kết hợp ảnh chụp nhanh btrfs với rsync để tạo ra một giải pháp sao lưu hiệu quả với lịch sử. Tuy nhiên, tất cả phụ thuộc vào việc rsync --inplacechỉ sửa đổi những phần của tệp thực sự thay đổi hay nếu nó ghi đè lên toàn bộ tệp một cách tuần tự. Nếu nó ghi toàn bộ tệp thì có vẻ như btrfs sẽ luôn tạo một bản sao mới của tệp, điều này sẽ khiến ý tưởng kém hiệu quả hơn nhiều.


Làm thế nào nó thậm chí sẽ biết nếu nó có thể tránh ghi vào toàn bộ tập tin? Không cần đọc toàn bộ tập tin trước, để tìm hiểu điều gì đã thay đổi?
Mehrdad

2
@Mehrdad vâng, đúng vậy, nhưng đọc toàn bộ không phải là vấn đề. Nếu rsyncđọc toàn bộ tệp và sau đó tìm kiếm và chỉ cập nhật những phần cần thiết, btrfs sẽ chỉ sao chép các khối được cập nhật này. Nhưng nếu rsyncđọc ghi toàn bộ tập tin, thì đó sẽ là một vấn đề.
Petr Pudlák

1
@Mehrdad rsynckhông chỉ biết rằng nó có thể tránh ghi toàn bộ tệp, nó quản lý để làm như vậy mà không sao chép nó hoàn toàn qua mạng. Chương trình nhỏ thông minh.
Gunther Piez

Câu trả lời:


31

Nếu bạn vượt qua rsync hai đường dẫn cục bộ, nó sẽ mặc định sử dụng "--whole-file" và không chuyển delta. Vì vậy, những gì bạn đang tìm kiếm là "--no-toàn bộ tập tin". Bạn cũng nhận được chuyển delta nếu bạn yêu cầu '-c'.

Đây là cách bạn có thể xác minh:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

Sau đó chạm vào một tập tin và đồng bộ hóa lại

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

Bạn có thể xác minh nó đã sử dụng lại inode với "ls -li", nhưng lưu ý rằng nó đã gửi toàn bộ 64K byte. Thử lại với --no-toàn bộ tập tin

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

Bây giờ bạn chỉ gửi 494 byte. Bạn có thể sử dụng strace để xác minh thêm nếu có bất kỳ tệp nào được viết, nhưng điều này cho thấy nó ít nhất được sử dụng chuyển delta.

Lưu ý (xem bình luận) rằng đối với các hệ thống tệp cục bộ, --whole-fileđược giả sử (xem trang man cho rsync). Mặt khác, trên toàn bộ một mạng --no-whole-fileđược giả định, do đó, --inplacechính nó sẽ hoạt động như --inplace --no-whole-file.


Tại sao không --inplacengụ ý --no-whole-file?
Lão máu

Không phải là --no-whole-filemặc định sao?
Lão máu

2
@Geremia không nếu cả hai đường dẫn là cục bộ. Và ví dụ của tôi cho thấy điều --inplaceđó không ngụ ý --no-whole-filecho phiên bản rsync tôi đã sử dụng vào năm 2013, nhưng bạn có thể lặp lại thử nghiệm này với phiên bản rsync của riêng bạn.
dataless

Chà, inplacekhông phải là về việc "quét các khối giống nhau / khác nhau", nó chỉ là ghi đè lên tệp hiện có ngay lập tức, từ offset 0. (khác với một bản sao tạm thời được tạo ra, và chỉ sau đó xóa tệp mục tiêu cũ và sao chép tạm thời Có lẽ nó được coi là an toàn hơn để giữ tập tin cũ càng lâu càng tốt, nếu quá trình bị gián đoạn. Tất nhiên điều này tệ hơn về hiệu suất, mức tiêu thụ lưu trữ cao nhất (nghĩ là các tệp lớn), có thể bị phân mảnh ...) ...
Frank Nocke

1
Tôi sẽ cho rằng, theo cách khác, --no-whole-fileluôn luôn ngụ ý --inplace, nếu không thì phần lớn hiệu suất của nó sẽ không còn nữa. Không thể tìm thấy tài liệu này, mặc dù ...
Frank Nocke

15

Đây là câu trả lời chắc chắn tôi đoán, trích dẫn phần chính xác của hướng dẫn:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.

4

--inplaceghi đè chỉ các khu vực đã thay đổi. Luôn luôn sử dụng nó khi viết lên Btrfs.


Và bạn có bằng chứng cho thấy nó không ghi đè lên các phần khác của tệp không?
Petr Pudlák

Có áp dụng tương tự cho ZFS không?
ewwhite

@ewwhite: Vì ZFS là COW (copy-on-write) như BTRFS, nên có.
Geremia

@ PetrPudlák -vvvcho thấy nó bỏ qua các khối phù hợp
Tom Hale

3

Thuật toán chuyển delta của rsync xử lý xem toàn bộ tệp được truyền hay chỉ các phần khác nhau. Đây là hành vi mặc định khi kết nối một tệp giữa hai máy để tiết kiệm băng thông. Điều này có thể được ghi đè bằng --whole-file(hoặc -W) để buộc rsynctruyền toàn bộ tệp.

--inplaceliên quan đến việc rsync, trong quá trình chuyển giao, sẽ tạo ra một tập tin tạm thời hay không. Hành vi mặc định là tạo một tệp tạm thời. Điều này đưa ra một biện pháp an toàn ở chỗ nếu quá trình truyền bị gián đoạn, tệp hiện có trong máy đích vẫn còn nguyên / chưa được xử lý. --inplaceghi đè hành vi này và yêu rsynccầu cập nhật trực tiếp tệp hiện có. Với điều này, bạn có nguy cơ có một tệp không nhất quán trong máy đích nếu quá trình chuyển bị gián đoạn.


2

Từ trang người đàn ông:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

Điều này khiến tôi tin rằng nó ghi toàn bộ tập tin-- Tôi tưởng tượng rằng rsync gần như không thể hoạt động theo bất kỳ cách nào khác.


2
Sau khi xác định phần nào cần cập nhật, nó chỉ có thể tìm đến các phần đó và cập nhật chúng, thay vì viết toàn bộ tệp.
Petr Pudlák

0

Công việc lý thuyết về rsync tại chỗ được mô tả trong bài viết này .

Tài liệu tham khảo: D. Rasch và R. Burns. Đồng bộ hóa tại chỗ: Đồng bộ hóa tệp cho thiết bị di động và không dây. Hội nghị kỹ thuật thường niên USENIX, theo dõi FREENIX, 91-100, USENIX, 2003.

Từ liên kết:

... Chúng tôi đã sửa đổi triển khai rsync hiện có để hỗ trợ tái thiết tại chỗ.

Tóm tắt: [...] Chúng tôi đã sửa đổi rsync để nó hoạt động trên các thiết bị bị giới hạn không gian. Các tệp trên máy chủ đích được cập nhật trong cùng bộ lưu trữ mà phiên bản hiện tại của tệp chiếm giữ. Các thiết bị bị giới hạn không gian không thể sử dụng rsync truyền thống vì nó yêu cầu bộ nhớ hoặc lưu trữ cho cả phiên bản cũ và mới của tệp. Ví dụ bao gồm đồng bộ hóa các tệp trên điện thoại di động và PC cầm tay, có bộ nhớ nhỏ. Thuật toán rsync tại chỗ mã hóa biểu diễn nén của tệp trong biểu đồ, sau đó được sắp xếp theo cấu trúc liên kết để đạt được thuộc tính tại chỗ. [...]

Vì vậy, điều này dường như là các chi tiết kỹ thuật về những gì rsync --inplace đang làm. Theo phần đầu của bài báo:

Chúng tôi đã sửa đổi rsync để nó thực hiện các tác vụ đồng bộ hóa tệp với việc xây dựng lại tại chỗ. [...] Thay vì sử dụng không gian tạm thời, các thay đổi đối với tệp đích diễn ra trong không gian đã bị chiếm bởi phiên bản hiện tại. Công cụ này có thể được sử dụng để đồng bộ hóa các thiết bị nơi không gian bị giới hạn.

Như đã rõ ràng từ câu trả lời của @ dataless , điều này ngụ ý rằng --inplaceviệc sử dụng cùng một không gian lưu trữ, nhưng nó vẫn có thể sao chép toàn bộ tệp vào không gian đó. Cụ thể, khi các bản sao được tạo từ / đến các hệ thống tệp cục bộ, rsync giả định --whole-filetùy chọn. Nhưng mặt khác, trên các hệ thống được nối mạng, nó sẽ thừa nhận --no-whole-filetùy chọn này.


1
Ừm, vậy câu trả lời là gì?
Xen2050

Lời xin lỗi của tôi. Tôi đã không chú ý đầy đủ. Với câu trả lời của @ dataless, điều này sẽ làm sáng tỏ mọi thứ.
chéo
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.