Настройка High-Availability кластера Proxmox + DRBD + LVM + GFS2 + OpenVZ CT

В данном конкретном случае используется Debian Wheezy с подключеным репозитарием testing (для drbd8 версии 4.4.1) + пакеты из репозитария proxmox pve-no-subsciption. Также используются контейнеры OpenVZ в качестве виртуальных машин, поэтому GFS2 нам нужна для одновременного монтирования тома DRBD на обеих нодах, ибо использование обычной файловой системы в данном случае невозможно.

Сначала на обеих нодах подключаем репозитарий proxmox.
Добавляем в /etc/apt/sources.list строку:

deb download.proxmox.com/debian wheezy pve-no-subscription

после чего добавляем gnupg ключ в кейринг:

wget -O- «download.proxmox.com/debian/key.asc» | apt-key add — Обновляем кеш пакетов: apt-get update
Устанавливаем пакеты ядра pve: apt-get install pve-firmware pve-kernel-2.6.32-26-pve
Далее перезагружаемся, при загрузке выбираем ядро pve. После загрузки предыдущие версии ядра рекомендуется удалить, чтобы не мешались. Далее настраиваем разделы для DRBD, в данном случае мы использовали raid 10 массив из 4-х HDD SAS western digital 4Tb RE edition.

Рекомендуется использовать userland утилиты drbd той же версии, что и модуль ядра. Т.к. мы устанавливаем drbd версии 8.4.4, а в ядре proxmox pve достаточно устаревшая версия, необходимо собрать модуль для версии 8.4.4 Для этого мы делаем следующее:

устанавливаем dpkms и headers для текущего ядра: apt-get install dkms pve-headers-$(uname -r)
загружаем исходники модуля drbd: wget oss.linbit.com/drbd/8.4/drbd-8.4.4.tar.gz -O — | tar -xzf — -C /usr/src
Создаем файл конфигурации dkms для модуля drbd:

cat > /usr/src/drbd-8.4.4/dkms.conf << EOF
PACKAGE_NAME=«drbd»
PACKAGE_VERSION=«8.4.4»
MAKE[0]=«make -C drbd»
BUILT_MODULE_NAME[0]=drbd
DEST_MODULE_LOCATION[0]=/kernel/drivers/block
BUILT_MODULE_LOCATION[0]=drbd
CLEAN=«make -C drbd clean»
AUTOINSTALL=yes
EOF

Перед сборкой модуля необходимо внести некоторые изменения в заголовочный файл ядра, т.к. в версии ядра pve отсутствует необходимая для сборки переменная. В файле /usr/src/linux-headers-2.6.32-26-pve/include/linux/idr.h после строки: #define MAX_ID_MASK (MAX_ID_BIT — 1) необходимо добавить следующие строки:

#define MAX_LEVEL (MAX_ID_SHIFT + IDR_BITS — 1) / IDR_BITS
#define IDR_FREE_MAX MAX_LEVEL + MAX_LEVEL

Собираем и устанавливаем модуль:
dkms add -m drbd -v 8.4.4
dkms build -m drbd -v 8.4.4
dkms install -m drbd -v 8.4.4

Далее начинаем настройку DRBD.
Подключаем репозитарий testing, в файл /etc/apt/sources.list добавляем строку deb ftp.us.debian.org/debian testing main contrib

Выполняем apt-get update && apt-get install drbd8-utils, после установки testing из списка репозитариев удаляем, чтобы не мешался и заново apt-get update. Не откладывая на потом устанавливаем утилиты файловой системы GFS2: apt-get install gfs2-utils

Создаем файл /etc/drbd.d/r0.res, в котором описываем ноды. Файл одинаков для обех нод:

resource r0 {
protocol C;
startup {
wfc-timeout 0;
degr-wfc-timeout 60;
become-primary-on both;
}
net {
cram-hmac-alg sha1;
shared-secret «bo3wHi8ma$»;
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
on ad28 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.121.28:7788;
meta-disk internal;
}
on ad29 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.121.29:7788;
meta-disk internal;
}
}

На массивах на обеих нодах создаем пустые разделы: parted /dev/sdb mkpart primary 2048s 100%. Запускаем drbd: invoke-rc.d drbd start.
Далее начинаем создавать сам том drbd. Для начала на обеих нодах записываем метаданные drbd:
drbdadm create-md r0
Поднимаем оба устройства:
drbdadm up r0

Далее только на одной из нод запускаем синхронизацию:
drbdadm — --overwrite-data-of-peer primary r0

