Sinkronkan foto LVM ke server cadangan


22

Saya memiliki sejumlah mesin virtual Xen yang berjalan di sejumlah server Linux. VM ini menyimpan gambar disk mereka dalam volume LVM Linux dengan nama perangkat di sepanjang baris / dev / xenVG / SERVER001OS dan seterusnya. Saya ingin mengambil cadangan secara teratur dari gambar-gambar disk sehingga saya dapat mengembalikan VM jika kita perlu (perangkat LVM sudah dicerminkan dengan DRBD antara dua mesin fisik masing-masing, saya hanya menjadi paranoid ekstra di sini).

Bagaimana saya melakukannya? Jelas langkah pertama adalah mengambil snapshot perangkat LVM, tetapi bagaimana cara mentransfer data ke server cadangan dengan cara yang seefisien mungkin? Saya cukup menyalin seluruh perangkat, sesuatu seperti:

dd if=/dev/xenVG/SERVER001OS | ssh administrator@backupserver "dd of=/mnt/largeDisk/SERVER001OS.img"

... tapi itu akan memakan banyak bandwidth. Apakah ada alat seperti rsync untuk menyinkronkan konten seluruh blok disk antara server jauh? Sesuatu seperti:

rsync /dev/xenVG/SERVER001OS backupServer:/mnt/largeDisk/SERVER001OS.img

Jika saya memahami halaman manual rsync dengan benar, perintah di atas tidak akan berfungsi (kan?), Tetapi ini menunjukkan apa yang saya tuju. Saya mengerti opsi --device rsync adalah menyalin perangkat itu sendiri, bukan isi dari perangkat itu. Membuat salinan lokal dari gambar VM sebelum menyinkronkannya dengan server jarak jauh bukanlah suatu pilihan karena tidak ada ruang disk.

Apakah ada utilitas praktis yang dapat disinkronkan antara perangkat blok dan file cadangan di server jarak jauh? Saya bisa menulis satu jika saya harus, tetapi solusi yang ada akan lebih baik. Apakah saya melewatkan opsi rsync yang melakukan ini untuk saya?

Jawaban:



16

Meskipun ada tambalan 'perangkat-tulis' dan 'perangkat-salin' untuk RSync, mereka hanya bekerja dengan baik pada gambar kecil (1-2GB). RSync akan menghabiskan waktu lama mencari-cari blok yang cocok pada gambar yang lebih besar dan hampir tidak berguna untuk 40GB atau perangkat / file yang lebih besar.

Kami menggunakan yang berikut ini untuk melakukan perbandingan checksum per 1MB dan kemudian cukup menyalin konten jika tidak cocok. Kami menggunakan ini untuk membuat cadangan server di host virtual di AS ke sistem cadangan di Inggris, melalui internet publik. Aktivitas CPU dan hit snapshot sangat singkat hanya setelah jam kerja:

Buat snapshot:

lvcreate -i 2 -L 25G /dev/vg_kvm/company-exchange -n company-exchange-snap1

export dev1='/dev/mapper/vg_kvm-company--exchange--snap1';
export dev2='/dev/mapper/vg_kvm-company--exchange';
export remote='root@backup.company.co.za';

Penyemaian awal:

dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"

Pencadangan malam hari tambahan (hanya mengirim blok yang diubah):

ssh -i /root/.ssh/rsync_rsa $remote "
  perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=\1024};print md5(\$_)' $dev2 | lzop -c" |
  lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
    read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | lzop -c |
ssh -i /root/.ssh/rsync_rsa $remote "lzop -dc |
  perl -ne 'BEGIN{\$/=\1} if (\$_ eq\"s\") {\$s++} else {if (\$s) {
    seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"

Hapus foto:

lvremove -f company-exchange-snap1

Awalnya saya takut tetapi kemudian mencobanya dan itu benar-benar berhasil.
Martin

Kenapa read ARGV,$buf,1024alih-alih read STDIN,$buf,1024, @ sysadmin1138? (Saya mencoba menjawab stackoverflow.com/q/22693823/2987828 dan tidak mengerti ARGV di sini). Saya menggunakan varian setiap hari dalam pertanyaan stackoverflow.com/q/22693823/2987828 dan berfungsi dengan baik.
user2987828

1
lihat perlmonks.org/bare/?node_id=492858 yang mengatakan bahwa ARGV dan STDIN serupa kecuali jika nama file diberikan sebagai argumen.
user2987828

9

Orang-orang yang tertarik melakukan ini secara khusus dengan snapshot LVM mungkin menyukai alat lvmsync saya , yang membaca daftar blok yang diubah dalam sebuah snapshot dan hanya mengirimkan perubahan itu.


6

Lihatlah Zumastor Linux Storage Project yang mengimplementasikan cadangan "snapshot" menggunakan biner "rsync" melalui alat ddsnap .

Dari halaman manual:

ddsnap menyediakan replikasi perangkat blok mengingat 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. Di server hilir, tulis data yang diperbarui ke perangkat blok yang dibidik.


