Инструменты пользователя

Инструменты сайта


drbd_xen_live_migration

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
drbd_xen_live_migration [2013/05/30 17:39]
metallic
drbd_xen_live_migration [2022/03/25 17:00] (текущий)
Строка 2: Строка 2:
  
 ===== Введение ===== ===== Введение =====
-XEN имеет встроенную возможность перемещать гостей DomU между несколькими узлами Dom0 без остановки их работы, что называется live migration. Понятное дело, для этого нужно, чтобы на всех узлах, между которыми перемещаются гости, были актульные копии их дисков. Тут может быть масса вариантом, например общая СХД, подключенная ко всем узлам(fiber, sas, iscsi и т.д.), либо дешeвый вариант с использование [[drbd_theory|DRBD]], что и будет рассмотрено в этой статье. В данном мануале все описывается на примере SLES 11 SP2 с установленными расширениями High Availabilityпросто у меня уже есть на стенде два узла с этой ОС, а так ничего не мешает проделать все тоже самое на Debian или на любом другом дистрибутиве Linux. Этот мануал не является пошаговой инструкцией, описываются только основные концепции. По умолчанию подразумевается, что все действия выполняются на обоих узлах, если это не так, то указывается явно на каком узле надо это сделать.+XEN имеет встроенную возможность перемещать гостей DomU между несколькими узлами Dom0 без остановки их работы, что называется live migration. Понятное дело, для этого нужно, чтобы на всех узлах, между которыми перемещаются гости, были актульные копии их дисков. Тут может быть масса вариантом, например общая СХД, подключенная ко всем узлам(fiber, sas, iscsi и т.д.), либо дешeвый вариант с использование [[drbd_theory|DRBD]], что и будет рассмотрено в этой статье. В данном мануале все описывается на примере GNU/Debian 7.0 Wheezy, но ничего не мешает проделать все тоже самое на любом другом дистрибутиве Linux. По умолчанию подразумевается, что все действия выполняются на обоих узлах, если это не такто указывается явно на каком узле надо это сделать
 + 
 +===== Подготовка системы ===== 
 +Устанавливаем ядро XEN с утилитами, модуль DRBD и утилиты для управления сетевыми мостами: 
 + 
 +  # apt-get install xen-linux-system-amd64 xen-tools bridge-utils drbd8-utils 
 +   
 +После установки у нас в загрузчике появится вариант загрузки XEN Dom0, на нужно сделать, чтобы он грузился по-умолчанию
 + 
 +  # mv /etc/grub.d/20_linux_xen /etc/grub.d/09_linux_xen 
 +  # update-grub 
 + 
 +Перезагружаемя, теперь мы в Dom0, проверить это можно так: 
 + 
 +   # xm list 
 +   Name                                        ID   Mem VCPUs      State   Time(s) 
 +   Domain-0                                      3996         r-----    578.7 
 + 
 +Если команда выполнилась без ошибки - значит все нормально. 
 + 
 +Дальше настроим сетевой мост. Предполагается, что гостевые системы будут работать в локальной сети, поэтому в сетевой мост включаем интерфейс, который смотрит в локальную сеть, в моем случае eth0. Правим конфиг /etc/network/interfaces 
 + 
 +  allow-hotplug eth0 
 +  iface eth0 inet manual 
 +          pre-up   ifconfig $IFACE up 
 +          pre-down ifconfig $IFACE down 
 +   
 +  auto br0 
 +  iface br0 inet static 
 +          bridge_ports eth0 
 +          address 192.168.1.1 
 +          netmask 255.255.255.0 
 + 
 +После перезагрузки у нас должен появится сетевой мост br0, в него будем подключать наших гостейна нем же висит локальный адрес узла для взаимодействия внутри локальной сети.
  
 ===== Настройка DRBD ===== ===== Настройка DRBD =====