Процесс синхронизации можно отслеживать через watch: watch cat /proc/drbd
В нашем случае синхронизация завершилась через несколько часов. После завершения перезапускаем drbd:
invoke-rc.d drbd restart

Смотрим статус тома: cat /proc/drbd, должно быть похоже на:

Version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by root@ad29.semrush.net, 2013-12-18 04:06:00
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r-----
ns:20372620 nr:34981576 dw:36165068 dr:20957384 al:231 bm:1239 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

Далее настраиваем lvm:

pvcreate /dev/drbd0
vgcreate drbdvg /dev/drbd0
lvcreate -n data -L6600G drbdvg # Оставляем некоторое количество свободного места для снапшотов lvm, мы оставили 500Гб.

Теперь устанавливаем сам Proxmox:

apt-get install proxmox-ve-2.6.32 ntp ssh lvm2 postfix ksm-control-daemon vzprocps open-iscsi bootlogd

Настройку Proxmox описывать мы не будем, ибо там и так есть соответствующие мануалы, продолжим с GFS2.

Для начала переключим LVM на кластерных режим блокировок, в файл /etc/default/clvm (его скорее всего еще нет, необходимо создать) вносим строки:

START_CLVM=yes
LVM_VSG=«drbdvg»

Т.к. мы не настраивали fenced, (в нашем случае не было доступа к управлению APC), достаточно прописать в /etc/default/redhat-cluster-pve: FENCE_JOIN=«yes». При желании в мануале по настройке кластера drbd на сайте proxmoxa есть описание настройки fence.

Перезагружаемся, продолжаем настройку.
В нашем случае lvm не подцеплял drbd автоматически, пришлось пойти на некоторые уловки со скриптами в /etc/init.d. Первым делом изменили порядок загрузки clvm, в файле /etc/init.d/clvm поменяли порядок загрузки на:

# Provides: clvm
# Required-Start: lvm2 cman
# Required-Stop: lvm2 cman
# Should-Start: cman corosync openais
# Should-Stop: cman corosync openais

Также был придуман скрипт-обманка:
/etc/init.d/drbdmount:

#!/bin/bash
#
# chkconfig: — 70 08
# description: Mounts drbd filesystems
#
# Copyright 2012 Albert R. Valiev
#
#
### BEGIN INIT INFO
# Provides: drbdmount
# Required-Start: $local_fs $network $syslog clvm drbd
# Required-Stop: $local_fs $network $syslog
# Should-Start: sshd multipathd drbd
# Should-Stop: sshd multipathd
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Start-Before: pvedaemon
# X-Stop-After: pvedaemon
# X-Interactive: true
# Short-Description: Control drbd resources.
### END INIT INFO

case "$1" in
start)
sleep 10 #на случай одновременной перезагрузки нод мелкий хак
vgchange -a y drbdvg
mount -t gfs2 -o rw,noatime,_netdev /dev/drbdvg/data /var/lib/vz
;;
stop)
;;
esac

При создании файловой системы gfs2 на нужно знать имя кластера, на всякий случай выясняем: pvecm status | grep «Cluster Name»

Создаем файловую систему на томе lvm (только на одной ноде):
mkfs.gfs2 -t clustername:storage01 -j 2 /dev/mapper/drbdvg-data

монтируем том: mount -t gfs2 -o rw,noatime,_netdev /dev/mapper/drbdvg-data /var/lib/vz

Собственно настройка завершена, контейнеры OpenVZ в случае отключения одной из нод благополучно мигрируют на вторую, путем добавления в веб-интерфейсе proxmox во вкладке HA HA-managet CT/VM.

Осталось настроить snapshot бекапы, т.к. при использовании gfs2 снапшоты просто так не монтируются, неоюходимо в файл /usr/share/perl5/PVE/VZDump/OpenVZ.pm в функции snapshot после строки: my $mopts = $di->{fstype} eq 'xfs'? "-o nouuid": '';

следующего кода:

if ($di->{fstype} eq 'gfs2')
{
$mopts = "-o ignore_local_fs,lockproto=lock_nolock";
$self->cmd(«echo y | gfs2_tool sb $di->{snapdev} table $di->{snapdev}»);
}

После этого резервное копирование «на лету» с использованием lvm cнапшотов благополучно работает.

P.S.

При создании статьи использовались материалы по настройке Proxmox/DRBD с сайта Proxmox, а также статья «Кластерное хранилище в Proxmox» с сайта habrahabr.ru в части настройки GFS2
Tags:
proxmox drbd gfs2 lvm

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.