Разворачиваем хранилище LINSTOR для Proxmox

https://medium.com/@kvapss/deploying-linstor-with-proxmox-91c746b4035d
  • Перевод
  • Tutorial

image


Недавно LINBIT выпустили свое новое решение для оркестрации и управления множеством DRBD-массивов.


К примеру у вас может быть несколько нод и у каждой будет собственный LVM или ZFS пул в котором LINSTOR будет автоматически создавать новые тома и реплицировать их между нодами используя DRBD-протокол.


LINSTOR поддерживает thin-provisioning, снапшоты и много других интересных штук.
Это решение хорошо подойдет для виртуальных машин и контейнеров.


LINSTOR Satellites


Полагаю что у вас уже есть Proxmox кластер, у меня есть три ноды pve1, pve2 и pve3.


Так что первый шаг — это установить drbd-utils и собрать модуль ядра на каждой ноде.


Добавим репозиторий linstor и уставновим kernel-headers, а также все необходимые пакеты из него:


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

apt-get update
apt-get -y install pve-headers
apt-get -y install drbd-dkms drbdtop

После установки давайте проверим вашу версию модуля ядра:


modproble drbd
cat /proc/drbd

Если вы видите 8 версию, значит что-то пошло не так и у вас загрузился in-tree модуль ядра, проверьте dkms status что бы узнать более подробно о сборке непосредственно dkms-модуля.
Для LINSTOR вы должны использовать DRBD 9 версии.


Далее на каждой ноде установим пакеты linstor-proxmox и linstor-satellite:


apt-get -y install linstor-proxmox linstor-satellite
systemctl start linstor-satellite.service
systemctl enable linstor-satellite.service

LINSTOR Controller


Мы будем разворачивать контроллер внутри LXC-контейнера.


Скачаем debian-шаблон:


wget http://download.proxmox.com/images/system/debian-9.0-standard_9.3-1_amd64.tar.gz -P /var/lib/vz/template/cache/

Теперь создадим контейнер под контроллер:


pct create 100 local:vztmpl/debian-9.0-standard_9.3-1_amd64.tar.gz \
  --hostname=linstor-controller \
  --net0=name=eth0,bridge=vmbr0,gw=10.1.0.1,ip=10.1.0.123/16

Запустим контейнер и войдем в него:


pct start 100
pct exec 100 bash

Установим обновления:


apt-get update 
apt-get -y upgrade

Добавим репозиторий linstor и установим linstor-controller и linstor-client:


wget -O- https://packages.linbit.com/package-signing-pubkey.asc | apt-key add - 
echo "deb http://packages.linbit.com/proxmox/ proxmox-5 drbd-9.0" \
  > /etc/apt/sources.list.d/linbit.list
apt-get update && apt-get install -y linstor-controller linstor-client
systemctl start linstor-controller.service
systemctl enable linstor-controller.service

Linstor требует настроенной локали. Настроим locale:


sed -i '/en_US.UTF-8 UTF-8/ s/^# //' /etc/locale.gen
locale-gen

Давайте сразу же настроим временную зону:


dpkg-reconfigure tzdata

Конфигурирование хранилища


Создадим ноды:


linstor node create pve1 10.1.0.11
linstor node create pve2 10.1.0.12
linstor node create pve3 10.1.0.13

Для каждой ноды опишем дополнительный интерфейс который будет использоваться для DRBD-репликации:


linstor node interface create pve1 data 10.2.0.11
linstor node interface create pve2 data 10.2.0.12
linstor node interface create pve3 data 10.2.0.13

Пример вывода команды linstor node list:


╭──────────────────────────────────────────────────────────────╮
┊ Node ┊ NodeType  ┊ Addresses                        ┊ State  ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡
┊ pve1 ┊ SATELLITE ┊ 10.0.1.11,10.0.2.11:3366 (PLAIN) ┊ Online ┊
┊ pve2 ┊ SATELLITE ┊ 10.0.1.12,10.0.2.12:3366 (PLAIN) ┊ Online ┊
┊ pve3 ┊ SATELLITE ┊ 10.0.1.13,10.0.2.13:3366 (PLAIN) ┊ Online ┊
╰──────────────────────────────────────────────────────────────╯

Создадим пулы:


На каждой ноде вы должны подготовить lvm thin-pool для drbd:


