Сховище LINSTOR та його інтеграція з OpenNebula

Сховище LINSTOR та його інтеграція з OpenNebula

Нещодавно хлопці з LINBIT представили своє нове SDS-рішення - Linstor. Це повністю вільне сховище, в основі якого використовуються перевірені технології: DRBD, LVM, ZFS. Linstor поєднує в собі простоту і добре опрацьовану архітектуру, що дозволяє досягти стабільності та досить значних результатів.

Сьогодні я хотів би розповісти про нього трохи докладніше і показати, наскільки просто його можна інтегрувати з OpenNebula, використовуючи linstor_un — новий драйвер, який я розробив спеціально для цієї мети.

Linstor у поєднанні з OpenNebula дозволяє побудувати швидку та надійну хмару, яку можна без проблем розгорнути на власній інфраструктурі.

Архітектура Linstor

Linstor не є ні файловою системою ні блоковим сховищем само по собі, Linstor - це оркестратор, який надає шар абстракції, що дозволяє автоматизувати створення томів в LVM або ZFS і реплікувати їх за допомогою DRBD9.

Ломаємо стереотипи

Але заждіть, DRBD? — Навіщо його автоматизувати і як це може працювати взагалі?

Згадаймо минуле, коли на всю популярність був DRBD8. Стандартне його використання мало на увазі створення одного великого блокового пристрою і нарізування його на багато маленьких шматочків за допомогою того ж LVM. Такий собі mdadm RAID-1 але з реплікацією по мережі.

Такий підхід не позбавлений недоліків, і тому з приходом DRBD9 принципи побудови сховища змінилися, тепер під кожну віртуалку створюється окремий пристрій DRBD.

Підхід з незалежними блоковими пристроями дозволяє краще утилізувати простір у кластері, а також додає ряд додаткових можливостей. Наприклад для кожного такого пристрою можна визначати кількість реплік, їхнє розташування та індивідуальні налаштування. Їх легко створювати/видаляти, робити снапшоти, змінювати розмір, включати шифрування та багато іншого. Варто зауважити, що DRBD9 так само підтримує кворум, який дозволяє уникнути split-brain ситуацій.

Ресурси та бекенди

Створюючи новий блоковий пристрій, Linstor розміщує необхідну кількість реплік на різних нодах у кластері. Кожну таку репліку ми називатимемо DRBD-ресурсом.

Ресурси бувають двох типів:

  • Data-ресурс — є DRBD-пристрій розміщений на ноді в LVM або ZFS пулі.
    На даний момент є підтримка кількох бекендів і їхня кількість постійно зростає. Є підтримка LVM, ThinLVM та ZFS. Останні два дозволяють створювати та використовувати снапшоти.
  • Diskless-ресурс — є DRBD-пристрій розміщений на ноді без бекенда, але що дозволяє звертатися з ним як зі звичайним блоковим пристроєм, всі операції читання/запису будуть перенаправлені на data-ресурси. Найближчий аналог diskless-ресурсам – це iSCSI LUN.

Кожен DRBD-ресурс може мати до 8 реплік, і лише один із них за умовчанням може бути активним. Первинний, всі інші будуть Вторинний і їх використання буде неможливо доти, доки є хоча б один Primary, тобто вони просто реплікуватимуть дані між собою.

Монтуючи DRBD-пристрій у систему, він автоматично стає Первинний, Таким чином, навіть Diskless-ресурс, в термінології DRBD, може бути Primary.

То навіщо потрібний Linstor?

Довіряючи всі ресурсомісткі завдання ядру, Linstor по суті є звичайним Java-додатком, який дозволяє легко автоматизувати створення DRBD-ресурсів.
При цьому кожен створений ним ресурс буде незалежним DRBD-кластером, який працює самостійно, незважаючи на стан control-plane та інших DRBD-ресурсів.

Linstor складається з двох компонентів:

  • Linstor-controller — Основний контролер, який надає API для створення та керування ресурсами. Він також спілкується з сателітами, перевіряючи вільне місце на них, і відправляє завдання для створення та видалення нових ресурсів. Запускається в одиничному екземплярі та використовує базу даних, яка може бути як внутрішньою (H2), так і зовнішньою (PostgreSQL, MySQL, MariaDB)
  • Linstor-satellite — Встановлюється на всі storage-ноди і надає контролеру інформацію про вільний простір, а також виконує завдання, отримані від контролера, для створення та видалення нових томів та DRBD-пристроїв поверх них.

