Хранилище 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, все остальные будут являться Secondary и их использование будет невозможно до тех пор, пока есть хотя бы один Primary, то есть они просто будут реплицировать данные между ссобой.

Монтируя DRBD-устройство в систему, оно автоматически становится Primary, таким образом даже Diskless-ресурс, в терминологии DRBD, может быть Primary.

Так зачем нужен Linstor?

Доверяя все ресурсоёмкие задачи ядру, Linstor по сути представляет собой обычное Java-приложение которое позволяет без труда автоматизировать создание DRBD-ресурсов.
При этом каждый созданный им ресурс будет являть собой независимый DRBD-кластер, который работает самостоятельно, невзирая на состояние control-plane и остальных DRBD-ресурсов.

Linstor состоит всего из двух компонентов:

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

Linstor оперирует следующими ключевыми понятиями:

  • Node — физический сервер, на котором будут создаваться и использоваться DRBD-ресурсы.
  • Storage Pool — LVM или ZFS пул, созданный на ноде в котором будут размещаться DRBD-ресурсы. Так же возможен diskless-пул — это пул в котором будут размещаться только diskless-ресурсы.
  • Resource Definition — Определение ресурса, по сути это прототип который описывает имя и все его свойства.
  • Volume Definition — Определение тома. Каждый ресурс может состоять из нескольких томов, каждый том должен иметь размер.
  • Resource — Созданный экземпляр блочного устросва, каждый ресурс должен быть размещен на определенной ноде и в каком-нибудь 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

Controller

Здесь все просто:

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

Если увидите version: 9 — значит все впорядке, если version: 8 — значит что-то пошло не так и вам необходимо предпринять дополнительные действия для выяснения причин.

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

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

Создание кластера

Storage pools и ноды

В качестве бэкенда мы возьмем ThinLVM, т.к. он наиболее простой и поддерживает снапшоты.
Установите lvm2, если еще этого не сделали и давайте создадим 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    | Allocated  | InUse  |    State |
|------------------------------------------------------------------------------------------------------|
| node1 | myres    | data        | 0        | 1084    | /dev/drbd1084 | 52 KiB     | Unused | UpToDate |
| node2 | myres    | data        | 0        | 1084    | /dev/drbd1084 | 52 KiB     | Unused | UpToDate |
+------------------------------------------------------------------------------------------------------+

Отлично! — мы видим, что ресурс создался на первых двух нодах, мы также можем попробовать создать diskless-ресурс на третьей:

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