Apakah rsync --inplace menulis ke seluruh file, atau hanya ke bagian yang perlu diperbarui? (untuk backup btrfs + rsync)

21

Saya membaca beberapa panduan bagaimana menggabungkan snapshot btrf dengan rsync untuk membuat solusi cadangan yang efisien dengan riwayat. Namun itu semua tergantung pada apakah rsync --inplacememodifikasi hanya bagian-bagian dari file yang benar-benar berubah, atau jika itu menimpa seluruh file secara berurutan. Jika ia menulis seluruh file maka nampaknya btrfs akan selalu membuat salinan baru dari file tersebut, yang akan membuat idenya jauh lebih efisien.

Petr Pudlák
sumber
Bagaimana ia bisa tahu jika ia bisa menghindari menulis ke seluruh file? Tidak perlu membaca seluruh file terlebih dahulu, untuk mencari tahu apa yang telah berubah?
Mehrdad
2
@Madrdad ya, memang, tapi membaca keseluruhannya tidak masalah. Jika rsyncmembaca seluruh file dan kemudian mencari dan memperbarui hanya bagian-bagian yang diperlukan, btrfs hanya akan menyalin blok yang diperbarui ini. Tetapi jika rsyncmembaca dan menulis seluruh file, maka itu akan menjadi masalah.
Petr Pudlák
1
@Mehrdad rsynctidak hanya tahu bahwa ia mungkin menghindari menulis seluruh file, ia berhasil melakukannya tanpa menyalinnya sepenuhnya melalui internet. Program kecil pintar.
Gunther Piez

Jawaban:

31

Jika Anda melewatkan rsync dua lintasan lokal, itu akan menggunakan "--whole-file" secara default, dan bukan delta-transfer. Jadi, yang Anda cari adalah "--no-whole-file". Anda juga mendapatkan transfer delta jika Anda meminta '-c'.

Berikut cara Anda memverifikasi:

$ 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

Kemudian sentuh file dan sinkronkan kembali

$ 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

Anda dapat memverifikasinya menggunakan kembali inode dengan "ls -li", tetapi perhatikan itu mengirimkan 64K byte secara keseluruhan. Coba lagi dengan --no-whole-file

$ 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

Sekarang Anda hanya mengirim 494 byte. Anda dapat menggunakan strace untuk memverifikasi lebih lanjut jika ada file yang ditulis, tetapi ini menunjukkan setidaknya menggunakan delta-transfer.

Catatan (lihat komentar) yang --whole-filediasumsikan untuk sistem file lokal (lihat halaman manual untuk rsync). Di sisi lain, di seluruh jaringan --no-whole-filediasumsikan, jadi --inplacedengan sendirinya akan berperilaku sebagai --inplace --no-whole-file.

kebinasaan
sumber
Kenapa tidak --inplacemenyiratkan --no-whole-file?
Geremia
Bukankah --no-whole-filedefault?
Geremia
2
@Geremia tidak jika kedua jalur bersifat lokal. Dan contoh saya menunjukkan bahwa --inplacetidak menyiratkan --no-whole-fileuntuk versi rsync yang saya gunakan pada tahun 2013, tetapi Anda dapat mengulangi percobaan ini dengan versi rsync Anda sendiri.
dataless
Yah, inplaceini bukan tentang ‚pemindaian untuk blok yang sama / berbeda ', ini hanya tentang menimpa file yang ada segera, dari offset 0. (selain itu salinan sementara dibangun, dan hanya kemudian file target lama dihapus dan salinan temporer diganti namanya) Mungkin dianggap "lebih aman" untuk menyimpan file lama selama mungkin, jika prosesnya terputus. Tentu saja ini lebih buruk untuk kinerja, konsumsi penyimpanan puncak (pikirkan file besar), mungkin fragmentasi ...) ...
Frank Nocke
1
Saya akan berasumsi, bahwa itu sebaliknya, --no-whole-fileselalu menyiratkan --inplace, jika tidak sebagian besar keuntungan kinerjanya akan hilang. Tidak dapat menemukan ini didokumentasikan, ...
Frank Nocke
15

Di sini jawaban yang pasti saya kira, mengutip bagian yang benar dari manual:

   --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.
fuujuhi
sumber
4

