Pamięć LINSTOR i jej integracja z OpenNebula

Pamięć LINSTOR i jej integracja z OpenNebula

Niedawno chłopaki z LINBIT zaprezentowali swoje nowe rozwiązanie SDS - Linstor. To całkowicie darmowy magazyn oparty na sprawdzonych technologiach: DRBD, LVM, ZFS. Linstor łączy w sobie prostotę i przemyślaną architekturę, co pozwala na osiągnięcie stabilności i całkiem imponujących wyników.

Dziś chciałbym omówić to nieco szerzej i pokazać jak łatwo można go zintegrować z OpenNebulą za pomocą linstor_un - nowego sterownika, który opracowałem specjalnie w tym celu.

Linstor w połączeniu z OpenNebula pozwala zbudować szybką i niezawodną chmurę, którą można łatwo wdrożyć na własnej infrastrukturze.

Architektura Linstora

Linstor nie jest ani systemem plików, ani pamięcią blokową per se. Linstor jest orkiestratorem zapewniającym warstwę abstrakcji, która pozwala zautomatyzować tworzenie woluminów w LVM lub ZFS i replikować je przy użyciu DRBD9.

Łamanie stereotypów

Ale czekaj, DRBD? — Po co to automatyzować i jak to w ogóle może działać?

Przypomnijmy sobie przeszłość, kiedy DRBD8 był bardzo popularny. Jego standardowe zastosowanie polegało na utworzeniu jednego dużego urządzenia blokowego i pocięciu go na wiele małych kawałków przy użyciu tego samego LVM. Coś w rodzaju mdadm RAID-1, ale z replikacją przez sieć.

Podejście to nie jest pozbawione wad, dlatego wraz z pojawieniem się DRBD9 zmieniły się zasady projektowania pamięci masowej i obecnie dla każdej maszyny wirtualnej tworzone jest osobne urządzenie DRBD.

Podejście z niezależnymi urządzeniami blokowymi pozwala na lepsze wykorzystanie przestrzeni w klastrze, a także dodaje szereg dodatkowych funkcji. Przykładowo dla każdego takiego urządzenia można określić liczbę replik, ich lokalizację oraz indywidualne ustawienia. Można je łatwo tworzyć/usuwać, robić migawki, zmieniać rozmiar, włączać szyfrowanie i wiele więcej. Warto dodać, że DRBD9 obsługuje także kworum, co pozwala uniknąć sytuacji rozszczepienia mózgu.

Zasoby i backendy

Tworząc nowe urządzenie blokowe, Linstor umieszcza wymaganą liczbę replik w różnych węzłach klastra. Każdą taką replikę nazwiemy zasobem DRBD.

Istnieją dwa rodzaje zasobów:

  • Zasób danych — to urządzenie DRBD zlokalizowane w węźle w puli LVM lub ZFS.
    W tej chwili obsługiwanych jest kilka backendów, a ich liczba stale rośnie. Obsługiwane są LVM, ThinLVM i ZFS. Dwie ostatnie pozwalają na tworzenie i używanie migawek.
  • Zasób bezdyskowy — jest urządzeniem DRBD umieszczonym na węźle bez backendu, ale pozwalającym na traktowanie go jak zwykłe urządzenie blokowe; wszystkie operacje odczytu/zapisu będą przekierowywane do zasobów danych. Najbliższym odpowiednikiem zasobów bezdyskowych jest iSCSI LUN.

Każdy zasób DRBD może mieć maksymalnie 8 replik, a domyślnie tylko jedna z nich może być aktywna - Pierwotny, wszyscy inni będą Wtórny a ich użycie będzie niemożliwe tak długo jak będzie przynajmniej jeden Podstawowy, czyli będą po prostu replikować dane między sobą.

Instalując w systemie urządzenie DRBD, staje się ono automatycznie Pierwotny, zatem nawet zasób bezdyskowy, w terminologii DRBD, może być pierwotny.

Dlaczego więc potrzebujesz Linstora?

Powierzając wszystkie zadania wymagające dużej ilości zasobów jądru, Linstor jest w zasadzie zwykłą aplikacją Java, która pozwala łatwo zautomatyzować tworzenie zasobów DRBD.
Co więcej, każdy stworzony przez niego zasób będzie niezależnym klastrem DRBD, który działa niezależnie, niezależnie od stanu płaszczyzny sterującej i innych zasobów DRBD.

