Bagaimana Anda menyinkronkan file jarang besar (gambar disk VM) antara mesin?

22

Apakah ada perintah, seperti rsync, yang dapat menyinkronkan file besar, jarang, dari satu server linux ke yang lain?

Sangat penting bahwa file tujuan tetap jarang. Mungkin lebih panjang (tetapi tidak lebih besar) dari drive yang berisi itu. Hanya blok yang diubah harus dikirim melintasi kawat.

Saya sudah mencoba rsync, tetapi tidak mendapat sukacita. https://groups.google.com/forum/#!topic/mailing.unix.rsync/lPOScZgFE9M

Jika saya menulis sebuah program untuk melakukan ini, apakah saya hanya menciptakan kembali kemudi? http://www.finalcog.com/synchronise-block-devices

Terima kasih,

Chris

fadedbee
sumber
rsync sangat tidak efisien dengan file besar. Bahkan dengan --inplace, ia pertama-tama akan membaca seluruh file pada host target dan MAKA mulai membaca file pada host lokal dan mentransfer perbedaan (jalankan saja dstat atau serupa saat menjalankan rsync dan amati)
ndemou

Jawaban:

21
rsync --ignore-existing --sparse ...

Untuk membuat file baru dalam mode jarang

Diikuti oleh

rsync --inplace ...

Untuk memperbarui semua file yang ada (termasuk yang sudah dibuat sebelumnya) di tempat.

Steve P
sumber
3
Membalikkan untuk memiliki rsync --existing --inplacedan kemudian rsync --ignore-existing --sparsememiliki speedup sinkronisasi
Mike
2
Adakah yang bisa menjelaskan komentar Mikes dan bagaimana ini harus mempercepat sinkronisasi?
Preexo
Saya pikir Mike berarti perubahan inplace pertama dan kemudian tambahkan baru, sehingga yang baru tidak perlu menjadi --di tempat lagi karena perbedaan waktu antara panggilan pertama dan kedua. Itu hanya benar jika Anda rsync langsung dari datastore dan VMs sedang berjalan. Kecuali dia berarti sesuatu yang lain?
Yuan
Saya setuju dengan Yuan. Perintah Steves kedua akan rsync file baru lagi, Anda bisa mengamankannya dengan menggunakan urutan perintah Mikes.
Falstaff
rsync sangat tidak efisien dengan file besar. Lihat komentar saya pada pertanyaan.
ndemou
5

Rsync hanya mentransfer perubahan ke setiap file dan dengan --inplace seharusnya hanya menulis ulang blok yang diubah tanpa membuat ulang file. Dari halaman fitur mereka .

rsync adalah program transfer file untuk sistem Unix. rsync menggunakan "algoritma rsync" yang menyediakan metode yang sangat cepat untuk membawa file jarak jauh ke sinkronisasi. Ini dilakukan dengan mengirimkan hanya perbedaan dalam file di seluruh tautan, tanpa mengharuskan kedua set file hadir di salah satu ujung tautan sebelumnya.

Menggunakan --inplace seharusnya bekerja untuk Anda. Ini akan menunjukkan kepada Anda kemajuan, kompres transfer (pada tingkat kompresi default), transfer konten direktori penyimpanan lokal secara rekursif (yang pertama kali mengekor masalah slash), buat perubahan pada file yang ada dan gunakan ssh untuk transportasi.

rsync -v -z -r --inplace --progress -e ssh /path/to/local/storage/ \
[email protected]:/path/to/remote/storage/ 

Saya sering menggunakan flag-a juga yang melakukan beberapa hal lagi. Itu sama dengan -rlptgoD. Saya akan meninggalkan perilaku yang tepat bagi Anda untuk mencari di halaman manual.

