
Неотдавна специалистите от 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 работи с следните ключови понятия:
- Узел — физическият сървър, на който ще бъдат създавани и използвани DRBD-ресурси.
- Storage Pool — LVM или ZFS пул, създаден на възел, в който ще бъдат разположени DRBD-ресурсите. Възможен е и diskless-пул — това е пул, в който ще бъдат разположени само diskless-ресурси.
- Resource Definition — Определение на ресурса, по същност това е прототип, който описва името и всичките му свойства.
- Определение на том — Определение на тома. Всеки ресурс може да се състои от няколко тома, всеки том трябва да има размер.
- Ресурс — Създаден екземпляр на блочно устройство, всеки ресурс трябва да бъде разположен на определена нода и в някакъв storage pool.
Инсталиране на Linstor
Препоръчвам да използвате Ubuntu, тъй като за него съществува :
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-controllerStorage-ноди
В момента в ядрото на 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, тъй като той е най-простият и поддържа снимки.
Установете 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 | +------------------------------------------------------------------------------------------------------+
Отлично! — виждаме, че ресурсът е създаден на първите две ноди, можем също да опитаме да създадем ресурс без диск на третата:
linstor resource create --diskless node3 myresНа нодите винаги ще намерите това устройство като /dev/drbd1084 или /dev/drbd/by-res/myres/0
Така работи Linstor, можете да получите допълнителна информация от .
Сега ще разкажа как да го интегрираме с OpenNebula
Настройка на OpenNebula
Няма да се задълбочавам в процеса на настройка на OpenNebula, тъй като всички стъпки са подробно описани в , на която ви препоръчвам да се обърнете, ще говоря само за интеграцията на OpenNebula с Linstor.
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— ще създава snapshot на образа и от snapshot-а ще разгръща виртуална машина,copy— ще прави пълна копия на образа за всяка виртуална машина. - В
BRIDGE_LISTпрепоръчва се да посочите всички нодове, които ще се използват за извършване на операции по клониране на образи.
Пълният списък на поддържаните параметри е приведен в проектa.
С това настройката е завършена, сега можете да заредите някои appliance от официалния и да създадете виртуални машини от него.
Връзка към проекта:
Източник: habr.com
