Как стать автором
Обновить

Настройка 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
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.