pengintaian
sumber
1
'-S' adalah untuk file yang jarang, bukan 'chops long lines'. Dari halaman manual: -S, --sparse menangani file jarang secara efisien. Saya akan mencoba ini, terima kasih.
fadedbee
Terima kasih saya memperbaikinya - Saya keluar dari sesuatu yang dikatakan di tautan yang Anda berikan.
recbot
Tidak, sayangnya ini tidak menyelesaikan masalah. Itu memang menyinkronkan file, tetapi mengubah file jarang di ujung menjadi file non-jarang. Saya menggunakan ssh / rsync yang datang dengan Ubuntu 9.04.
fadedbee
Komentar saya di atas salah. Masalahnya adalah rsync membuat file non-sparse pada salinan pertama. --Inplace rsync tidak bekerja dengan benar, asalkan file tujuan sudah ada dan sepanjang (tidak besar) sebagai file asal. Saya sekarang memiliki solusi, tetapi mengharuskan saya untuk memeriksa apakah setiap file sudah ada di server target. Jika ya, saya melakukan --di tempat, jika tidak, saya menggunakan --sparse. Ini tidak ideal, tetapi berhasil.
fadedbee
rsync sangat tidak efisien dengan file besar. Lihat komentar saya pada pertanyaan
ndemou
4

Saya akhirnya menulis perangkat lunak untuk melakukan ini:

http://www.virtsync.com

Ini adalah perangkat lunak komersial dengan biaya $ 49 per server fisik.

Saya sekarang dapat mereplikasi file jarang 50GB (yang memiliki konten 3GB) dalam waktu kurang dari 3 menit di seluruh broadband perumahan.

chris@server:~$ time virtsync -v /var/lib/libvirt/images/vsws.img backup.barricane.com:/home/chris/
syncing /var/lib/libvirt/images/vsws.img to backup.barricane.com:/home/chris/vsws.img (dot = 1 GiB)
[........>.........................................]
done - 53687091200 bytes compared, 4096 bytes transferred.

real    2m47.201s
user    0m48.821s
sys     0m43.915s 
fadedbee
sumber
4
TBH, waktu yang menyatakan di mana Anda dapat menyinkronkan cukup tidak berarti karena jelas tergantung pada jumlah data yang diubah. Apa yang akan lebih akurat untuk dikatakan adalah bahwa dibutuhkan perangkat lunak Anda 3 menit untuk mengetahui blok mana yang telah berubah, dan bahkan kecepatan itu mungkin tergantung pada disk i / o Anda dan mungkin siklus CPU tersedia.
Reality Extractor
6
Anda harus mengungkapkan bahwa ini adalah perangkat lunak komersial dengan biaya $ 98 atau lebih untuk fungsionalitas jaringan.
Reid
Terima kasih telah menunjukkan kami pada perangkat lunak yang bekerja dengan baik untuk Anda, yang sekarang dapat dipertimbangkan dan digunakan orang, atau tidak digunakan sesuai kebutuhan. Tidak terima kasih untuk dua orang lainnya atas kontribusi yang tidak baru.
Florian Heigl
3

Lihatlah Zumastor Linux Storage Project yang mengimplementasikan cadangan "snapshot" menggunakan biner "rsync" melalui ddsnapalat ini.

Dari halaman manual:

ddsnap menyediakan replikasi perangkat blok yang diberikan fasilitas snapshot level blok yang mampu menahan beberapa snapshot simultan secara efisien. ddsnap dapat menghasilkan daftar bidikan snapshot yang berbeda antara dua snapshot, lalu kirim perbedaan itu melalui kabel. Pada server hilir, tulis data yang diperbarui ke perangkat blok snapshotted.

rkthkr
sumber
2

lvmsync melakukan ini.

Berikut transkrip penggunaan . Ini menciptakan snapshot LVM pada sumber, mentransfer partisi logis. Anda dapat mentransfer pembaruan perubahan tambahan sejak pembuatan snapshot sesering mungkin.

Tobu
sumber
Saya sudah mencobanya, tetapi tidak berhasil, dan penulis tidak mau mendukung
user1007727
1
@ user1007727 tidak mau mendukung, atau tidak mau mendukung secara gratis?
fadedbee
Saya menggunakan lvmsync di masa lalu, itu bekerja tetapi itu bukan imo "prod grade" perangkat lunak. :-)
Florian Heigl
1