Linstor оперує такими ключовими поняттями:

  • вузол — фізичний сервер, на якому будуть створюватися та використовуватися DRBD-ресурси.
  • Пул зберігання — LVM або ZFS пул, створений на ноді, в якому розміщуватимуться DRBD-ресурси. Також можливий diskless-пул — це пул, у якому розміщуватимуться лише diskless-ресурси.
  • Resource Definition — Визначення ресурсу, по суті, це прототип, який описує ім'я та всі його властивості.
  • Volume Definition - Визначення тому. Кожен ресурс може складатися з кількох томів, кожен том має розмір.
  • Ресурс — Створений екземпляр блокового пристрою, кожен ресурс має бути розміщений на певній ноді і в якомусь storage pool.

Установка Linstor

Як система рекомендую використовувати Ubuntu, т.к. для неї існує готовий PPA:

add-apt-repository ppa:linbit/linbit-drbd9-stack
apt-get update

Або Debian, де Linstor можна встановити з офіційного репозиторію для Proxmox:

wget -O- https://packages.linbit.com/package-signing-pubkey.asc | apt-key add -
PVERS=5 && echo "deb http://packages.linbit.com/proxmox/ proxmox-$PVERS drbd-9.0" > 
    /etc/apt/sources.list.d/linbit.list
apt-get update

контролер

Тут все просто:

apt-get install linstor-controller linstor-client
systemctl enable linstor-controller
systemctl start linstor-controller

Storage-ноди

На даний момент в ядрі Linux поставляється in-tree модуль ядра DRBD8, на жаль, він нам не підходить і нам потрібно встановити DRBD9:

apt-get install drbd-dkms

Як показує практика, більшість складнощів виникає саме з тим, що в систему завантажений модуль DRBD8, а не DRBD9. На щастя це легко перевірити, виконавши:

modprobe drbd
cat /proc/drbd

Якщо побачите версія: 9 - значить все в порядку, якщо версія: 8 — отже, щось пішло не так і вам необхідно вжити додаткових дій для з'ясування причин.

Тепер встановимо linstor-satellite и drbd-utils:

apt-get install linstor-satellite drbd-utils
systemctl enable linstor-satellite
systemctl start linstor-satellite

Створення кластера

Storage pools та ноди

Як бекенд ми візьмемо ThinLVM, т.к. він найпростіший і підтримує снапшоти.
Встановіть м2, якщо цього ще не зробили і давайте створимо ThinLVM pool на всіх наших storage-нодах:

sudo vgcreate drbdpool /dev/sdb
sudo lvcreate -L 800G -T drbdpool/thinpool

Усі подальші дії можуть виконуватися безпосередньо на контролері:

Додамо наші ноди:

linstor node create node1 127.0.0.11
linstor node create node2 127.0.0.12
linstor node create node3 127.0.0.13

Створимо storage pools:

linstor storage-pool create lvmthin node1 data drbdpool/thinpool
linstor storage-pool create lvmthin node2 data drbdpool/thinpool
linstor storage-pool create lvmthin node3 data drbdpool/thinpool

Тепер перевіримо створені пули:

linstor storage-pool list

Якщо все виконано правильно, то ми маємо побачити щось на кшталт:

+------------------------------------------------- -------------------------------------------------- ----+ | StoragePool | Node | Driver | PoolName | FreeCapacity | TotalCapacity | SupportsSnapshots | |------------------------------------------------- -------------------------------------------------- ----| | data | node1 | LVM_THIN | drbdpool/thinpool | 64 GiB | 64 GiB | true | | data | node2 | LVM_THIN | drbdpool/thinpool | 64 GiB | 64 GiB | true | | data | node3 | LVM_THIN | drbdpool/thinpool | 64 GiB | 64 GiB | true | +------------------------------------------------- -------------------------------------------------- ----+

DRBD-ресурси

Тепер давайте спробуємо створити наш новий DRBD-ресурс:

linstor resource-definition create myres
linstor volume-definition create myres 1G
linstor resource create myres --auto-place 2

Перевіримо створені ресурси:

linstor resource list 