lvcreate -L 800G --thinpool drbdpool pve

Теперь вы можете добавить их в linstor:


linstor storage-pool create lvmthin pve1 drbdpool pve/drbdpool
linstor storage-pool create lvmthin pve2 drbdpool pve/drbdpool
linstor storage-pool create lvmthin pve3 drbdpool pve/drbdpool

Настроим пулы на использование data интерфейса:


linstor storage-pool set-property pve1 drbdpool PrefNic data
linstor storage-pool set-property pve2 drbdpool PrefNic data
linstor storage-pool set-property pve3 drbdpool PrefNic data

Пример вывода команды linstor storage-pool list:


╭───────────────────────────────────────────────────────────────────────────────────────────
┊ StoragePool ┊ Node ┊ Driver        ┊ PoolName     ┊ FreeCapacity ┊ TotalCapacity ┊ Support
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
┊ drbdpool    ┊ pve1 ┊ LvmThinDriver ┊ hv1/drbdpool ┊      800 GiB ┊       800 GiB ┊ true              
┊ drbdpool    ┊ pve1 ┊ LvmThinDriver ┊ hv1/drbdpool ┊      800 GiB ┊       800 GiB ┊ true              
┊ drbdpool    ┊ pve3 ┊ LvmThinDriver ┊ hv3/drbdpool ┊      800 GiB ┊       800 GiB ┊ true              
╰───────────────────────────────────────────────────────────────────────────────────────────

Теперь мы можем добавить наше новое хранилище в конфиг Proxmox:


cat >> /etc/pve/storage.cfg <<EOF

drbd: drbdpool
        content rootdir,images
        controller 10.1.0.123
        controllervm 100
        redundancy 3
EOF

Настройка HA для контроллера


Теперь мы перенесем наш linstor container на linstor storage.


Для начала нам нужно создать виртуальный диск для него:


pct exec 100 bash
linstor resource-definition create vm-100-disk-0
linstor volume-definition create vm-100-disk-0 4G
linstor resource create vm-100-disk-0 --auto-place 3 -s pve

Пример вывода команды linstor resource list:


╭──────────────────────────────────────────╮
┊ ResourceName    ┊ Node ┊ Port ┊    State ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡
┊ vm-100-disk-0   ┊ pve1 ┊ 7000 ┊ UpToDate ┊
┊ vm-100-disk-0   ┊ pve2 ┊ 7000 ┊ UpToDate ┊
┊ vm-100-disk-0   ┊ pve3 ┊ 7000 ┊ UpToDate ┊
╰──────────────────────────────────────────╯

По умолчанию linstor-satellite удаляет конфиги всех ресурсов на момент запуска сервиса, затем он ожидает новую кофигурацию от linstor-controller, но если мы будем держать linstor-controller в том же месте что и данные, мы должны сделать исключение для его ресурса, добавив опцию --keep-res=vm-100 для linstor-satellite на всех нодах:


echo -e "[Service]\nExecStart=\nExecStart=/usr/share/linstor-server/bin/Satellite --logs=/var/log/linstor-satellite --config-directory=/etc/linstor --keep-res=vm-100" | SYSTEMD_EDITOR=tee systemctl edit linstor-satellite.service

Это действие должно предотвратить удаление ресурса vm-100-disk-0 при каждом запуске.


Теперь мы остановим linstor-controller контейнер и перенесем все данные с локального диска на drbd-диск.


pct shutdown 100
dd if=/var/lib/vz/images/100/vm-100-disk-0.raw of=/dev/drbd/by-res/vm-100-disk-0/0 bs=8M status=progress
e2fsck -f /dev/drbd/by-res/vm-100-disk-0/0 
resize2fs /dev/drbd/by-res/vm-100-disk-0/0 

Обновим конфиг контейнера:


sed -i '/^rootfs:/d' /etc/pve/lxc/100.conf
echo 'rootfs: drbdpool:vm-100-disk-0,size=4G' >> /etc/pve/lxc/100.conf

Запустим контейнер, и если все ок, удалим старый диск:


pct start 100
rm -f /var/lib/vz/images/100/vm-100-disk-0.raw

Теперь нам нужно только добавить наш контейнер в proxmox ha-manager:


ha-manager add ct:100 --max_relocate=3 --max_restart=3