Linstor składa się tylko z dwóch komponentów:

  • Kontroler Linstor - Główny kontroler, który udostępnia API do tworzenia zasobów i zarządzania nimi. Komunikuje się także z satelitami, sprawdzając wolne na nich miejsce oraz wysyła zadania tworzenia i usuwania nowych zasobów. Działa w pojedynczej instancji i korzysta z bazy danych, która może być wewnętrzna (H2) lub zewnętrzna (PostgreSQL, MySQL, MariaDB)
  • Linstor-satelita — Instalowany na wszystkich węzłach magazynowania i dostarcza kontrolerowi informacji o wolnej przestrzeni, a także wykonuje zadania otrzymane od kontrolera polegające na tworzeniu i usuwaniu na nich nowych woluminów i urządzeń DRBD.

Linstor działa w oparciu o następujące kluczowe koncepcje:

  • Node — serwer fizyczny, na którym będą tworzone i wykorzystywane zasoby DRBD.
  • Pula pamięci — Pula LVM lub ZFS utworzona na węźle, w którym będą zlokalizowane zasoby DRBD. Możliwa jest także pula bezdyskowa – jest to pula, w której będą znajdować się wyłącznie zasoby bezdyskowe.
  • Definicja zasobu — Definicja zasobu jest zasadniczo prototypem, który opisuje nazwę i wszystkie jego właściwości.
  • Definicja objętości — Definicja objętości. Każdy zasób może składać się z wielu woluminów, każdy wolumin musi mieć określony rozmiar.
  • Zasób — Utworzona instancja urządzenia blokowego, każdy zasób musi zostać umieszczony w określonym węźle i w jakiejś puli pamięci.

Instalacja Linstora

Polecam używać Ubuntu jako systemu, ponieważ... istnieje dla niej gotowy PPA:

add-apt-repository ppa:linbit/linbit-drbd9-stack
apt-get update

Lub Debian, gdzie Linstor można zainstalować z oficjalnego repozytorium 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

kontroler

Tutaj wszystko jest proste:

apt-get install linstor-controller linstor-client
systemctl enable linstor-controller
systemctl start linstor-controller

Węzły magazynujące

Jądro Linuksa jest obecnie dostarczane z modułem jądra znajdującym się w drzewie DRBD8, niestety nam to nie odpowiada i musimy zamontować DRBD9:

apt-get install drbd-dkms

Jak pokazuje praktyka, najwięcej trudności pojawia się właśnie dlatego, że do systemu załadowany jest moduł DRBD8, a nie DRBD9. Na szczęście można to łatwo sprawdzić, uruchamiając:

modprobe drbd
cat /proc/drbd

Jeśli zobaczysz Wersja: 9 - to znaczy, że wszystko jest w porządku, jeśli Wersja: 8 - oznacza to, że coś poszło nie tak i należy podjąć dodatkowe kroki, aby znaleźć przyczynę.

Teraz zainstalujmy satelita linstor и drbd-utils:

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

Utwórz klaster

Pule i węzły pamięci masowej

Jako backend przyjmiemy CienkiLVM, ponieważ jest najprostszy i obsługuje migawki.
Zestaw lvm2, jeśli jeszcze tego nie zrobiłeś, utwórzmy pulę ThinLVM na wszystkich naszych węzłach magazynowania:

sudo vgcreate drbdpool /dev/sdb
sudo lvcreate -L 800G -T drbdpool/thinpool

Wszystkie dalsze działania można wykonać bezpośrednio na kontrolerze:

Dodajmy nasze węzły:

linstor node create node1 127.0.0.11
linstor node create node2 127.0.0.12
linstor node create node3 127.0.0.13

Utwórzmy pule pamięci:

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

Sprawdźmy teraz utworzone pule:

linstor storage-pool list

Jeśli wszystko zostało wykonane poprawnie, powinniśmy zobaczyć coś takiego:

