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

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


drbd_xen_live_migration

Это старая версия документа!


XEN на DRBD с живой миграцией между узлами

Введение

XEN имеет встроенную возможность перемещать гостей DomU между несколькими узлами Dom0 без остановки их работы, что называется live migration. Понятное дело, для этого нужно, чтобы на всех узлах, между которыми перемещаются гости, были актульные копии их дисков. Тут может быть масса вариантом, например общая СХД, подключенная ко всем узлам(fiber, sas, iscsi и т.д.), либо дешeвый вариант с использование DRBD, что и будет рассмотрено в этой статье. В данном мануале все описывается на примере SLES 11 SP2 с установленными расширениями High Availability, просто у меня уже есть на стенде два узла с этой ОС, а так ничего не мешает проделать все тоже самое на Debian или на любом другом дистрибутиве Linux. Этот мануал не является пошаговой инструкцией, описываются только основные концепции. По умолчанию подразумевается, что все действия выполняются на обоих узлах, если это не так, то указывается явно на каком узле надо это сделать.

Настройка DRBD

Предполагается, что к этому моменту Dom0 запущен, т.е. xen-ядро установлено и загружено. Теперь установим модуль ядра drbd, в SLES это drbd-kmp-xen, в debian этот модуль уже есть. Обратите внимание, что в SLES два модуля drbd, один для обычного ядра и один для xen-ядра, т.е. нас интересует второй(drbd-kmp-xen). После установки нужно сделать, чтобы модуль грузился автоматически, также при использовании drbd совместно с ядром xen рекомендуется использовать опцию disable_sendpage. Создаем drbd.conf в каталоге /etc/modprobe.d с таким содержимым:

options drbd disable_sendpage=1

<note important>disable_sendpage параметр доступен начиная с версии 8.3.2</note>

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

# lsmod | grep drbd
drbd                  313707  5

Теперь нужно выделить любое блочное устройство(диск, raid-массив, lvm volume) для виртуальной машины. В моем случае это будет lvm volume /dev/virtuals/Wheezy

Редактируем /etc/drbd.conf, это основной конфигурационный файл, но удобнее его разбить на несколько секций, что и делаем:

include "/etc/drbd.d/global_common.conf";
include "/etc/drbd.d/*.res";

Редактируем общие параметры для всех ресурсов(эти параметры потом можно переопределить для каждого ресурса индивидуально), файл /etc/drbd.d/global_common.conf (почти все по-умолчанию):

global {
        # Запрещаем посылать через интернет разработчикам информацию о версии DRBD (для статистики)  
        usage-count no;

        # minor-count dialog-refresh disable-ip-verification
}

common {
        # Синхронный протокол синхронизации
        protocol C;

        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";
                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";
                # 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";
                #after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }

        startup {
                # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
        }

        options {
                # cpu-mask on-no-data-accessible
        }

        disk {
                # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
                # disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-target c-fill-target c-max-rate
                # c-min-rate disk-timeout
        }

        net {
                # protocol timeout max-epoch-size max-buffers unplug-watermark
                # 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
                # ping-timeout data-integrity-alg tcp-cork on-congestion
                # congestion-fill congestion-extents csums-alg verify-alg
                # use-rle
        }
}

Теперь создаем конфигурационный файл ресурса /etc/drbd.d/Wheezy.res:

# Имя ресурса
resource Wheezy {

  syncer {
    # Алгоритм проверки целостности данных
    verify-alg md5;
  }

  net {
    # Разрешаем обоим узлам быть мастерами одновременно
    allow-two-primaries;
  }

  # DRBD-устройство
  device    /dev/drbd1;
  
  # Путь к блочному устройству, которое будем синхронизировать
  disk      /dev/virtuals/Wheezy;
  
  # Метаданные будем хранить на самом устройстве
  meta-disk internal;

  #  Далее указываем адреса и порты обоих узлов
  on node1 {
    address   192.168.1.1:7900;
  }

  on node2 {
    address   192.168.1.1:7900;
  }
}

Этот конфиг полностью одинаковый для обоих узлов.

Инициализируем ресурс:

# drbdadm create-md Wheezy
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.

Запускаем ресурс:

# drbdadm up Wheezy

Смотрим его состояние(на любом узле):

# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by phil@fat-tyre, 2011-12-20 12:43:15

 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:5242684
    

Сейчас он на обоих ресурсах в состоянии Secondary и данные имеют статус Inconsistent, т.к. синхронизации еще не было, самое время ее выполнить. На узле, который будет на текущий момент мастером выполняем:

# drbdadm -- --overwrite-data-of-peer primary Wheezy

Эта команда переведет узел, на котором была выполнена, в режим мастер и начнет синхронизировать данные со слейвом. В зависимости от скорости каналов связи, скорости дисковой подсистемы и размеров ресурса, это может занять некоторое время. Наблюдать за процессом можно также:

# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by phil@fat-tyre, 2011-12-20 12:43:15

 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:412672 nr:0 dw:0 dr:417432 al:0 bm:24 lo:3 pe:1 ua:5 ap:0 ep:1 wo:b oos:4831036
        [>...................] sync'ed:  7.9% (4716/5116)M
        finish: 0:01:10 speed: 68,608 (68,608) K/sec

По окончании синхронизации ресурс должен получить следующий статус:

cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
drbd_xen_live_migration.1369917036.txt.gz · Последнее изменение: 2022/03/25 17:04 (внешнее изменение)