PROFIT


Производительность и тюнинг


На данный момент для изменения глобальных параметров контроллера вам понадобится отключить аутентификацию на контроллере:



Чтобы автоматически разрешать ситуации со split-brain, добавьте следующие опции для контроллера:


linstor controller drbd-options \
  --after-sb-0pri=discard-zero-changes \
  --after-sb-1pri=discard-secondary \
  --after-sb-2pri=disconnect

Для моей 10G сети, я нашел следующие настройки наиболее оптимальными для быстрой синхронизации:


linstor controller drbd-options \
  --max-buffers=36864 \
  --rcvbuf-size=2097152 \
  --sndbuf-size=1048576

linstor controller drbd-options \
  --c-fill-target=10240 \
  --c-max-rate=737280 \
  --c-min-rate=20480 \
  --c-plan-ahead=10
Поделиться публикацией
Комментарии 11
    0
    Спасибо за статью.

    Проясните плиз, LINSTOR это некий менеджер над DRBD, который создает файлики .res и запускает консольные команды типа drbdadm?
    И тогда можно использовать все старые инструменты из drbd-utils для мониторинга итд.

    Или он делает что-то настолько свое, что стандартные инструменты drbd нельзя применять совместно с ним?
      0
      Проясните плиз, LINSTOR это некий менеджер над DRBD, который создает файлики .res и запускает консольные команды типа drbdadm?

      Именно так, стандартные инструменты по прежнему доступны и иногда приходится к ним прибегать (чаще для диагностики)

      0
      apt-get -y install linstor-proxmox
      systemctl start linstor-satellite.service


      А потом получаем «Failed to start linstor-satellite.service: Unit linstor-satellite.service not found.» Уууупс.
        0
        благодарю, исправил
        0
        А вот ещё прикол, с которым столкнулся на Ubuntu 16.04: при попытке полнять контроллер и прицепить к нему сателиты, валится ошибка вида "/tmp/linstor-common.4576993503951869782.tmp -> /var/lib/linstor.d/linstor_common.conf: Invalid cross-device link". После этого ноды хоть и рабочие, но пулы не создаются. Единственный выход — создать вручную файл /var/lib/linstor.d/linstor_common.conf вида
        # This file was generated by linstor(0.6.3), do not edit manually.

        common
        {
        }


        Там много всего такого весёлого встречается.
          0

          Напишите баг репорт, ребята из LINBIT все очень быстро исправляют.

          0
          на этапе «Конфигурирование хранилища»

          root@host:~# linstor node list
          Traceback (most recent call last):
          File "/usr/bin/linstor", line 24, in linstor_client_main.main()
          File "/usr/lib/python2.7/dist-packages/linstor_client_main.py", line 555, in main
          LinStorCLI().run()
          File "/usr/lib/python2.7/dist-packages/linstor_client_main.py", line 521, in run
          sys.exit(self.parse_and_execute(sys.argv[1:]))
          File "/usr/lib/python2.7/dist-packages/linstor_client_main.py", line 255, in parse_and_execute
          self._linstorapi.connect()
          File "/usr/lib/python2.7/dist-packages/linstor/linstorapi.py", line 1210, in connect
          self._linstor_client.connect(self._ctrl_host)
          File "/usr/lib/python2.7/dist-packages/linstor/linstorapi.py", line 556, in connect
          self._read_api_version_blocking()
          File "/usr/lib/python2.7/dist-packages/linstor/linstorapi.py", line 511, in _read_api_version_blocking
          assert hdr.msg_content == apiconsts.API_VERSION, «Unexpected message for API_VERSION»
          AssertionError: Unexpected message for API_VERSION
            0
            Ошибка исчезает, если вместо:
            apt-get update && apt-get install -y linstor-server linstor-client

            сделать:
            apt-get update && apt-get install -y linstor-controller linstor-client
              0
              Спасибо, поправил

              linstor-server — это старый пакет, позже он был раздроблен на linstor-satellite и linstor-controller
            0
            Как-то очень скудно о самом проекте, не сказано почему может захотеться использовать linstor, а не тот же ceph, например
              0
              Ну, это tutorial.
              Про drbd9 и немного про linstor я рассказывал в первой статье про drbd9.
              habr.com/post/417473

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое