В данной статье я хочу описать how-to по созданию drbd зеркалирования на Proxmox 3.0 хост-машинах. Объединить машины в proxmox кластер имеет смысл до этих операций – хотя в общем то нет никакой разницы.Основным отличием данного материала от многих, раскинутых на просторах интернета, то что мы делаем drbd раздел не на новом физическом диске, подключенном вторым, а на lvm разделе в пределах единственного наличествующего диска.
Вопрос целесообразности таких действий достаточно спорный – будет ли быстрее drbd на «сыром» диске или нет, но в любом случае это 100% опробованный вариант. В копилку так сказать. Да и работа с «сырым» диском – это просто частный случай данной инструкции.
Собственно Proxmox 3.0 при установке ( так же как и его предшественник 2.0 ) не напрягает вопросами разбиения на разделы и все разбивает сам учитывая только общие размеры диска и объем памяти. Мы получаем раздел /pve/data занимающий большую часть диска и видимый в Proxmox как хранилище local. Вот за счет него и будут производиться действия.
1. Обновляем пакеты до актуальных
#aptitude update && aptitude full-upgrade2. Устанавливаем необходимые пакеты
#aptitude install drbd8-utils3. Освобождение места под новый раздел.
Отмонтируем /dev/pve/data ( он же /var/lib/vz ). Все следующие действия шага 3 можно делать только на отмонтированном ресурсе – соответственно перед этим гасим все VM которые используют хранилище local на данном узле. Остальное можно не трогать если очень нужно.
#umount /dev/pve/data3.1. Уменьшение /dev/pve/data.
В принципе несколько следующих шагов можно заменить командами
#lvresize -L 55G /dev/mapper/pve-data#mkfs.ext3 /dev/pve/dataНу или чуть более развернуто. И по-моему чуть более корректно.
#lvremove /dev/pve/data#lvcreate -n data -l 55G pve#mkfs.ext3 /dev/pve/dataНо при этом мы теряем все что есть на хранилище local. Если Proxmox свежеустановленый (что в общем то рекомендуется для манипуляций такого рода), то на этом все и идем к шагу 4. Если же стоит вопрос все-таки сохранить данные в хранилище local, то действуем иначе.
3.2. Уменьшение /dev/pve/data без потери информации.
Я исхожу из того что занято на local меньше чем 50G. Если у вас другая ситуация то просто поменяйте «новый размер» в командах.
#umount /dev/pve/dataОбязательная проверка, без нее не сработает resize2fs
#e2fsck -f /dev/mapper/pve-datae2fsck 1.42.5 (29-Jul-2012)Pass 1: Checking inodes, blocks, and sizesPass 2: Checking directory structurePass 3: Checking directory connectivityPass 4: Checking reference countsPass 5: Checking group summary information/dev/mapper/pve-data: 20/53223424 files (0.0% non-contiguous), 3390724/212865024 blocksСжимаем файловую систему до 50G. Если данный шаг пропустить то с вероятностью 90% после lvresize мы получим битую систему. Причем число намеренно немножко меньше чем результирующий раздел. С запасом.
#resize2fs /dev/mapper/pve-data 50Gresize2fs 1.42.5 (29-Jul-2012)Resizing the filesystem on /dev/mapper/pve-data to 13107200 (4k) blocks.The filesystem on /dev/mapper/pve-data is now 13107200 blocks long.#e2fsck -f /dev/mapper/pve-dataСжимаем непосредственно раздел /pve/data до 55G
#lvresize -L 55G /dev/mapper/pve-data WARNING: Reducing active logical volume to 55.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.)Do you really want to reduce data? [y/n]: y Reducing logical volume data to 55.00 GiB Logical volume data successfully resizedЗанимаем системой все доступное пространство. В принципе если ваш «запас» на предидущем шаге не большой, то этого можно и не делать. Зачем экономить на спичках? ;)
#resize2fs /dev/mapper/pve-dataresize2fs 1.42.5 (29-Jul-2012)Resizing the filesystem on /dev/mapper/pve-data to 14417920 (4k) blocks.The filesystem on /dev/mapper/pve-data is now 14417920 blocks long.Возвращаем /dev/pve/data системе.
#mount /dev/pve/data4. Создание раздела для drbd
Смотрим свободное место. Убеждаемся что все предидущие шаги дали то, что неободимо. Т.е свободное место на разделе /dev/sda2
#pvdisplay --- Physical volume --- PV Name /dev/sda2 VG Name pve PV Size 931.01 GiB / not usable 0 Allocatable yes PE Size 4.00 MiB Total PE 238339 Free PE 197891 Allocated PE 40448 PV UUID 6ukzQc-D8VO-xqEK-X15T-J2Wi-Adth-dCy9LDСоздаем новый раздел на всё свободное пространство.
#lvcreate -n drbd0 -l 100%FREE pveLogical volume "drbd" created5. Готовим файл конфигурации drbd
#nano /etc/drbd.d/r0.resresource r0 {
startup {
wfc-timeout 120;
degr-wfc-timeout 60;
become-primary-on both;
}
net {
cram-hmac-alg sha1;
shared-secret «proxmox»;
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
syncer {
rate 30M;
}
on p1 {
device /dev/drbd0;
disk /dev/pve/drbd;
address 10.1.1.1:7788;
meta-disk internal;
}
on p2 {
device /dev/drbd0;
disk /dev/pve/drbd;
address 10.1.1.2:7788;
meta-disk internal;
}
}
Параметр wfc-timeout некоторые рекомендуют ставить в 0. Смысл его – если при старте мы не видим соседа drbd то через wfc-timeout секунд перезагрузится для повторной попытки. 0 – означает отключить подобное действие.
Rate 30M – ограничение передачи между drbd хостами. Значение соответствует 1G соединению. Рекомендовано как 30% от реальной пропускной способности канала между хостами. В примере ниже на «тестовых кроликах» пропускная способность на 100M соединении около 11Mb/s т.е rate надо уменьшить до 3M. При 10G соединении между хостами явно имеет смысл увеличить.
6. Создание мета-данных и запуск drbd раздела.
#modprobe drbd#drbdadm create-md r0md_offset 830015008768al_offset 830014976000bm_offset 829989642240Found some data ==> This might destroy existing data! <==Do you want to proceed?[need to type 'yes' to confirm] yesWriting meta data...initializing activity logNOT initialized bitmapNew drbd meta data block successfully created.Success#drbdadm up r0Посмотреть результат можно так:
#cat /proc/drbdversion: 8.3.13 (api:88/proto:86-96)GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by root@sighted, 2012-10-09 12:47:51 0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r----s 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:8105367607. Подготавливаем второй хост
Шаги 1-6 потворяем на второй хост машине. Важный момент(!). Размер раздела drbd должен быть идентичен на обоих хостах.
8. Синхронизация.
Берем один из хостов ( не имеет значения на какой ). Назовем его до полной синхронизации primary. Второй соответственно secondary. После полной синхронизации они станут равноценными -такой режим мы задали.
#drbdadm -- --overwrite-data-of-peer primary r0# cat /proc/drbd
version: 8.3.13 (api:88/proto:86-96)GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by root@sighted, 2012-10-09 12:47:51 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----s ns:0 nr:0 dw:0 dr:664 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:810536760после чего на обоих хостах
#drbdadm down r0#service drbd startНа primary результат будет выглядеть так:
Starting DRBD resources:[ d(r0) s(r0) n(r0) ]..........*************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 60 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 120 seconds. [wfc-timeout] (These values are for resource 'r0'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 18]:.На secondary:
Starting DRBD resources:[ d(r0) s(r0) n(r0) ]..........*************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 60 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 120 seconds. [wfc-timeout] (These values are for resource 'r0'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 14]:0: State change failed: (-10) State change was refused by peer nodeCommand '/sbin/drbdsetup 0 primary' terminated with exit code 110: State change failed: (-10) State change was refused by peer nodeCommand '/sbin/drbdsetup 0 primary' terminated with exit code 110: State change failed: (-10) State change was refused by peer nodeCommand '/sbin/drbdsetup 0 primary' terminated with exit code 11.Ошибки\задержки связаны с тем что мы перезапустили все одновременно. В нормальной ситуации запуск выглядит просто:
#service drbd startStarting DRBD resources:[ d(r0) s(r0) n(r0) ].# cat /proc/drbdversion: 8.3.13 (api:88/proto:86-96)GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by root@sighted, 2012-10-09 12:47:51 0: cs:SyncSource ro:Primary/Primary ds:UpToDate/Inconsistent C r----- ns:199172 nr:0 dw:0 dr:207920 al:0 bm:11 lo:1 pe:24 ua:65 ap:0 ep:1 wo:b oos:810340664 [>....................] sync'ed: 0.1% (791348/791536)M finish: 19:29:01 speed: 11,532 (11,532) K/secтут мы видим, что началась синхронизация дисков.
Запустим мониторинг этого процесса и идем погулять. В зависимости от размеров диска и скорости соединения между хостами гулять можем от пары часов до суток…
#watch –n 1 “cat /proc/drbd”И ждем заветного 100%
cs:SyncSource ro:Primary/Primary ds:UpToDate/ UpToDate9. Создание lvm volume group
Процесс долог, потому продолжим на primary хосте.
#vgcreate drbd-0 /dev/drbd0No physical volume label read from /dev/drbd0 Writing physical volume data to disk "/dev/drbd0" Physical volume "/dev/drbd0" successfully created Volume group "drbd-0" successfully created10. Подключение группы в Proxmox

Выбираем раздел Датацентр-Хранилище в GUI Proxmox. Добавить. Тип — LVM, ID произвольно — это просто название. Группа разделов drbd-0, + включить, + общедоступно.
Обратите внимание на выделенные моменты. drbd-0 это группа созданная на шаге 9.
Ну а общедоступность выставляется для того чтоб Proxmox не пытался скопировать сам образы хост-дисков машин в процессе миграции.
11. Все.
Дождавшись окончания синхронизации можно создавать машины выбирая drbd в качестве хранилища image-disk, переносить их с хоста на хост в кластере не теряя связи с виртуальной машиной для обслуживания хост машины. В общем все готово для построения High Availability Cluster — Proxmox