--inplacehanya menimpa wilayah yang telah berubah. Selalu gunakan itu saat menulis ke Btrfs.

Gabriel
sumber
Dan apakah Anda memiliki bukti yang menunjukkan itu tidak menimpa bagian lain dari file?
Petr Pudlák
Apakah hal yang sama berlaku untuk ZFS?
ewwhite
@ewwhite: Karena ZFS adalah SAP (copy-on-write) seperti BTRFS, maka ya.
Geremia
@ PetrPudlák -vvvmenunjukkannya melewatkan blok yang cocok
Tom Hale
3

Algoritma transfer delta rsync berkaitan dengan apakah seluruh file ditransmisikan atau hanya bagian-bagian yang berbeda. Ini adalah perilaku default ketika melakukan rsyncing file antara dua mesin untuk menghemat bandwidth. Ini dapat diganti dengan --whole-file(atau -W) untuk memaksa rsyncmengirimkan seluruh file.

--inplaceberurusan dengan apakah rsync, selama transfer, akan membuat file sementara atau tidak. Perilaku default adalah membuat file sementara. Ini memberikan ukuran keamanan bahwa jika transfer terputus, file yang ada di mesin tujuan tetap utuh / tidak tersentuh. --inplacemengganti perilaku ini dan memberi tahu rsyncuntuk memperbarui file yang ada secara langsung. Dengan ini, Anda berisiko memiliki file yang tidak konsisten di mesin tujuan jika transfer terputus.

Mike T.
sumber
2

Dari halaman manual:

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.

Ini membuat saya percaya bahwa itu menulis file secara keseluruhan - Saya membayangkan hampir mustahil bagi rsync untuk bekerja dengan cara lain.

Laxsnor
sumber
2
Setelah menentukan bagian mana yang perlu diperbarui, ia dapat mencari bagian itu dan memperbaruinya, alih-alih menulis seluruh file.
Petr Pudlák
0

Karya teoritis tentang rsync in-place dijelaskan dalam makalah ini .

Referensi kertas: D. Rasch dan R. Burns. In-Place Rsync: Sinkronisasi File untuk Perangkat Seluler dan Nirkabel. Konferensi Teknis Tahunan USENIX, jalur FREENIX, 91-100, USENIX, 2003.

Dari tautan:

... Kami memodifikasi implementasi rsync yang ada untuk mendukung rekonstruksi di tempat.

Abstrak: [...] Kami telah memodifikasi rsync sehingga beroperasi pada perangkat terbatas ruang. File pada host target diperbarui dalam penyimpanan yang sama dengan versi file saat ini. Perangkat terbatas ruang tidak dapat menggunakan rsync tradisional karena memerlukan memori atau penyimpanan untuk versi file lama dan baru. Contohnya termasuk menyinkronkan file pada ponsel dan PC genggam, yang memiliki memori kecil. Algoritma rsync in-place mengkodekan representasi terkompresi dari suatu file dalam grafik, yang kemudian diurutkan secara topologi untuk mencapai properti in-place. [...]

Jadi ini tampaknya merupakan rincian teknis tentang apa yang dilakukan rsync --inplace. Menurut awal makalah:

Kami telah memodifikasi rsync sehingga melakukan tugas sinkronisasi file dengan rekonstruksi di tempat. [...] Alih-alih menggunakan ruang sementara, perubahan pada file target dilakukan di ruang yang sudah ditempati oleh versi saat ini. Alat ini dapat digunakan untuk menyinkronkan perangkat di mana ruang terbatas.

Sebagaimana menjadi jelas dari jawaban @ dataless , ini menyiratkan bahwa --inplacemenggunakan ruang penyimpanan yang sama, tetapi masih dapat menyalin seluruh file ke ruang itu. Khususnya, ketika salinan dibuat dari / ke sistem file lokal, rsync mengasumsikan --whole-fileopsi. Tetapi ketika itu melintasi sistem jaringan di sisi lain, itu mengasumsikan --no-whole-filepilihan.

pengguna92979
sumber
1
Um, jadi apa jawabannya?
Xen2050
Permintaan maaf saya. Saya tidak memberi perhatian yang cukup. Dengan jawaban @ dataless, ini akan menjelaskan semuanya.
Diagon