+------------------------------------------------- -------------------------------------------------- ----+ | Pula pamięci | Węzeł | Kierowca | Nazwa puli | Wolna pojemność | Całkowita pojemność | Obsługuje migawki | |------------------------------------------------ - -------------------------------------------------- - ---| | dane | węzeł1 | LVM_THIN | drbdpool/thinpool | 64 GiB | 64 GiB | prawda | | dane | węzeł2 | LVM_THIN | drbdpool/thinpool | 64 GiB | 64 GiB | prawda | | dane | węzeł3 | LVM_THIN | drbdpool/thinpool | 64 GiB | 64 GiB | prawda | +------------------------------------------------- -------------------------------------------------- ----+

Zasoby DRBD

Spróbujmy teraz stworzyć nasz nowy zasób DRBD:

linstor resource-definition create myres
linstor volume-definition create myres 1G
linstor resource create myres --auto-place 2

Sprawdźmy utworzone zasoby:

linstor resource list 

+------------------------------------------------- -------------------------------------------------- ---+ | Węzeł | Zasób | Pula pamięci | TomNr | Drobny nr | Nazwa urządzenia | Przydzielone | W użyciu | stan | |------------------------------------------------ - -------------------------------------------------- - --| | węzeł1 | myres | dane | 0 | 1084 | /dev/drbd1084 | 52 KiB | nieużywane | Aktualne | | węzeł2 | myres | dane | 0 | 1084 | /dev/drbd1084 | 52 KiB | nieużywane | Aktualne | +------------------------------------------------- -------------------------------------------------- ---+

Świetnie! — widzimy, że zasób został utworzony na dwóch pierwszych węzłach, możemy też spróbować utworzyć zasób bezdyskowy na trzecim:

linstor resource create --diskless node3 myres

Na węzłach zawsze znajdziesz to urządzenie jako /dev/drbd1084 lub /dev/drbd/by-res/myres/0

Tak działa Linstor, możesz uzyskać więcej informacji oficjalna dokumentacja.

Teraz powiem Ci jak zintegrować go z OpenNebulą

Konfigurowanie OpenNebuli

Nie będę zagłębiał się w proces konfiguracji OpenNebula, ponieważ... wszystkie kroki opisano szczegółowo w oficjalna dokumentacja, z którym polecam się skontaktować, opowiem jedynie o integracji OpenNebula z Linstor.

linstor_un

Aby rozwiązać ten problem, napisałem własny sterownik - linstor_un, jest obecnie dostępny jako wtyczka i należy go zainstalować osobno.

Cała instalacja odbywa się na węzłach frontendowych OpenNebula i nie wymaga dodatkowych działań na węzłach obliczeniowych.

Przede wszystkim musimy się upewnić, że tak jest jq и klient linstor:

apt-get install jq linstor-client

Zespół linstor node list powinien wyświetlić listę węzłów. Wszystkie węzły obliczeniowe OpenNebula muszą zostać dodane do klastra Linstor.

Pobierz i zainstaluj wtyczkę:

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

Teraz musimy dodać go do konfiguracji OpenNebula, w tym celu wykonujemy opisane proste kroki tutaj.

Następnie uruchom ponownie OpenNebulę:

systemctl restart opennebula

I dodaj nasze magazyny danych, system:

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

Oraz sklep z obrazami:

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

  • Parametr AUTO_PLACE wyświetla liczbę replik danych, które zostaną utworzone dla każdego nowego obrazu w OpenNebula.
  • Parametr CLONE_MODE dokładnie wskazuje, w jaki sposób obrazy będą klonowane podczas tworzenia nowych maszyn wirtualnych, snapshot — utworzy migawkę obrazu i wdroży maszynę wirtualną z migawki, copy — utworzy pełną kopię obrazu dla każdej maszyny wirtualnej.
  • В BRIDGE_LIST Zaleca się określenie wszystkich węzłów, które będą wykorzystywane do wykonywania operacji klonowania obrazu.

Aby zapoznać się z pełną listą obsługiwanych parametrów, zobacz README projekt.

To kończy konfigurację, teraz możesz pobrać jakieś urządzenie z oficjalnej strony Rynek OpenNebula i tworzyć z niego maszyny wirtualne.

Link do projektu:
https://github.com/OpenNebula/addon-linstor_un

Źródło: www.habr.com

Dodaj komentarz