Thank you for reading this post, don't forget to subscribe!
https://www.linbit.com/downloads/tech-guides/linstor-sds-quickstart-centos7.pdf
Это полностью свободное хранилище в основе которого используются проверенные технологии: DRBD, LVM, ZFS
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
1 2 3 4 |
Component Protocol Port LINSTOR Controller TCP 3376, 3370 LINSTOR Satellite TCP 3366 DRBD TCP 7000-8000 |
1 |
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
1 |
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm |
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
но там нихуяшеньки не отвечают - печаль беда.
будем брать из архива:
и так приступим у нас есть 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
1 2 3 4 5 |
╭─────────────────────────────────────────────────────────────╮ ┊ Node ┊ NodeType ┊ Addresses ┊ State ┊ ╞═════════════════════════════════════════════════════════════╡ ┊ linstor-1 ┊ SATELLITE ┊ 192.168.1.101:3366 (PLAIN) ┊ Online ┊ ╰─────────────────────────────────────────────────────────────╯ |
[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/
но не делал.