LVM anlık görüntülerini yedekleme sunucusuna senkronize et


22

Çok sayıda Linux sunucusunda çalışan bir dizi Xen sanal makinem var. Bu VM'ler, disk görüntülerini / dev / xenVG / SERVER001OS vb. Satırları boyunca aygıt adlarıyla Linux LVM birimlerinde depolar. Düzenli olarak bu disk görüntülerini almak istiyorum, böylece gerektiğinde VM'leri geri yükleyebiliyorum (LVM cihazları zaten her biri iki fiziksel makine arasında DRBD ile yansıtılıyor, burada fazladan paranoyak oluyorum).

Bu konuda nasıl giderim? Birincisi, LVM cihazının görüntüsünü çekmek ilk adım, ancak daha sonra mümkün olan en verimli şekilde verileri bir yedekleme sunucusuna nasıl aktarabilirim? Cihazın tamamını kopyalayabilirim, satırları boyunca:

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

... ama bu çok fazla bant genişliği gerektirecekti. Tüm disk bloklarının içeriğini uzak sunucular arasında senkronize etmek için rsync benzeri bir araç var mı? Gibi bir şey:

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

Rsync'in man sayfasını doğru anlarsam, yukarıdaki komut aslında işe yaramayacak (değil mi?), Ama neyi hedeflediğimi gösteriyor. --Devices rsync seçeneğinin, bu cihazların içeriğini değil, cihazların kendilerini kopyalamak olduğunu anlıyorum. VM görüntüsünün uzak sunucu ile senkronize edilmeden önce yerel bir kopyasını çıkarmak, disk alanı olmadığı için bir seçenek değildir.

Uzak bir sunucudaki blok aygıtları ve bir yedekleme dosyası arasında senkronize edebilecek kullanışlı bir yardımcı program var mı? Gerekirse bir tane yazabilirim, ancak mevcut bir çözüm daha iyi olurdu. Bunu benim için yapan bir rsync opsiyonunu kaçırdım mı?

Yanıtlar:



16

RSync için 'yazma aygıtı' ve 'kopya aygıtı' yamaları olmasına rağmen, yalnızca küçük resimlerde (1-2 GB) iyi çalışırlar. RSync yaşları büyük görüntülerde eşleşen blokları arayarak geçirecek ve neredeyse 40GB veya daha büyük aygıtlar / dosyalar kullanılamaz.

Aşağıdakileri 1 MB başına bir sağlama toplamı karşılaştırması yapmak için kullanırız ve ardından içeriği eşleşmiyorsa kopyalamanız yeterlidir. Bunu, ABD’deki sanal bir ana bilgisayardaki sunucuları, genel internet üzerinden İngiltere’deki bir yedekleme sistemine yedeklemek için kullanıyoruz. Çok az CPU etkinliği ve anlık görüntü performansı yalnızca saat sonra:

Anlık görüntü oluştur:

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';

İlk tohumlama:

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

Artımlı gecelik yedekleme (yalnızca değişen blokları gönderir):

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"

Anlık görüntüyü kaldır:

lvremove -f company-exchange-snap1

İlk başta korktum ama sonra denedim ve gerçekten işe yarıyor.
Martin,

Neden read ARGV,$buf,1024yerine read STDIN,$buf,1024, @ sysadmin1138? (Ben cevap çalışıyorum stackoverflow.com/q/22693823/2987828 ve hiçbir buradan argv anlıyoruz). Stackoverflow.com/q/22693823/2987828 sorusundaki varyantı her gün kullanıyorum ve iyi çalışıyor.
user2987828

1
bkz perlmonks.org/bare/?node_id=492858 bir dosya adı argüman olarak verilmediği takdirde ARGV ve STDIN benzer olduğunu söylüyor.
user2987828

9

Bunu özellikle LVM anlık görüntüleriyle yapmak isteyen kişiler , değiştirilen blokların listesini anlık görüntüde okuyan ve bu değişiklikleri gönderen lvmsync aracım gibi olabilir .


6

Zumastor Linux Storage Project'e bir göz atın , ddsnap aracıyla ikili "rsync" kullanarak "anlık görüntü" yedeğini uygular .

Man sayfasından:

ddsnap, aynı anda birden fazla anlık görüntüyü verimli bir şekilde tutabilen blok düzeyinde anlık görüntü özelliği verilen blok aygıtı çoğaltmasını sağlar. ddsnap, iki anlık görüntü arasında farklılık gösteren anlık görüntü parçalarının bir listesini oluşturabilir ve ardından bu farkı kablo üzerinden gönderebilir. Akış aşağı sunucuda, güncellenmiş verileri anlık görüntülü bir blok aygıta yazın.


Ah, bu tam da aradığım bir şeye benziyor, teşekkürler.
David Hicks