-Предполагается, что к этому моменту Dom0 запущен, т.е. xen-ядро установлено и загружено. Теперь установим модуль ядра drbd, в SLES это //drbd-kmp-xen//, в debian этот модуль уже есть. Обратите вниманиечто в SLES два модуля drbd, один для обычного ядра и один для xen-ядра, т.е. нас интересует второй(//drbd-kmp-xen//). После установки нужно сделать, чтобы модуль грузился автоматически, также при использовании drbd совместно с ядром xen рекомендуется использовать опцию //disable_sendpage//. Создаем drbd.conf в каталоге /etc/modprobe.d с таким содержимым:+В Debian модуль ядра уже есть, нужно сделать, чтобы модуль грузился автоматически, также при использовании DRBD совместно с ядром XEN рекомендуется использовать опцию //disable_sendpage//. Создаем drbd.conf в каталоге /etc/modprobe.d с таким содержимым:
  
   options drbd disable_sendpage=1   options drbd disable_sendpage=1
Строка 23: Строка 56:
   include "/etc/drbd.d/*.res";   include "/etc/drbd.d/*.res";
      
-Редактируем общие параметры для всех ресурсов(эти параметры потом можно переопределить для каждого ресурса индивидуально), файл /etc/drbd.d/global_common.conf (почти все по-умолчанию):+Редактируем общие параметры для всех ресурсов(эти параметры потом можно переопределить для каждого ресурса индивидуально), файл /etc/drbd.d/global_common.conf (почти все по-умолчанию, пока что рассматриваем простейшую конфигурацию, без автоматического Split Brain recovery):
  
   global {   global {
Строка 37: Строка 70:
      
           handlers {           handlers {
-                  pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; +                  # The following 3 handlers were disabled due to #576511. 
-                  pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; +                  # Please check the DRBD manual and enable them, if they make sense in your setup. 
-                  local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; +                  # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; 
-                  #fence-peer "/usr/lib/drbd/crm-fence-peer.sh";+                  pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; 
 +                  local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; 
 +   
 +                  # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                   # split-brain "/usr/lib/drbd/notify-split-brain.sh root";                   # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                   # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";                   # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                   # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";                   # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
-                  #after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;+                  # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
           }           }
      
Строка 54: Строка 90:
                   # cpu-mask on-no-data-accessible                   # cpu-mask on-no-data-accessible
           }           }
-   +     
-          disk +          net 
-                  # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes +                  # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers 
-                  # disk-drain md-flushes resync-rate resync-after al-extents +                  # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret 
-                  # c-plan-ahead c-delay-target c-fill-target c-max-rate +                  # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork
-                  # c-min-rate disk-timeout+
           }           }
      
-          net +          syncer 
-                  # protocol timeout max-epoch-size max-buffers unplug-watermark +                  # rate after al-extents use-rle cpu-mask verify-alg csums-alg 
-                  # connect-int ping-int sndbuf-size rcvbuf-size ko-count +   
-                  # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri +                  # Максимальная скорость синхронизации(МБ/сек) 
-                  # after-sb-1pri after-sb-2pri always-asbp rr-conflict +                  rate 100M;
-                  # ping-timeout data-integrity-alg tcp-cork on-congestion +
-                  # congestion-fill congestion-extents csums-alg verify-alg +
-                  # use-rle+
           }           }
 +  
   }   }
  
Строка 103: Строка 136:
      
     on node2 {     on node2 {
-      address   192.168.1.1:7900;+      address   192.168.1.2:7900;
     }     }
   }   }
Строка 109: Строка 142:
 Этот конфиг полностью одинаковый для обоих узлов. Этот конфиг полностью одинаковый для обоих узлов.
  
-<note>Режим dual-primary нам нужен для живой миграции, т.к. перед началом миграции XEN проверяет доступно ли устройство на запись, на которое сейчас будет выполнена миграция.</note>+<note>Режим dual-primary нам нужен для живой миграции, т.к. перед началом миграции XEN проверяет доступно ли устройство на запись, на которое сейчас будет выполнена миграция. Таким образом ресурс будет в режиме мастер на обоих узлах в течении короткого промежутка времени, пока осуществляется миграция, в обычном режиме, мастером будет только тот узел, на котором запущен гость.</note>
  
 Инициализируем ресурс: Инициализируем ресурс:
