Pull to refresh

Перенос установленной на LVM разделе виртуальной машины KVM на другой сервер с помощью lvmsync

Reading time3 min
Views11K
Приветствую Хабр!

В данном небольшом how-to хотел бы поделиться с вами своим опытом использования утилиты lvmsync.

Данная утилита позволяет решить задачу переноса виртуальной машины с одного сервера KVM на другой, с минимальным простоем виртуальной машины, без использования общего хранилища (non-shared storadge).
Передавать мы будем весь раздел LVM, на который установлена виртуальная машина. Ну а уменьшить время простоя нам поможет магия работы LVM snapshot, информацию о которой вы с легкостью можете найти в интернете.

Вот как выглядит перенос виртуальной машины в кратком виде:

  1. Делаем снимок LVM раздела.
  2. Передаем основной LVM раздел по сети, не останавливая нашу VM.
  3. Когда закончится передача основного раздела, останавливаем VM.
  4. Запускаем lvmsync для передачи снимка по сети. Передается не весь снимок, а только измененные блоки.
  5. Подготавливаем и запускаем VM на новом сервере.

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

Подробнее о работе lvmsync, и дополнительных плюшках вы можете почитать на страничке проекта.



Далее предполагается что у нас есть права sudo в системе, ssh доступ настроен по ключам, а вход под рутом запрещен.

Приступим к переносу VM:

Установка:

Для работы lvmsync нам потребуется Ruby 1.8 (or later), ssh, и dmsetup.
Скачиваем lvmsync на локальный компьютер:

wget https://github.com/mpalmer/lvmsync.git

Копируем lvmsync в root PATH, например в /usr/bin/

Подготовка удаленного сервера (server2):

1) Скачиваем и устанавливаем lvmsync.
2) Создаем LVM раздел для копируемой VM.

server2# lvcreate vg -n new-virtual  -L 16G

Размер раздела должен быть равен исходному разделу (в принципе он может быть и больше исходного, но этот вариант мной не тестировался).

Подготовка локального сервера и перенос VM.

Далее все команды необходимо выполнять на сервере, с которого мы хотим переместить виртуальную машину (server1).

1) Создаем definition xml:

server1# virsh dumpxml virtual > virtual.xml

2) Делаем снимок раздела:

server1# lvcreate --snapshot -L10G -n virtual-snap /dev/vg/virtual

Warning!
Обратите внимание, что размер снимка должен выбираться в зависимости от интенсивности использования VM. Т.к. все данные, пока мы переносим основной раздел, будут «сохраняться» на снимок.
И при полном заполнении снимка, он автоматически деактивируется.

3) Не останавливая VM, переносим основной раздел с помощью dd:

server1# dd if=/dev/vg/virtual bs=1M | gzip -c | pv -ptrb | ssh me@server2 "gunzip -c | sudo dd of=/dev/vg/new-virtual"

Здесь добавлено сжатие передаваемых данных гзипом, и отображение хода передачи данных с помощью pv.

4) Когда перенос будет закончен, останавливаем виртуальную машину:

server1# virsh shutdown virtual

5) И после полной остановки машины запускаем lvmsync для переноса снимка:

server1# lvmsync --stdout /dev/vg/virtual-snap | ssh me@server2 sudo lvmsync --apply - /dev/vg/new-virtual

Эта операция не только перенесет снимок на новый сервер, но и смержит его сразу с основным разделом LVM.

6) Копируем definition xml на удаленный сервер:

server1# scp virtual.xml me@server2:/home/me/new-virtual.xml


Подготовка и запуск виртуальной машины на новом сервере:



1) Изменяем definition xml, если необходимо.

2) Создаем виртуальную машину на основе xml:

server2# virsh define new-virtual.xml

3) Запускаем нашу виртуальную машину, и прописываем ее в автостарт:

server2# virsh start new-virtual
server2# virsh autostart new-virtual


Вот и все, перенос виртуальной машины закончен!

Примечания

Утилита тестировалась на Centos 6.4. Про временя переноса сказать что-либо затрудняюсь, т.к. все зависит от интенсивности работы с виртуальной машиной во время ее переноса, и, соответственно, размера снапшота.
Tags:
Hubs:
+7
Comments1

Articles