Назад | Перейти на главную страницу

Синхронизировать снимки LVM с сервером резервного копирования

У меня есть несколько виртуальных машин Xen, работающих на нескольких серверах Linux. Эти виртуальные машины хранят свои образы дисков в томах LVM Linux с именами устройств в строках / dev / xenVG / SERVER001OS и т. Д. Я хотел бы регулярно делать резервные копии этих образов дисков, чтобы в случае необходимости можно было восстановить виртуальные машины (устройства LVM уже зеркалированы с помощью DRBD между двумя физическими машинами каждое, я здесь просто параноик).

Как мне это сделать? Очевидно, что первым шагом является создание моментального снимка устройства LVM, но как мне затем передать данные на сервер резервного копирования наиболее эффективным способом? Я мог бы просто скопировать все устройство, что-то вроде:

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

... но для этого потребуется много трафика. Есть ли инструмент, похожий на rsync, для синхронизации содержимого целых блоков диска между удаленными серверами? Что-то вроде:

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

Если я правильно понимаю справочную страницу rsync, приведенная выше команда на самом деле не будет работать (не так ли?), Но она показывает, к чему я стремлюсь. Я понимаю, что параметр --devices rsync предназначен для копирования самих устройств, а не содержимого этих устройств. Создание локальной копии образа виртуальной машины перед его синхронизацией с удаленным сервером невозможно из-за отсутствия места на диске.

Есть ли удобная утилита, которая может синхронизировать блочные устройства с файлом резервной копии на удаленном сервере? Я могу написать его, если потребуется, но существующее решение было бы лучше. Я пропустил параметр rsync, который делает это за меня?

Хотя для RSync существуют патчи «записывающее устройство» и «копирующее устройство», они хорошо работают только с небольшими изображениями (1-2 ГБ). RSync потратит много времени на поиск совпадающих блоков на больших изображениях, и он почти бесполезен для устройств / файлов размером 40 ГБ или больше.

Мы используем следующее, чтобы выполнить сравнение контрольной суммы на 1 МБ, а затем просто скопировать контент, если он не совпадает. Мы используем это для резервного копирования серверов на виртуальном хосте в США в систему резервного копирования в Великобритании через общедоступный Интернет. Очень низкая активность процессора и снижение производительности моментальных снимков наблюдается только в нерабочее время:

Создать снимок:

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

Первоначальный посев:

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

Инкрементное ночное резервное копирование (отправляет только измененные блоки):

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"

Удалить снимок:

lvremove -f company-exchange-snap1

В стандартном rsync эта функция отсутствует, но для нее есть патч в архиве rsync-patches (copy-devices.diff), который можно загрузить с http://rsync.samba.org/ftp/rsync/ После установки и перекомпиляции вы можете использовать rsync-устройства с параметром --copy-devices.

Людям, которым интересно делать это с помощью снимков LVM, может понравиться мой lvmsync инструмент, который читает список измененных блоков в снимке и отправляет только эти изменения.

Взгляни на Проект Zumastor Linux Storage он реализует резервное копирование «моментальных снимков» с использованием двоичного файла «rsync» через ddsnap инструмент.

На странице руководства:

ddsnap обеспечивает репликацию блочного устройства с помощью средства создания снимков на уровне блоков, способного эффективно хранить несколько одновременных снимков. ddsnap может сгенерировать список фрагментов снимков, которые различаются между двумя снимками, а затем отправить это различие по сети. На нисходящем сервере запишите обновленные данные на блочное устройство с моментальным снимком.

Есть скрипт на Python под названием blockync Это простой способ синхронизировать два блочных устройства по сети через ssh, передавая только изменения.

  • Скопируйте blockync.py в домашний каталог на удаленном хосте
  • Убедитесь, что ваш удаленный пользователь может либо sudo, либо сам root
  • Убедитесь, что ваш локальный пользователь (root?) Может читать исходное устройство и ssh удаленному хосту
  • Вызов: python blocksync.py /dev/source user@remotehost /dev/dest

Я недавно взломал его, чтобы очистить его и изменить, чтобы использовать тот же алгоритм быстрой контрольной суммы, что и rsync (Адлер-32).

Если вы пытаетесь минимизировать количество пустого пространства, которое вы отправляете через провод с помощью простого dd, не могли бы вы просто передать его в gzip перед тем, как передать его в ssh?

например dd if = / dev / xenVG / SERVER001OS | gzip | ssh administrator @ backupserver "dd of = / mnt / largeDisk / SERVER001OS.img.gz"

Просто помните, что производительность системы, в которой есть моментальные снимки LVM, пропорциональна их количеству.

Например Производительность MySQL со снимками lvm

В дополнении к Ответ Дэвида Херсельмана - следующий скрипт синхронизируется с локальным устройством:

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

Насколько мне известно, оба сценария впервые были размещены на lists.samba.org.

Это старый вопрос, но никто не упомянул два очень полезных инструмента для эффективной синхронизации двух блочных устройств:

Я настоятельно рекомендую поиграть с обе инструменты и выбрать тот, который лучше подходит для вашего предполагаемого использования.

После нескольких лет поисков я недавно создал инструмент для синхронизация снимков LVM между серверами. Он разработан для использования минимального ввода-вывода и позволяет системам работать во время синхронизации.

Он похож на отправку / получение ZFS в том, что синхронизирует различия между моментальными снимками LVM и использует тонкую подготовку, так что влияние на производительность минимально.

Я хотел бы получить обратную связь, поэтому, пожалуйста, посмотрите.

В этот сценарий нужно было внести несколько улучшений:

  1. По крайней мере, в моей системе чтение буфера perl составляет 8 КБ, поэтому используйте размер блока 8192.
  2. autoflush, чтобы локальный конец не блокировался, пока удаленный выходной буфер не будет «заполнен», поскольку мы загружаем lzop, буферизация кажется бессмысленной.

ssh -i /root/.ssh/rsync_rsa $ remote "perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; \ $ / = \ 892}; напечатать md5 (\ $) '$ dev2 | lzop -c "| lzop -dc | perl -'MDigest :: MD5 md5 '-ne' BEGIN {$ | = 1; $ / = \ 8192}; $ b = md5 ($); прочитать STDIN, $ a, 16; if ($ a eq $ b) {напечатать "s"} else {напечатать "c". $ _} '$ dev1 | lzop -c | ssh -i /root/.ssh/rsync_rsa $ remote "lzop -dc |
perl -ne 'BEGIN {\ $ / = \ 1} if (\ $ _ eq \ "s \") {\ $ s ++} else {if (\ $ s) {искать STDOUT, \ $ s * 8192,1; \ $ s = 0}; читать ARGV, \ $ buf, 8192; print \ $ buf} '1 <> $ dev2 "