Zumastor projesine bağlantı modası geçmiş, sanırım bu doğru olanı: shapor.com/zumastor.org
Martin

2

İki blok aygıtını bir ağ üzerinden ssh üzerinden senkronize etmenin ve sadece değişiklikleri aktarmanın basit bir yolu olan blocksync adlı bir python betiği var .

  • Blocksync.py dosyasını uzaktaki ana bilgisayardaki ana dizine kopyalayın
  • Uzaktaki kullanıcının sudo olabileceğinden veya kendi kendine kök olduğundan emin olun
  • Yerel kullanıcının (root?) Kaynak cihazı & ssh'ı uzak ana bilgisayara okuyabildiğinden emin olun
  • Çağırmak: python blocksync.py /dev/source user@remotehost /dev/dest

Son zamanlarda onu temizlemek ve rsync ( Adler-32 ) ile aynı hızlı sağlama toplamı algoritmasını kullanmak için değiştirmek için hackledim .


1
Kullanıyorum, iyi çalışıyor. Not Bir var modifiye versiyonu olduğu yolsuzluk ve kullanımları daha güvenilir bir karma ait düzeltmeleri olası bir kaynak.
cmc

1

Kablo boyunca bir düz ile birlikte göndereceğiniz boş alanı en aza indirmeye çalışıyorsanız, ddssh'ye yöneltmeden önce sadece gzip borusuna sokmaz mısınız?

örneğin, eğer dd = / dev / xenVG / SERVER001OS | gzip | ssh admin @ backupserver "= = / mnt / largeDisk / SERVER001OS.img.gz 'nin dd'si"


Biraz gerekli bant genişliğini azaltacaktı, ancak 60 ve 100 GB'lık bir disk imajımız var ve gzip ile bile çok uzun sürüyordu.
David Hicks

@Ophidian, SSH'nin dahili olarak sıkıştırma işlemesi yaptığını bilmelisiniz, bir seçenek var.
poige

1

LVM anlık görüntülerine sahip bir sistemin performansının anlık görüntü sayısıyla orantılı olduğunu unutmayın.

Örneğin , lvm anlık görüntüleriyle Mysql performansı


Nitekim - ilk çözümüm, sadece günlük bir enstantane kurmayı ve önceki günün enstantanesiyle bir fark yaratmayı ve yedekleme sunucusuna yerleştirmeyi içermişti. Bu kadar basit olmayacağını bulmak için çok hastaydım.
David Hicks

Bu, çok farklı şekilde uygulanan LVM ince görüntüleriyle doğru olmayabilir
Alex F

0

David Herselman'ın cevabına ek olarak , aşağıdaki komut yerel bir cihaza senkronize edilecektir:

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

Bildiğim kadarıyla her iki senaryo da ilk olarak lists.samba.org adresinde yayınlandı .


0

Bu eski bir soru, ancak hiç kimse iki blok cihazını verimli bir şekilde senkronize etmek için iki çok kullanışlı araçtan bahsetmedi:

Her iki araçla oynamayı ve kullanım amacınıza en uygun olanı seçmenizi şiddetle tavsiye ederim .


0

Birkaç yıl aradıktan sonra, LVM anlık görüntülerini sunucular arasında senkronize etmek için bir araç geliştirdim . Minimal IO kullanmak ve senkronizasyon gerçekleşirken sistemlerin çalışmasına izin vermek için tasarlanmıştır.

ZFS gönderme / alma ile benzer şekilde LVM anlık görüntüleri arasındaki farkları senkronize eder ve performans sağlama etkisinin minimum düzeyde olması için ince provizyon kullanır.

Geri bildirim almak istiyorum, lütfen bir göz atın.


-1

Bu senaryoda yapılması gereken birkaç etkinlik vardı:

  1. En azından benim sistemimde perl tamponu 8k okuyor, 8192 blok büyüklüğü kullan.
  2. autoflush böylece yerel uç uzak çıkış tamponu 'dolu' olana kadar bloke etmez, çünkü biz besleme beslerken tamponlama anlamsız görünür.

ssh -i /root/.ssh/rsync_rsa $ uzak "perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; \ $ / = \ 892}; baskı md5 (\ $ ) '$ dev2 | lzop -c "| lzop -dc | perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; $ / = \ 8192); $ b = md5 ($ ); STDIN, $ a, 16; eğer ($ a eq $ b) {bas "s"} başkası {bas "c" yaz. $ _} '$ dev1 | lzop -c | ssh -i /root/.ssh/rsync_rsa $ uzak "lzop -dc |
perl -ne 'BEGIN {\ $ / = \ 1} if (\ $ _ eq \" s \ ") {\ $ s ++} else {if (\ $ s) {seek STDOUT, \ $ s * 8192,1; \ $ s = 0}; ARGV, \ $ buf, 8192; \ \ buf} '1 <> $ dev2 "yazısını oku

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.