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


22

У мене є ряд віртуальних машин Xen, що працюють на декількох серверах Linux. Ці відеомагнітофони зберігають свої дискові зображення в томах LVM Linux із назвами пристроїв по лінії / dev / xenVG / SERVER001OS тощо. Я хотів би робити регулярні резервні копії цих дисків, щоб я міг відновити VM у разі потреби (пристрої 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 - це копіювати самі пристрої, а не вміст цих пристроїв. Зробити локальну копію зображення VM перед синхронізацією з віддаленим сервером - це не варіант, оскільки немає місця на диску.

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

Відповіді:


12

У стандартній rsync відсутня ця функція, але для неї є патч у тарболі rsync-patches (copy-devices.diff), який можна завантажити з http://rsync.samba.org/ftp/rsync/ Після додавання та перекомпіляції , ви можете rsync пристрої за допомогою параметра --copy-devices.


якщо ваша мета - пристрій, патч розміщений тут: bugzilla.redhat.com/show_bug.cgi?id=1193654
Jason Pyeron

16

Хоча для 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

Спочатку я злякався, але потім спробував це, і це справді працює.
Мартін

Чому read ARGV,$buf,1024замість read STDIN,$buf,1024@ sysadmin1138? (Я намагаюся відповісти на stackoverflow.com/q/22693823/2987828 і тут нічого не розумію ARGV). Я щодня використовую варіант у питанні stackoverflow.com/q/22693823/2987828, і він працює добре.
користувач2987828

1
див. perlmonks.org/bare/?node_id=492858, де написано, що ARGV та STDIN схожі, якщо ім'я файлу не вказано як аргумент.
користувач2987828

9

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


6

Погляньте на проект Zumastor Linux Storage Project, який реалізує резервну копію "знімка" за допомогою двійкового "rsync" через інструмент ddsnap .

З чоловічої сторінки:

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


А, це схоже на те, що я шукав, дякую.
Девід Хікс

Посилання на проект Zumastor застаріле, я думаю, це правильний варіант: shapor.com/zumastor.org
Мартін

2

Існує сценарій python під назвою blockync, який є простим способом синхронізації двох блокових пристроїв по мережі через ssh, лише передаючи зміни.

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

Нещодавно я зламав його, щоб очистити його та змінити, щоб використовувати той самий алгоритм швидкої контрольної суми, що й rsync ( Adler-32 ).


1
Я його використовую, працює чудово. Зауважте, існує модифікована версія, яка виправляє можливе джерело корупції та використовує більш надійний хеш.
cmc

1

Якщо ви намагаєтеся мінімізувати кількість порожнього простору, яке ви надішлете по дроту простою dd, чи не могли б ви просто передати його в gzip, перш ніж передати його в ssh?

наприклад, dd якщо = / dev / xenVG / SERVER001OS | gzip | ssh administrator @ backupserver "dd of = / mnt / largeDisk / SERVER001OS.img.gz"


Це скоротило пропускну здатність потрібно трохи, але у нас є деякі диски на 60 і 100 ГБ, і навіть з gzip це займе занадто довго.
Девід Хікс

@Ophidian, ви повинні знати, що SSH обробляє стиснення всередині, є варіант.
poige

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

Наскільки мені відомо, обидва сценарії вперше були розміщені на list.samba.org .


0

Це старе питання, але ніхто не згадав два дуже корисні інструменти для ефективної синхронізації двох блокових пристроїв:

  • bdsync , що використовують підхід диференціальної передачі та виправлення;

  • blockync (тут ви можете знайти мою вдосконалену версію ), які використовують підхід для перезапису на місці.

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


0

Після кількох років пошуку я нещодавно створив інструмент для синхронізації знімків LVM між серверами. Він призначений для використання мінімального вводу-виводу та дозволу системам працювати під час синхронізації.

Він схожий на передачу / отримання ZFS тим, що синхронізує відмінності між LVM-знімками та використовує тонкі резервування, щоб вплив на продуктивність був мінімальним.

Я хотів би отримати зворотній зв'язок, тому, будь ласка, подивіться.


-1

Цьому сценарію потрібно зробити кілька ефективностей:

  1. Принаймні в моїй системі читання буфера perl становить 8 к, тому використовуйте розмір блоку 8192.
  2. автоматичне промивання, тому локальний кінець не блокується, поки буфер віддаленого виводу не буде "повним", оскільки ми подаємо lzop, буферизація здається безглуздою.

ssh -i /root/.ssh/rsync_rsa $ remote "perl -'MDigest :: MD5 md5 '-ne" ПОЧАТОК {$ | = 1; \ $ / = \ 892}; print md5 (\ $ )' $ dev2 | lzop -c "| lzop -dc | perl -'MDigest :: MD5 md5 '-ne' ПОЧАТОК {$ | = 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" ПОЧАК { @ $ / = \ 1} if (\ $ _ eq \ "s \") {\ $ s ++} else {if (\ $ s) {шукати STDOUT, \ $ s * 8192,1; \ $ s = 0}; читати ARGV, \ $ buf, 8192; print \ $ buf} '1 <> $ dev2 "

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.