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

Недостатки и уязвимости использования LVM

Linux

Запуск jmap, получение которого невозможно без открытия файла сокета

Linux

Как предоставить доступ нескольким системным администраторам Linux, работающим от имени пользователя root?

Linux

Есть ли способ для некорневых процессов привязаться к «привилегированным» портам в Linux?

×