Linux

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

У меня есть несколько виртуальных машин 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

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

Ответ 1

Хотя для RSync существуют патчи «write-device» и «copy-device», они хорошо работают только на небольших образах (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

 Ответ 2

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

Из man-страницы:

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

Ответ 3

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

 Скопируйте файл blocksync.py в домашний каталог на удаленном хосте.

  1. Убедитесь, что ваш удаленный пользователь имеет права sudo или сам является root.

  2. Убедитесь, что ваш локальный пользователь (root?) может прочитать исходное устройство и подключиться к удаленному узлу по ssh.

Ответ 4

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

  1. bdsync, который использует подход diff-transfer-and-patch;

  2. blocksync, которая использует подход in-place-rewrite.

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

Схожие статьи

Linux

Зачем менять порт ssh по умолчанию?

Linux

Как предотвратить случайное использование rm -rf ?

Linux

Существуют ли стандартные коды состояния выхода в Linux

Linux

Может ли scp рекурсивно копировать каталоги?