Приветствую Хабр!
В данном небольшом how-to хотел бы поделиться с вами своим опытом использования утилиты lvmsync.
Данная утилита позволяет решить задачу переноса виртуальной машины с одного сервера KVM на другой, с минимальным простоем виртуальной машины, без использования общего хранилища (non-shared storadge).
Передавать мы будем весь раздел LVM, на который установлена виртуальная машина. Ну а уменьшить время простоя нам поможет магия работы LVM snapshot, информацию о которой вы с легкостью можете найти в интернете.
Вот как выглядит перенос виртуальной машины в кратком виде:
В результате, при использовании lvmsync время простоя виртуальной машины будет равно времени передачи измененных блоков в снимке основного раздела.
Подробнее о работе lvmsync, и дополнительных плюшках вы можете почитать на страничке проекта.
Далее предполагается что у нас есть права sudo в системе, ssh доступ настроен по ключам, а вход под рутом запрещен.
Для работы lvmsync нам потребуется Ruby 1.8 (or later), ssh, и dmsetup.
Скачиваем lvmsync на локальный компьютер:
Копируем lvmsync в root PATH, например в /usr/bin/
1) Скачиваем и устанавливаем lvmsync.
2) Создаем LVM раздел для копируемой VM.
Размер раздела должен быть равен исходному разделу (в принципе он может быть и больше исходного, но этот вариант мной не тестировался).
Далее все команды необходимо выполнять на сервере, с которого мы хотим переместить виртуальную машину (server1).
1) Создаем definition xml:
2) Делаем снимок раздела:
3) Не останавливая VM, переносим основной раздел с помощью dd:
Здесь добавлено сжатие передаваемых данных гзипом, и отображение хода передачи данных с помощью pv.
4) Когда перенос будет закончен, останавливаем виртуальную машину:
5) И после полной остановки машины запускаем lvmsync для переноса снимка:
Эта операция не только перенесет снимок на новый сервер, но и смержит его сразу с основным разделом LVM.
6) Копируем definition xml на удаленный сервер:
1) Изменяем definition xml, если необходимо.
2) Создаем виртуальную машину на основе xml:
3) Запускаем нашу виртуальную машину, и прописываем ее в автостарт:
Вот и все, перенос виртуальной машины закончен!
Утилита тестировалась на Centos 6.4. Про временя переноса сказать что-либо затрудняюсь, т.к. все зависит от интенсивности работы с виртуальной машиной во время ее переноса, и, соответственно, размера снапшота.
В данном небольшом how-to хотел бы поделиться с вами своим опытом использования утилиты lvmsync.
Данная утилита позволяет решить задачу переноса виртуальной машины с одного сервера KVM на другой, с минимальным простоем виртуальной машины, без использования общего хранилища (non-shared storadge).
Передавать мы будем весь раздел LVM, на который установлена виртуальная машина. Ну а уменьшить время простоя нам поможет магия работы LVM snapshot, информацию о которой вы с легкостью можете найти в интернете.
Вот как выглядит перенос виртуальной машины в кратком виде:
- Делаем снимок LVM раздела.
- Передаем основной LVM раздел по сети, не останавливая нашу VM.
- Когда закончится передача основного раздела, останавливаем VM.
- Запускаем lvmsync для передачи снимка по сети. Передается не весь снимок, а только измененные блоки.
- Подготавливаем и запускаем 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. Про временя переноса сказать что-либо затрудняюсь, т.к. все зависит от интенсивности работы с виртуальной машиной во время ее переноса, и, соответственно, размера снапшота.