Bisakah mereplikasi seluruh sistem file menjadi solusi? DRBD? http://www.drbd.org/

James C
sumber
Saya tidak berpikir drbd adalah solusi yang baik di sini, tetapi ide rsyncing --di tempat seluruh fs, daripada disk-image-file, menarik. Saya tidak yakin apakah rsync memungkinkan ini - saya akan mencobanya dan melaporkan kembali ...
fadedbee
1

Mungkin agak aneh di sini, tapi saya baru-baru ini tahu bahwa NFS menangani ini dengan baik.

Jadi Anda mengekspor direktori pada satu mesin kemudian me-mount-nya di mesin yang lain dan Anda cukup menyalin file-file tersebut dengan utilitas dasar seperti cp. (Beberapa utilitas lama / kuno dapat mengalami masalah dengan file yang jarang.)

Saya menemukan rsyncsangat tidak efisien dalam mentransfer file jarang.

cstamas
sumber
1

Untuk menyinkronkan file besar atau memblokir perangkat dengan perbedaan rendah hingga sedang, Anda dapat melakukan penyalinan biasa atau menggunakan bdsync , rsync sama sekali tidak cocok untuk kasus khusus ini *.

bdsyncbekerja untuk saya, tampaknya cukup dewasa, itu sejarah bug yang menggembirakan (masalah kecil, resolusi cepat). Dalam pengujian saya, kecepatannya mendekati maksimum teoretis yang bisa Anda peroleh ** (artinya Anda dapat menyinkronkan waktu yang Anda perlukan untuk membaca file). Akhirnya open source dan tidak ada biaya.

bdsyncmembaca file dari kedua host dan bertukar cek-jumlah untuk membandingkannya dan mendeteksi perbedaan. Semua ini pada saat bersamaan . Akhirnya membuat file tambalan terkompresi pada host sumber. Kemudian Anda memindahkan file itu ke host tujuan dan menjalankan bdsync untuk kedua kalinya untuk menambal file tujuan.

Saat menggunakannya melalui tautan yang agak cepat (misalnya ethernet 100Mbit) dan untuk file dengan perbedaan kecil (seperti yang sering terjadi pada disk VM) itu mengurangi waktu untuk menyinkronkan ke waktu Anda perlu membaca file. Melalui tautan lambat, Anda perlu sedikit lebih banyak waktu karena Anda harus menyalin perubahan yang dikompresi dari satu host ke host lain (sepertinya Anda dapat menghemat waktu menggunakan trik yang bagus tetapi belum diuji).


*: rsync sangat tidak efisien dengan file besar. Bahkan dengan --inplace pertama kali akan membaca seluruh file pada host tujuan, SETELAH mulai membaca file pada host sumber dan akhirnya mentransfer perbedaan (jalankan saja dstat atau serupa saat menjalankan rsync dan amati). Hasilnya adalah bahwa bahkan untuk file dengan perbedaan kecil dibutuhkan sekitar dua kali lipat waktu Anda perlu membaca file untuk menyinkronkannya.

**: Dengan asumsi bahwa Anda tidak memiliki cara lain untuk mengetahui bagian file apa yang telah berubah. Snapshots LVM menggunakan bitmap untuk merekam blok yang diubah sehingga mereka bisa menjadi sangat cepat (readme lvmsync memiliki lebih banyak info).

ndemou
sumber
0

Saya tidak mengetahui utilitas semacam itu, hanya panggilan sistem yang dapat menanganinya, jadi jika Anda menulis utilitas seperti itu, mungkin akan lebih membantu.

apa yang sebenarnya dapat Anda lakukan adalah menggunakan konversi qemu-img untuk menyalin file, tetapi itu hanya akan berfungsi jika FS tujuan mendukung file jarang

dyasny
sumber