Linstor распределённое хранилище

Thank you for reading this post, don't forget to subscribe!

https://www.linbit.com/downloads/tech-guides/linstor-sds-quickstart-centos7.pdf

Это пол­но­стью сво­бод­ное хра­ни­ли­ще в осно­ве кото­ро­го исполь­зу­ют­ся про­ве­рен­ные тех­но­ло­гии: DRBD, LVMZFS

Linstor не явля­ет­ся ни фай­ло­вой систе­мой ни блоч­ным хра­ни­ли­щем само по себе, Linstor — это оркест­ра­тор, кото­рый предо­став­ля­ет слой абстрак­ции поз­во­ля­ю­щий авто­ма­ти­зи­ро­вать созда­ние томов в LVM или ZFS и реп­ли­ци­ро­вать их с помо­щью DRBD9

DRBD8 -  Стан­дарт­ное его исполь­зо­ва­ние под­ра­зу­ме­ва­ло созда­ние одно­го боль­шо­го блоч­но­го устрой­ства и наре­за­ние его на мно­го малень­ких кусоч­ков, при помо­щи того же LVM.

Такой под­ход не лишен недо­стат­ков, и поэто­му с при­хо­дом 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 тре­бу­ет­ся как мини­мум один актив­ный кон­трол­лер и один или несколь­ко спутников.
    Linstor-кон­трол­лер содер­жит базу дан­ных , кото­рая содер­жит всю инфор­ма­цию о кон­фи­гу­ра­ции для все­го кла­сте­ра. Он при­ни­ма­ет все реше­ния, кото­рые долж­ны иметь вид на весь кла­стер. Кон­трол­лер обыч­но раз­вер­ты­ва­ет­ся как служ­ба высо­кой доступ­но­сти с исполь­зо­ва­ни­ем Pacemaker и DRBD, так как он явля­ет­ся важ­ной частью систе­мы. Для LINSTOR мож­но исполь­зо­вать несколь­ко кон­трол­ле­ров, но актив­ным может быть толь­ко один.
  • Linstor-satellite — Уста­нав­ли­ва­ет­ся на все storage-ноды и предо­став­ля­ет кон­трол­ле­ру инфор­ма­цию о сво­бод­ном про­стран­стве, а так же выпол­ня­ет зада­чи, полу­чен­ные от кон­трол­ле­ра, для созда­ния и уда­ле­ния новых томов и DRBD-устройств поверх них.
  • linstor-клиент

    Linstor-кли­ент это ути­ли­та команд­ной стро­ки , кото­рая исполь­зу­ет­ся для команд выпус­ка в систе­му и иссле­до­вать состо­я­ние системы.

 

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

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

Firewall

 

 

yum install drbd90-utils kmod-drbd90 lvm2

echo drbd > /etc/modules-load.d/drbd.conf

systemctl enable drbd
systemctl start drbd

даль­ше нам надо полу­чить хэш что­бы уста­но­вить linbit для это­го пишем на sales@linbit.com

но там ниху­я­шень­ки не отве­ча­ют - печаль беда.

будем брать из архива:

Download

и так при­сту­пим у нас есть 3 тачки:

linstor-1 192.168.1.101
linstor-2 192.168.1.102
linstor-3 192.168.1.103

доба­вим в /etc/hosts:
cat /etc/hosts | grep linstor
192.168.1.101 linstor-1
192.168.1.102 linstor-2
192.168.1.103 linstor-3

