Синхронизируйте снимки LVM с резервным сервером

22

У меня есть несколько виртуальных машин Xen, работающих на нескольких серверах Linux. Эти виртуальные машины хранят свои образы дисков в томах Linux LVM с именами устройств в соответствии с / 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, которая делает это для меня?

Дэвид Хикс
источник

Ответы:

12

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

Balázs Pozsár
источник
если вашей целью является устройство, патч находится здесь: bugzilla.redhat.com/show_bug.cgi?id=1193654
Джейсон Пиерон
16

Хотя для 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
sysadmin1138
источник
Сначала я испугался, но потом попробовал, и это действительно работает.
Мартин
Почему read ARGV,$buf,1024вместо read STDIN,$buf,1024@ sysadmin1138? (Я пытаюсь ответить на stackoverflow.com/q/22693823/2987828 и не понимаю ARGV здесь). Я использую каждый день вариант в вопросе stackoverflow.com/q/22693823/2987828, и он работает хорошо.
user2987828
1
см. perlmonks.org/bare/?node_id=492858, в котором говорится, что ARGV и STDIN похожи, если в качестве аргумента не указано имя файла.
user2987828
9

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

romble
источник
6

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

С man-страницы:

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

rkthkr
источник
Ах, похоже, именно то, что я искал, спасибо.
Дэвид Хикс
Ссылка на проект Zumastor устарела, я думаю, это правильная ссылка
Martin
2

Существует скрипт на python, который называется blocksync, который представляет собой простой способ синхронизировать два блочных устройства по сети через ssh, передавая только изменения.

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

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

rcoup
источник
1
Я им пользуюсь, отлично работает. Обратите внимание, что есть модифицированная версия, которая исправляет возможный источник повреждения и использует более надежный хэш.
CMC
1

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

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

змееподобный
источник
Это немного сократило бы пропускную способность, но у нас было около 60 и 100 ГБ образов дисков, и даже с gzip это заняло бы слишком много времени.
Дэвид Хикс
@Ophidian, вы должны знать, что SSH обрабатывает сжатие внутри, есть возможность.
Пой
1

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

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

Джеймс
источник
На самом деле, мое первоначальное решение заключалось в том, чтобы просто установить ежедневный снимок, а затем выполнить сравнение со снимком предыдущего дня и передать его на сервер резервного копирования. Я был очень взволнован, узнав, что это не будет так просто.
Дэвид Хикс
Это может быть не так с тонкими моментальными снимками LVM, которые реализованы очень по-разному
Alex F
0

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

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 .

Мартин
источник
0

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

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

shodanshok
источник
0

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

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

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

Дэвид Б
источник
-1

Для этого сценария было сделано несколько выгод:

  1. В моей системе, по крайней мере, чтение Perl-буфера составляет 8 КБ, поэтому используйте размер блока 8192.
  2. автоматическая очистка, поэтому локальный конец не блокируется до тех пор, пока буфер удаленного вывода не заполнится, так как мы используем 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) {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 * 8192,1; \ $ s = 0}; чтение ARGV, \ $ buf, 8192; печать \ $ buf} '1 <> $ dev2 "

Майк Местник
источник