Строка 126: Строка 159:
  
   # cat /proc/drbd   # cat /proc/drbd
-  version: 8.4.(api:1/proto:86-100+  version: 8.3.11 (api:88/proto:86-96
-  GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by phil@fat-tyre, 2011-12-20 12:43:15+  srcversion41C52C8CD882E47FB5AF767
      
    1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----    1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
Строка 139: Строка 172:
  
   # cat /proc/drbd   # cat /proc/drbd
-  version: 8.4.(api:1/proto:86-100+  version: 8.3.11 (api:88/proto:86-96
-  GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by phil@fat-tyre, 2011-12-20 12:43:15+  srcversion41C52C8CD882E47FB5AF767
      
    1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----    1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
Строка 150: Строка 183:
  
   cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----   cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
 +   
 +<note tip> 
 +Можно обойтись без синхронизации, если диски пустые или имеют одинаковый набор данных: 
 +  # drbdadm -- --clear-bitmap new-current-uuid Wheezy 
 +После выполнения этой команды ресурс на обоих узлах сразу перейдет в состояние UpToDate без синхронизации.   
 +</note>
 ===== Настройка XEN ===== ===== Настройка XEN =====
 К текущему моменту у нас один узел работает в режиме мастера, если мы не перезагружали систему. Если же была перезагрузка, то оба узла работают в режиме слейв, тогда любой из них нужно перевести в режим мастер, для первоначальной установки DomU. Делается это командой: К текущему моменту у нас один узел работает в режиме мастера, если мы не перезагружали систему. Если же была перезагрузка, то оба узла работают в режиме слейв, тогда любой из них нужно перевести в режим мастер, для первоначальной установки DomU. Делается это командой:
  
-# drbdadm primary Wheezy+  # drbdadm primary Wheezy
  
-Теперь отформатируем и примонтируем диск(на мастере):+Теперь устанавливаем гостевую систему с помощью утилит XEN методом debootstrap(для простоты устанавливаем без swap-раздела, а в реальной жизне нужно указать доп. параметр, указывающий на устройство, которое будет использовано в качестве swap-диска):
  
-  # mkfs.ext3 /dev/drbd1 +  # xen-create-image --hostname=Wheezy --memory=512mb --vcpus=1 --dhcp --pygrub --dist=wheezy --mirror=http://mirror.yandex.ru/debian/ --fs=ext4 --image-dev=/dev/drbd1 --noswap --output=/etc/xen/virtuals
-  # mount /dev/drbd1 /mnt+
  
 +  * **hostname** - имя хоста, которое будет задано установленной системе
 +  * **memory** - кол-во оперативной памяти, которое будет выделено гостю (потом можно изменить)
 +  * **vcpus** - кол-во процессоров(ядер), которое будет выделено гостю (потом можно изменить)
 +  * **dhcp** - указываем, что гость будет получать настройки сети автоматически, после установки уже можем сконфигурировать сами, как хотим
 +  * **pygrub** - указываем, что будем использовать псевдозагрузчик, который будет выполнять загрузку ядра гостевой ОС
 +  * **dist** - кодовое имя устанавливаемого дистрибутива, список поддерживаемых можно посмотреть тут /usr/lib/xen-tools
 +  * **mirror** - зеркало, откуда брать установочные файлы (понятное дело, должен быть доступ к интернету на время установки)
 +  * **fs** - файловая система для гостевой ОС
 +  * **image-dev** - этим параметром указываем, что у нас уже есть устройство для установки гостевой ОС и его нужно использовать целиком
 +  * **noswap** - уже сказано, что для теста ставим без раздела подкачки
 +  * **output** - указываем каталог, в который сгенерится файл конфигурации нашей виртуалки
 +
 +После выполнения команды, мы должны увидеть нечто подобное:
 +
 +  WARNING
 +  -------
 +  
 +    You appear to have a missing vif-script, or network-script, in the
 +   Xen configuration file /etc/xen/xend-config.sxp.
 +  
 +    Please fix this and restart Xend, or your guests will not be able
 +   to use any networking!
 +  
 +  
 +  General Information
 +  --------------------
 +  Hostname       :  Wheezy
 +  Distribution   :  wheezy
 +  Mirror         :  http://mirror.yandex.ru/debian/
 +  Root Device    :  /dev/drbd1
 +  Partitions     :  Image type     :  full
 +  Memory size    :  512mb
 +  Kernel path    :  /boot/vmlinuz-3.2.0-4-amd64
 +  Initrd path    :  /boot/initrd.img-3.2.0-4-amd64
 +  
 +  Networking Information
 +  ----------------------
 +  IP Address     : DHCP [MAC: 00:16:3E:8A:B6:15]
 +  
 +  
 +  Creating ext4 filesystem on /dev/drbd1
 +  Done
 +  Installation method: debootstrap
 +  Done
 +  
 +  Running hooks
 +  Done
 +  
 +  No role scripts were specified.  Skipping
 +  
 +  Creating Xen configuration file
 +  Done
 +  
 +  No role scripts were specified.  Skipping
 +  All done
 +  
 +  
 +  Logfile produced at:
 +           /var/log/xen-tools/Wheezy.log
 +  
 +  Installation Summary
 +  ---------------------
 +  Hostname        :  Wheezy
 +  Distribution    :  wheezy
 +  IP-Address(es)  :  dynamic
 +  RSA Fingerprint :  e6:e6:77:3c:1f:b2:a0:d8:d9:15:db:b7:a7:1a:32:9a
 +  Root Password   :  _тут_будет_пароль_root_
 +
 +Смотрим что нам за конфиг нагенерили:
 +
 +  bootloader = '/usr/lib/xen-4.1/bin/pygrub'
 +  
 +  vcpus       = '1'
 +  memory      = '512'
 +  
 +  root        = '/dev/xvda2 ro'
 +  disk        = [ 'phy:/dev/drbd1,xvda2,w', ]
 +  
 +  name        = 'Wheezy'
 +  
 +  dhcp        = 'dhcp'
 +  vif         = [ 'mac=00:16:3E:8A:B6:15' ]
 +  
 +  on_poweroff = 'destroy'
 +  on_reboot   = 'restart'
 +  on_crash    = 'restart'
 +
 +Пробуем запустить для проверки работоспособности(с подключением к консоле)
 +
 +  # xm create -c /etc/xen/virtuals/Wheezy
 +  
 +Если все получилось, виртуальная машина должна запуститься и мы увидим ее консоль. Логинимся и завершаем работу виртуалки. (Отключиться от консоли Ctrl + ]).
 +
 +Итак, виртуалка работает, переводим на обоих узлах drbd-ресурс виртуалки в режим secondary. Теперь в конфиге виртуалки нужно поправить параметры жесткого диска, заменить тип phy(физическое устройство) на drbd, также вместо указания пути к блочному устройству, нужно указать имя drbd-ресурса(Wheezy):
 +
 +  disk        = [ 'drbd:Wheezy,xvda2,w', ]
 +
 +Что такое drbd-тип устройства в XEN? В каталоге /etc/xen/scripts есть различные скрипты виртуальных устройств, в том числе block-drbd. С помощью этого скрипта, drbd-ресурс узла, на котором выполняется запуск виртуальной машины, переходит в режим primary автоматически и обратно в secondary, когда виртуальная машина прекращает выполнение. Кроме этого, скрипт сам передает виртуальной машине информацию о пути к блочному устройству. Понятное дело, подобных устройств в конфигурации виртуалки может быть больше, чем одно.
 +
 +Теперь пробуем снова запустить виртуалку, если все прошло корректно, мы должны увидеть ее в списке запущенных гостей:
 +
 +  # xm list
 +  Name                                        ID   Mem VCPUs      State   Time(s)
 +  Domain-0                                      1383         r-----    772.7
 +  Wheezy                                         512         -b----     14.1
 +
 +А drbd-устройство на этом узле должно быть в режиме primary(хотя если это было бы не так, то виртуалка не запустилась)
 +
 +  # cat /proc/drbd
 +  version: 8.3.11 (api:88/proto:86-96)
 +  srcversion: 41C52C8CD882E47FB5AF767
 +  
 +   1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
 +      ns:328 nr:0 dw:328 dr:664 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
 +
 +Ну и самое интересное, то, ради чего, все это городили. Живая миграция без остановки работы виртуалки ни на секунду. Правим на обоих узлах конфиг /etc/xen/xend-config.sxp
 +
 +  # Разрешаем живую миграцию
 +  (xend-relocation-server yes)
 +  
 +  # Разрешаем живую миграцию для любой виртуалки(можно указать список, кому можно)
 +  (xend-relocation-hosts-allow '')
 +
 +Перезапускаем XEN
 +
 +  # /etc/init.d/xen restart
 +  
 +Посе перезапуска оба узла должны слушать порт 8002.
 +
 +Сама миграция выполняется очень просто, одной командой:
 +
 +  # xm migrate --live Wheezy 192.168.1.2
 +
 +  * **Wheezy** - имя виртуалки XEN
 +  * **192.168.1.2** - адрес(или имя) ноды, на которую мигрируем
 +
 +Если все работает корректно, то через некоторое время(от нескольких секунд до нескольких минут) виртуальная машина переедет на второй узел и продолжит выполнятся там, также на втором узле drbd-ресурс перейдет в режим primary, на первом узле в secondary.
 +
 +===== Аппаратная виртуализация =====
 +Если используется полностью аппаратная виртуализация, например для запуска windows-систем, то тут есть одна особенность: не поддерживается использование в качестве типа устройств drbd. Т.е. в конфигурации виртуальной машины нужно указывать путь к блончному устройству(например /dev/drbd2). Соответственно никакой скрипт нам теперь не поможет перевести drbd-ресурс в primary режим. Соотвественно в случае аппаратной виртуализации для поддержки живой миграции нужно на обоих узлах держать drbd-ресурс в режиме primary всегда. В остальном все работает точно также, как описано выше.
 +
 +Пример виртуальной машины для запуска Windows 2012 Server (или любой другой системы с аппаратной виртуализацией):
 +
 +  kernel = "/usr/lib/xen-4.1/boot/hvmloader"
 +  builder='hvm'
 +  memory = 2048
 +  name = "Win2012"
 +  vcpus=1
 +  acpi=1
 +  apic=1
 +  device_model = '/usr/lib/xen-4.1/bin/qemu-dm'
 +  
 +  vif = [ 'type=ioemu, bridge=br0' ]
 +  disk = [ 'phy:/dev/drbd2,ioemu:hda,w', 'file:/home/WindowsServer2012_RU_STD_TRIAL.ISO,hdc:cdrom,r']
 +  
 +  # boot on floppy (a), hard disk (c) or CD-ROM (d)
 +  boot="c"
 +  
 +  usbdevice='tablet'
 +  
 +  vnc=1
 +  vncunused=0
 +  vnclisten = '127.0.0.1'
 +  vncdisplay=0
 +  vncconsole=0
 +  vncpasswd=''
 +  
 +  sdl=0
 +  vncviewer=0
 +  
 +  stdvga=0
 +  serial='pty'
 +  ne2000 = "0"
 +  
 +  on_poweroff = 'destroy'
 +  on_reboot = 'restart'
 +  on_crash = 'restart'
  
drbd_xen_live_migration.1369921154.txt.gz · Последнее изменение: 2022/03/25 17:04 (внешнее изменение)