Перенос виртуальной машины на другую vg » История » Версия 5
Версия 4 (Владимир Ипатов, 03.03.2021 22:27) → Версия 5/8 (Владимир Ипатов, 03.03.2021 22:58)
h1. Перенос виртуальной машины на другую vg
h2. Виртуальная машина на одном узле
Данная операция является потенциально опасной, следует выполнять ее только при полном понимании описываемых операций и последствий.
Данная операция требует остановки машины на все время копирования содержимого.
h3. Подготовка
Получить информацию о машине:
<pre>
gnt-instance info ИМЯ
</pre>
Больше всего будет интересовать информация о диске:
Например:
<pre>
Disks:
- disk/0: plain, size 10.0G
access mode: rw
logical_id: xenvg/8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0
on primary: /dev/xenvg/8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0 (253:9)
name: None
UUID: 3c7fb626-21d2-4e99-9365-6639a13456b5
</pre>
Выключить машину
<pre>
gnt-instance shutdown ИМЯ
</pre>
На мастер узле остановить ganeti-watcher, ganeti:
<pre>
service ganeti-watcher stop
service ganeti stop
</pre>
Сделать резервную копию конфига ganeti.
<pre>
cp /var/lib/ganeti/config.data ~/
</pre>
берем имя тома из информации об инстансе, после /
<pre>
в нашем случае это 8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0
</pre>
Копируем в буфер обмена
Также из информации об инстансе берем точный размер тома
создаем том с таким же именем на новой vg (здесь она будет называться ssd)
<pre>
lvcreate -L10G -n 8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0 ssd
</pre>
открываем файл /var/lib/ganeti/config.data, ищем по данному имени, находим блок наподобие этого (json упакован без отступов и перевода строки, читать неудобно, так что нужно пользоваться поиском по подстроке):
<pre>
"disks": [{"logical_id": ["xenvg", "8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0"], "uuid": "3c7fb626-21d2-4e99-9365-6639a13456b5", "dev_type": "plain", "params": {}, "mode": "rw", "iv_name": "disk/0", "size": 10240}]
</pre>
вот указание vg и имени тома:
<pre>
{"logical_id": ["xenvg", "8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0"],
</pre>
В нем меняем vg "xenvg" на "ssd"
Сохраняем файл.
Запускаем ганети:
<pre>
service ganeti start
</pre>
Если в кластере более одного узла, то запускаем копирование конфигурации:
<pre>
gnt-cluster redist-conf
</pre>
проверяем, применились ли изменения, с помощью команды info:
<pre>
gnt-instance info ИМЯ
</pre>
Если все в порядке, то запускаем машину и ganeti-watcher
<pre>
gnt-instance startup ИМЯ
service ganeti-watcher start
</pre>
h2. Виртуальная машина на двух узлах
Возможны два варианта производства этой операции: с остановкой и без.
Вариант без остановки более сложный и трудоемкий.
h2. Перенос с остановкой
машину следует перед переносом остановить и перевести в plain (сделать ее машиной на одном узле):
<pre>
gnt-instance shutdown ИМЯ
gnt-instance modify -t plain ИМЯ
</pre>
После этого машина останется только на primary узле, дальнейшие операции проводятся так же, как для машины на одном узле, см. выше.
по завершении переноса машина переводится в drbd режим:
<pre>
gnt-instance modify -t drbd -n gnt2 ИМЯ
</pre>
где gnt2 - имя нового secondary узла
h2. Перенос без остановки
Данная операция является потенциально опасной, следует выполнять ее только при полном понимании описываемых операций и последствий.
h3. Подготовка
получаем информацию об инстансе, интересует то, на каком узле он запущен и информация о дисках:
<pre>
gnt-instance info ИМЯ
</pre>
<pre>
Disks:
- disk/0: drbd, size 10.0G
access mode: rw
nodeA: gnt2, gnt2.pproduct, minor=1
nodeB: gnt1, minor=1 *gnt1.pproduct, minor=1*
port: 11001
on primary: /dev/drbd1 (147:1) in sync, status ok
on secondary: /dev/drbd1 */dev/drbd1* (147:1) in sync, status ok
name: None
UUID: 4dd153b6-f975-4c3f-a2f7-9dddbd6a3dc2
child devices:
- child 0: plain, size 10.0G
logical_id: ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data *ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data*
on primary: /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data (253:4)
on secondary: /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data (253:4)
name: None
UUID: 4a24c9fb-cd8e-4034-b908-18d3d83c246d
- child 1: plain, size 128M
logical_id: ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_meta
on primary: /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_meta (253:5)
on secondary: /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_meta (253:5)
name: None
UUID: 37dc4222-a29a-42d0-a1a5-3e2c9b0aec8a
</pre>
Итак, мы видим, что машина запущена на gnt2, устройство /dev/drbd1, lvm том /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data
Далее, нужно запустить мастер на узле, который является *SECONDARY* для виртуальной машины, заходим на него и gnt-cluster master-failover
затем останавливаем ganeti-watcher НА ОБОИХ узлах:
<pre>
service ganeti-watcher stop
</pre>
Далее, переходим на узел, где машина secondary (в нашем случае это мастер, gnt1)
Далее, нужно отцепить drbd от текущего тома старой vg:
<pre>
drbdsetup resource1 down
</pre>
где resource1 - это аналог /dev/drbd1
Переименовываем том в старой vg, а также это будет наш бэкап:
<pre>
lvrename ssd 590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data gate-disk0
</pre>
затем заново активируем drbd:
<pre>
gnt-instance activate-disks ИМЯ
</pre>
после этого проверяем, что диск проиницализировался заново и он считается Diskless, запускаем команду drbd-overview:
<pre>
1:??not-found?? Connected Secondary/Primary Diskless/UpToDate
</pre>
затем останавливаем ganeti на мастере, делаем резервную копию конфига
<pre>
service ganeti stop
cp /var/lib/ganeti/config.data ~
</pre>
открываем конфиг, находим по имени тома секцию конфига, относящуюся к диску (там json без отступов и переводов строки, так что пользуемся поиском по подстроке):
<pre>
[{"logical_id": ["8db85567-d4d7-427d-916e-382ab6d9448b", "05ddeac2-8a00-42a5-bf8c-68a440d29d49", 11001, 1, 1, "6adc50aa8fda95beb7b1565c3eb2fd688a9e8a47"], "uuid": "4dd153b6-f975-4c3f-a2f7-9dddbd6a3dc2", "dev_type": "drbd", "params": {}, "mode": "rw", "children": [{"dev_type": "plain", "logical_id": ["ssd", "590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data"], "params": {}, "uuid": "4a24c9fb-cd8e-4034-b908-18d3d83c246d", "size": 10240}, {"dev_type": "plain", "logical_id": ["ssd", "590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_meta"],
</pre>
нас интересует то, что относится к _data, не _meta:
<pre>
{"dev_type": "plain", "logical_id": ["ssd", "590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data"], "params": {}, "uuid": "4a24c9fb-cd8e-4034-b908-18d3d83c246d", "size": 10240}
</pre>
меняем в конфиге имя vg на новую (вместо "ssd" - "xenvg"), только для _data, не для _meta
сохраняем конфиг
затем, на узле, где машина сейчас запущена (т.е. не на том, который сейчас мастер и где мы сейчас редактировали конфиг), создаем том в новой vg.
В нашем примере это узел gnt2.
<pre>
lvcreate -L10G -n 590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data xenvg
</pre>
h2. Виртуальная машина на одном узле
Данная операция является потенциально опасной, следует выполнять ее только при полном понимании описываемых операций и последствий.
Данная операция требует остановки машины на все время копирования содержимого.
h3. Подготовка
Получить информацию о машине:
<pre>
gnt-instance info ИМЯ
</pre>
Больше всего будет интересовать информация о диске:
Например:
<pre>
Disks:
- disk/0: plain, size 10.0G
access mode: rw
logical_id: xenvg/8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0
on primary: /dev/xenvg/8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0 (253:9)
name: None
UUID: 3c7fb626-21d2-4e99-9365-6639a13456b5
</pre>
Выключить машину
<pre>
gnt-instance shutdown ИМЯ
</pre>
На мастер узле остановить ganeti-watcher, ganeti:
<pre>
service ganeti-watcher stop
service ganeti stop
</pre>
Сделать резервную копию конфига ganeti.
<pre>
cp /var/lib/ganeti/config.data ~/
</pre>
берем имя тома из информации об инстансе, после /
<pre>
в нашем случае это 8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0
</pre>
Копируем в буфер обмена
Также из информации об инстансе берем точный размер тома
создаем том с таким же именем на новой vg (здесь она будет называться ssd)
<pre>
lvcreate -L10G -n 8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0 ssd
</pre>
открываем файл /var/lib/ganeti/config.data, ищем по данному имени, находим блок наподобие этого (json упакован без отступов и перевода строки, читать неудобно, так что нужно пользоваться поиском по подстроке):
<pre>
"disks": [{"logical_id": ["xenvg", "8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0"], "uuid": "3c7fb626-21d2-4e99-9365-6639a13456b5", "dev_type": "plain", "params": {}, "mode": "rw", "iv_name": "disk/0", "size": 10240}]
</pre>
вот указание vg и имени тома:
<pre>
{"logical_id": ["xenvg", "8aea288f-37ad-4cd0-8a76-1e36f4da32cb.disk0"],
</pre>
В нем меняем vg "xenvg" на "ssd"
Сохраняем файл.
Запускаем ганети:
<pre>
service ganeti start
</pre>
Если в кластере более одного узла, то запускаем копирование конфигурации:
<pre>
gnt-cluster redist-conf
</pre>
проверяем, применились ли изменения, с помощью команды info:
<pre>
gnt-instance info ИМЯ
</pre>
Если все в порядке, то запускаем машину и ganeti-watcher
<pre>
gnt-instance startup ИМЯ
service ganeti-watcher start
</pre>
h2. Виртуальная машина на двух узлах
Возможны два варианта производства этой операции: с остановкой и без.
Вариант без остановки более сложный и трудоемкий.
h2. Перенос с остановкой
машину следует перед переносом остановить и перевести в plain (сделать ее машиной на одном узле):
<pre>
gnt-instance shutdown ИМЯ
gnt-instance modify -t plain ИМЯ
</pre>
После этого машина останется только на primary узле, дальнейшие операции проводятся так же, как для машины на одном узле, см. выше.
по завершении переноса машина переводится в drbd режим:
<pre>
gnt-instance modify -t drbd -n gnt2 ИМЯ
</pre>
где gnt2 - имя нового secondary узла
h2. Перенос без остановки
Данная операция является потенциально опасной, следует выполнять ее только при полном понимании описываемых операций и последствий.
h3. Подготовка
получаем информацию об инстансе, интересует то, на каком узле он запущен и информация о дисках:
<pre>
gnt-instance info ИМЯ
</pre>
<pre>
Disks:
- disk/0: drbd, size 10.0G
access mode: rw
nodeA: gnt2, gnt2.pproduct, minor=1
nodeB: gnt1, minor=1 *gnt1.pproduct, minor=1*
port: 11001
on primary: /dev/drbd1 (147:1) in sync, status ok
on secondary: /dev/drbd1 */dev/drbd1* (147:1) in sync, status ok
name: None
UUID: 4dd153b6-f975-4c3f-a2f7-9dddbd6a3dc2
child devices:
- child 0: plain, size 10.0G
logical_id: ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data *ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data*
on primary: /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data (253:4)
on secondary: /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data (253:4)
name: None
UUID: 4a24c9fb-cd8e-4034-b908-18d3d83c246d
- child 1: plain, size 128M
logical_id: ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_meta
on primary: /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_meta (253:5)
on secondary: /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_meta (253:5)
name: None
UUID: 37dc4222-a29a-42d0-a1a5-3e2c9b0aec8a
</pre>
Итак, мы видим, что машина запущена на gnt2, устройство /dev/drbd1, lvm том /dev/ssd/590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data
Далее, нужно запустить мастер на узле, который является *SECONDARY* для виртуальной машины, заходим на него и gnt-cluster master-failover
затем останавливаем ganeti-watcher НА ОБОИХ узлах:
<pre>
service ganeti-watcher stop
</pre>
Далее, переходим на узел, где машина secondary (в нашем случае это мастер, gnt1)
Далее, нужно отцепить drbd от текущего тома старой vg:
<pre>
drbdsetup resource1 down
</pre>
где resource1 - это аналог /dev/drbd1
Переименовываем том в старой vg, а также это будет наш бэкап:
<pre>
lvrename ssd 590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data gate-disk0
</pre>
затем заново активируем drbd:
<pre>
gnt-instance activate-disks ИМЯ
</pre>
после этого проверяем, что диск проиницализировался заново и он считается Diskless, запускаем команду drbd-overview:
<pre>
1:??not-found?? Connected Secondary/Primary Diskless/UpToDate
</pre>
затем останавливаем ganeti на мастере, делаем резервную копию конфига
<pre>
service ganeti stop
cp /var/lib/ganeti/config.data ~
</pre>
открываем конфиг, находим по имени тома секцию конфига, относящуюся к диску (там json без отступов и переводов строки, так что пользуемся поиском по подстроке):
<pre>
[{"logical_id": ["8db85567-d4d7-427d-916e-382ab6d9448b", "05ddeac2-8a00-42a5-bf8c-68a440d29d49", 11001, 1, 1, "6adc50aa8fda95beb7b1565c3eb2fd688a9e8a47"], "uuid": "4dd153b6-f975-4c3f-a2f7-9dddbd6a3dc2", "dev_type": "drbd", "params": {}, "mode": "rw", "children": [{"dev_type": "plain", "logical_id": ["ssd", "590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data"], "params": {}, "uuid": "4a24c9fb-cd8e-4034-b908-18d3d83c246d", "size": 10240}, {"dev_type": "plain", "logical_id": ["ssd", "590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_meta"],
</pre>
нас интересует то, что относится к _data, не _meta:
<pre>
{"dev_type": "plain", "logical_id": ["ssd", "590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data"], "params": {}, "uuid": "4a24c9fb-cd8e-4034-b908-18d3d83c246d", "size": 10240}
</pre>
меняем в конфиге имя vg на новую (вместо "ssd" - "xenvg"), только для _data, не для _meta
сохраняем конфиг
затем, на узле, где машина сейчас запущена (т.е. не на том, который сейчас мастер и где мы сейчас редактировали конфиг), создаем том в новой vg.
В нашем примере это узел gnt2.
<pre>
lvcreate -L10G -n 590d122d-57bb-4a3d-a6d4-95542d42cf26.disk0_data xenvg
</pre>