+------------------------------------------------- -------------------------------------------------- ---+ | Node | Resource | StoragePool | VolumeNr | MinorNr | DeviceName | Розміщений | InUse | держава | |------------------------------------------------- -------------------------------------------------- ---| | node1 | myres | data | 0 | 1084 | /dev/drbd1084 | 52 KiB | Unused | UpToDate | | node2 | myres | data | 0 | 1084 | /dev/drbd1084 | 52 KiB | Unused | UpToDate | +------------------------------------------------- -------------------------------------------------- ---+

Чудово! — ми бачимо, що ресурс створився на перших двох нодах, ми також можемо спробувати створити диск-ресурс на третій:

linstor resource create --diskless node3 myres

На нодах ви завжди знайдете цей пристрій як /dev/drbd1084 або /dev/drbd/by-res/myres/0

Ось так працює Linstor, ви можете отримати більше інформації з офіційної документації.

Тепер я розповім про те, як інтегрувати його з OpenNebula

Налаштування OpenNebula

Я не сильно заглиблюватимуся в процес налаштування OpenNebula, т.к. всі кроки детально описані в офіційної документації, до якої і рекомендую вам звернутися, розповім лише про інтеграцію OpenNebula з Linstor.

linstor_un

Для вирішення цього завдання я написав власний драйвер. linstor_un, на даний момент він доступний у вигляді плагіна і повинен встановлюватись окремо.

Вся установка здійснюється на frontend OpenNebula-нодах і не вимагає додаткових дій на compute-нодах.

Насамперед нам потрібно переконатися, що ми маємо jq и linstor-client:

apt-get install jq linstor-client

Команда linstor node list має виводити список нод. Всі compute-ноди OpenNebula повинні бути додані до кластера Linstor.

Скачаємо та встановимо плагін:

curl -L https://github.com/OpenNebula/addon-linstor_un/archive/master.tar.gz | tar -xzvf - -C /tmp

mv /tmp/addon-linstor_un-master/vmm/kvm/* /var/lib/one/remotes/vmm/kvm/

mkdir -p /var/lib/one/remotes/etc/datastore/linstor_un
mv /tmp/addon-linstor_un-master/datastore/linstor_un/linstor_un.conf /var/lib/one/remotes/etc/datastore/linstor_un/linstor_un.conf

mv /tmp/addon-linstor_un-master/datastore/linstor_un /var/lib/one/remotes/datastore/linstor_un
mv /tmp/addon-linstor_un-master/tm/linstor_un /var/lib/one/remotes/tm/linstor_un

rm -rf /tmp/addon-linstor_un-master

Тепер нам потрібно додати його до конфіг OpenNebula, для цього виконуємо нескладні кроки описані тут.

Після чого перезапустимо OpenNebula:

systemctl restart opennebula

І додамо наші datastores, системне:

cat > system-ds.conf <<EOT
NAME="linstor-system"
TYPE="SYSTEM_DS"
STORAGE_POOL="data"
AUTO_PLACE="2"
CLONE_MODE="snapshot"
CHECKPOINT_AUTO_PLACE="1"
BRIDGE_LIST="node1 node2 node3"
TM_MAD="linstor_un"
EOT

onedatastore create system-ds.conf

І сховище образів:

cat > images-ds.conf <<EOT
NAME="linstor-images"
TYPE="IMAGE_DS"
STORAGE_POOL="data"
AUTO_PLACE="2"
BRIDGE_LIST="node1 node2 node3"
DISK_TYPE="BLOCK"
DS_MAD="linstor_un"
TM_MAD="linstor_un"
EOT

onedatastore create images-ds.conf

  • Параметр AUTO_PLACE відображає кількість data-рекплік, яка буде створена для кожного нового образу OpenNebula.
  • Параметр CLONE_MODE вказує на те, як саме клонуватимуться образи при створенні нових віртуальних машин, snapshot - створюватиме снапшот образу і зі снапшота розгортатиме віртуальну машину, copy — робитиме повну копію образу під кожну віртуальну машину.
  • В BRIDGE_LIST рекомендується вказати всі ноди, які будуть використовуватись для виконання операцій з клонування образів.

Повний список параметрів, що підтримуються, наведено в README проекту.

На цьому налаштування завершено, тепер можна завантажити будь-яке appliance з офіційного OpenNebula Marketplace та створити віртуальні машини з нього.

Посилання на проект:
https://github.com/OpenNebula/addon-linstor_un

Джерело: habr.com

Додати коментар або відгук