ста­вим на все 3:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum install drbd90-utils kmod-drbd90 lvm2 -y
echo drbd > /etc/modules-load.d/drbd.conf
systemctl enable drbd
systemctl start drbd
yum install rpm-build -y
yum install java-1.8.0-openjdk-headless java-1.8.0-openjdk-devel -y
yum install protobuf-compiler -y
yum install python3 -y
curl -s get.sdkman.io | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install gradle
wget https://www.linbit.com/downloads/linstor/linstor-server-1.11.1.tar.gz
cp linstor-server-1.11.1.tar.gz linstor-server-1.11.1.orig.tar.gz
rpmbuild -tb linstor-server-1.11.1.tar.gz
rpm -ivh rpmbuild/RPMS/noarch/*
wget https://www.linbit.com/downloads/linstor/python-linstor-1.6.0.tar.gz
cp python-linstor-1.6.0.tar.gz python-linstor-1.6.0.orig.tar.gz
tar zxvf python-linstor-1.6.0.tar.gz
cd python-linstor-1.6.0
make rpm
rpm -ivh dist/python-linstor-1.6.0-1.noarch.rpm
cd ../
wget https://www.linbit.com/downloads/linstor/linstor-client-1.6.0.tar.gz
cp linstor-client-1.6.0.tar.gz linstor-client-1.6.0.orig.tar.gz
tar zxvf linstor-client-1.6.0.tar.gz
cd linstor-client-1.6.0
make rpm
rpm -ivh dist/linstor-client-1.6.0-1.noarch.rpm

далее созда­ём том и отдель­ную вольюм груп­пу для него:

pvcreate /dev/sdb
vgcreate vg1 /dev/sdb

далее на пер­вом сер­ве­ре статуем:
[root@linstor-1 ~]# systemctl start linstor-controller
[root@linstor-2 ~]# systemctl start linstor-controller
[root@linstor-3 ~]# systemctl start linstor-controller
[root@linstor-1 ~]# systemctl start linstor-satellite
[root@linstor-2 ~]# systemctl start linstor-satellite
[root@linstor-3 ~]# systemctl start linstor-satellite
[root@linstor-1 ~]# systemctl enable linstor-satellite
[root@linstor-1 ~]# systemctl enable linstor-controller
[root@linstor-2 ~]# systemctl enable linstor-satellite
[root@linstor-2 ~]# systemctl enable linstor-controller
[root@linstor-3 ~]# systemctl enable linstor-satellite
[root@linstor-3 ~]# systemctl enable linstor-controller

[root@linstor-1 ~]# linstor node create linstor-1 192.168.1.101
[root@linstor-1 ~]# linstor node list

[root@linstor-1 ~]# linstor node create linstor-2 192.168.1.102
[root@linstor-1 ~]# linstor node create linstor-3 192.168.1.103
[root@linstor-1 ~]# linstor node list

созда­ём пул из ранее добав­лен­ных в lvm груп­пу vg1 дисков:

 

[root@linstor-1 ~]# linstor storage-pool create lvm linstor-1 pool1 vg1
[root@linstor-1 ~]# linstor storage-pool create lvm linstor-2 pool1 vg1
[root@linstor-1 ~]# linstor storage-pool create lvm linstor-3 pool1 vg1

[root@linstor-1 ~]# linstor storage-pool list

 

Рас­смот­рим руч­ное развёртывание:

Опре­де­ля­ем объ­ём для vol1 раз­ме­ром в 1 гиг

[root@linstor-1 ~]# linstor resource-definition create vol1
[root@linstor-1 ~]# linstor volume-definition create vol1 1G

[root@linstor-1 ~]# linstor resource create linstor-1 vol1 --storage-pool pool1
[root@linstor-1 ~]# linstor resource create linstor-2 vol1 --storage-pool pool1
[root@linstor-1 ~]# linstor resource create linstor-3 vol1 --storage-pool pool1

как видим нарезалось:
[root@linstor-1 ~]# linstor storage-pool list

Рас­смот­рим авто­ма­ти­че­ское раз­вёр­ты­ва­ние на 2 гига:

[root@linstor-1 ~]# linstor resource-definition create vol2
[root@linstor-1 ~]# linstor volume-definition create vol2 2G
[root@linstor-1 ~]# linstor resource create vol2 --auto-place 3  (3 ука­зы­ва­ем чтоб на все три ноды разошлось)

[root@linstor-1 ~]# linstor storage-pool list

смот­рим по ресурсам:

[root@linstor-1 ~]# linstor resource list

смот­рим какие есть тома:

[root@linstor-1 ~]# linstor volume-definition list

 

Исполь­зо­ва­ние полу­чен­но­го тома.
полу­чен­ные тома мож­но исполь­зо­вать так же как и обыч­ный DRBD том:

[root@linstor-1 ~]# ls -l /dev/drbd100*
brw-rw---- 1 root disk 147, 1000 Feb 7 00:16 /dev/drbd1000
brw-rw---- 1 root disk 147, 1001 Feb 7 00:22 /dev/drbd1001

[root@linstor-1 ~]# drbdadm status

[root@linstor-1 ~]# mkfs.ext4 /dev/drbd1000
[root@linstor-1 ~]# mkdir /mnt/drbd
[root@linstor-1 ~]# mount /dev/drbd1000 /mnt/drbd
[root@linstor-1 ~]# touch /mnt/drbd/testfile
[root@linstor-1 ~]# df -h | grep drbd
/dev/drbd1000 980M 2.6M 910M 1% /mnt/drbd
[root@linstor-1 ~]# ll /mnt/drbd/testfile
-rw-r--r-- 1 root root 0 Feb 7 00:35 /mnt/drbd/testfile

про­ве­ря­ем статус:

отмон­ти­ру­ем на пер­вом сер­ве­ре и при­мон­ти­ру­ем на второй:

[root@linstor-1 ~]# umount /mnt/drbd/
[root@linstor-2 ~]# mount /dev/drbd1000 /mnt/
[root@linstor-2 ~]# ll /mnt/testfile
-rw-r--r-- 1 root root 0 Feb 7 00:35 /mnt/testfile

как видим это блоч­ное устрой­ство нор­маль­но под­мон­ти­ро­ва­лось на вто­рой сер­вер и тесто­вый файл на нём нор­маль­но лежит

выклю­чим одну из нод:

[root@linstor-3 ~]# poweroff

[root@linstor-1 ~]# linstor node list && linstor storage-pool list && linstor resource list && linstor volume-definition list

после вклю­че­ния всё норм.
про­ве­рим что будет если выкю­чить первую ноду отку­да всё запус­ка­лось и ста­ви­лось, но пред­ва­ри­тель­но гля­нем что отве­тит на коман­ды 2ая нода:

linstor node list && linstor storage-pool list && linstor resource list && linstor volume-definition list

и если опус­ка­е­те ноду отку­да ста­ви­лось то нихе­ра не меня­ет­ся - не посмот­ришь ника­ких данных

чтоб так рабо­та­ло надо с буб­ном потан­це­вать, что то похо­жее нашёл тут:
https://habr.com/ru/post/423101/
но не делал.