Ah, sepertinya itu yang saya cari, terima kasih.
David Hicks

Tautan ke proyek Zumastor sudah usang, saya kira ini yang benar: shapor.com/zumastor.org
Martin

2

Ada skrip python yang disebut blocksync yang merupakan cara sederhana untuk menyinkronkan dua perangkat blok melalui jaringan melalui ssh, hanya mentransfer perubahan.

  • Salin blocksync.py ke direktori home di host jarak jauh
  • Pastikan pengguna jarak jauh Anda bisa menggunakan sudo atau root sendiri
  • Pastikan pengguna lokal Anda (root?) Dapat membaca perangkat sumber & ssh ke host jarak jauh
  • Memohon: python blocksync.py /dev/source user@remotehost /dev/dest

Saya baru-baru ini meretasnya untuk membersihkannya dan mengubahnya untuk menggunakan algoritma fast-checksum yang sama dengan rsync ( Adler-32 ).


1
Saya menggunakannya, berfungsi dengan baik. Perhatikan ada versi yang dimodifikasi yang memperbaiki kemungkinan sumber korupsi dan menggunakan hash yang lebih andal.
cmc

1

Jika Anda mencoba untuk meminimalkan jumlah ruang kosong yang Anda kirim melintasi kawat dengan sebuah dataran dd, tidak bisakah Anda hanya pipa ke gzip sebelum pipa itu ke ssh?

mis. dd if = / dev / xenVG / SERVER001OS | gzip | ssh administrator @ backupserver "dd of = / mnt / largeDisk / SERVER001OS.img.gz"


Itu akan mengurangi bandwidth yang dibutuhkan sedikit, tetapi kami memiliki beberapa gambar disk 60 dan 100 GB dan bahkan dengan gzip itu akan memakan waktu terlalu lama.
David Hicks

@ Ophidian, Anda harus tahu bahwa SSH menangani kompresi secara internal, ada opsi.
poige

1

Berhati-hatilah bahwa kinerja sistem yang memiliki snapshot LVM sebanding dengan jumlah snapshot.

Misalnya kinerja Mysql dengan snapshot lvm


Memang - solusi awal saya hanya melibatkan pengaturan snapshot harian kemudian melakukan diff dengan snapshot hari sebelumnya dan memasukkannya ke server cadangan. Saya paling kesal mengetahui hal itu tidak sesederhana itu.
David Hicks

Itu mungkin tidak benar dengan snapshot tipis LVM yang diimplementasikan jauh berbeda
Alex F

0

Selain jawaban David Herselman - skrip berikut akan disinkronkan ke perangkat lokal:

perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};print md5($_)' $dev2 |
  perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
    read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 |
   perl -ne 'BEGIN{$/=\1} if ($_ eq"s") {$s++} else {if ($s) {
    seek STDOUT,$s*1024,1; $s=0}; read ARGV,$buf,1024; print $buf}' 1<> $dev2

Sejauh yang saya tahu kedua skrip pertama kali diposting di lists.samba.org .


0

Ini adalah pertanyaan lama, tetapi tidak ada yang menyebutkan dua alat yang sangat berguna untuk menyinkronkan dua perangkat blok secara efisien:

Saya sangat menyarankan untuk bermain dengan kedua alat dan untuk memilih mana yang lebih baik beradaptasi dengan penggunaan yang Anda inginkan.


0

Setelah mencari selama beberapa tahun, saya baru-baru ini membuat alat untuk menyinkronkan foto - foto LVM antara server. Itu dirancang untuk menggunakan IO minimal dan memungkinkan sistem untuk menjalankan sementara sinkronisasi terjadi.

Ini mirip dengan ZFS kirim / terima di yang menyinkronkan perbedaan antara snapshot LVM, dan menggunakan provisi tipis sehingga dampak kinerja minimal.

Saya ingin umpan balik, jadi silakan lihat.


-1

Ada beberapa efisiensi yang dibuat untuk skrip ini:

  1. Pada sistem saya setidaknya, pembacaan perl dibaca 8k, jadi gunakan ukuran blok 8192.
  2. autoflush sehingga ujung lokal tidak memblokir sampai buffer output jarak jauh 'penuh', karena kita memberi makan lzop buffering tampaknya tidak ada gunanya.

ssh -i /root/.ssh/rsync_rsa $ remote "perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; \ $ / = \ 892}; cetak md5 (\ $ ) '$ dev2 | lzop -c "| lzop -dc | perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; $ / = \ 8192}; $ b = md5 ($ ); baca STDIN, $ a, 16; if ($ a eq $ b) {print "s"} else {print "c". $ _} '$ dev1 | lzop -c | ssh -i /root/.ssh/rsync_rsa $ remote "lzop -dc |
perl -ne 'BEGIN {\ $ / = \ 1} if (\ $ _ eq \" s \ ") {\ $ s ++} lain {jika (\ $ s) {seek STDOUT, \ $ s * 8192,1; \ $ s = 0}; baca ARGV, \ $ buf, 8192; cetak \ $ buf} '1 <> $ dev2 "

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.