
Vor nicht allzu langer Zeit prĂ€sentierten die Jungs von LINBIT ihre neue SDS-Lösung â Linstor. Es handelt sich um einen vollstĂ€ndig offenen Speicher, der auf bewĂ€hrten Technologien basiert: DRBD, LVM, ZFS. Linstor vereint Einfachheit und eine gut durchdachte Architektur, die es ermöglicht, StabilitĂ€t und beeindruckende Ergebnisse zu erzielen.
Heute möchte ich ein wenig ausfĂŒhrlicher darĂŒber sprechen und zeigen, wie einfach es ist, es mit OpenNebula unter Verwendung von linstor_un zu integrieren â einem neuen Treiber, den ich speziell fĂŒr diesen Zweck entwickelt habe.
Linstor in Kombination mit OpenNebula ermöglicht den Aufbau einer schnellen und zuverlÀssigen Cloud, die problemlos auf der eigenen Infrastruktur bereitgestellt werden kann.
Architektur von Linstor
Linstor ist selbst kein Dateisystem und kein Blockspeicher. Linstor ist ein Orchestrator, der eine Abstraktionsschicht bereitstellt, um die Erstellung von Volumes in LVM oder ZFS zu automatisieren und diese mit Hilfe von DRBD9 zu replizieren.
Stereotype aufbrechen
Aber halt, DRBD? â Warum sollte man es automatisieren und wie kann das ĂŒberhaupt funktionieren?
Erinnern wir uns an die Vergangenheit, als DRBD8 weit verbreitet war. Seine Standardnutzung sah vor, ein groĂes BlockgerĂ€t zu erstellen und es mit LVM in viele kleine StĂŒcke zu zerteilen. Eine Art mdadm RAID-1, aber mit Replikation ĂŒber das Netzwerk.
Dieser Ansatz hat seine Nachteile, und daher haben sich mit der EinfĂŒhrung von DRBD9 die Prinzipien des Speichersystems geĂ€ndert; jetzt wird fĂŒr jede virtuelle Maschine ein separates DRBD-GerĂ€t erstellt.
Der Ansatz mit unabhĂ€ngigen BlockgerĂ€ten ermöglicht eine bessere Raumausnutzung im Cluster und bietet auch eine Reihe zusĂ€tzlicher Möglichkeiten. Zum Beispiel kann fĂŒr jedes dieser GerĂ€te die Anzahl der Replikate, deren Standort und individuelle Einstellungen festgelegt werden. Sie lassen sich leicht erstellen/löschen, Snapshots machen, die GröĂe Ă€ndern, VerschlĂŒsselung aktivieren und vieles mehr. Es ist erwĂ€hnenswert, dass DRBD9 auch Quorum unterstĂŒtzt, um Split-Brain-Situationen zu vermeiden.
Ressourcen und Backends
Beim Erstellen eines neuen BlockgerÀts platziert Linstor die erforderliche Anzahl an Replikaten auf verschiedenen Knoten im Cluster. Jede dieser Replikate nennen wir DRBD-Ressource.
Ressourcen gibt es in zwei Typen:
- Datenressource â reprĂ€sentieren ein DRBD-GerĂ€t, das auf einem Knoten im LVM- oder ZFS-Pool platziert ist.
Derzeit gibt es UnterstĂŒtzung fĂŒr mehrere Backends, und ihre Anzahl wĂ€chst stĂ€ndig. Es gibt UnterstĂŒtzung fĂŒr LVM, ThinLVM und ZFS. Letztere beiden ermöglichen es, Snapshots zu erstellen und zu verwenden. - Diskless-Ressource â ist ein DRBD-GerĂ€t, das auf einem Knoten ohne Backend platziert ist, aber wie ein gewöhnliches BlockgerĂ€t behandelt werden kann; alle Lese-/SchreibvorgĂ€nge werden an die Datenressourcen umgeleitet. Der nĂ€chstgelegene Vergleich zu diskless-Ressourcen ist ein iSCSI LUN.
Jede DRBD-Ressource kann bis zu 8 Replikate haben, von denen nur eines standardmĂ€Ăig aktiv sein kann â PrimĂ€r, alle anderen werden als SekundĂ€r betrachtet, und ihre Nutzung ist nicht möglich, solange es mindestens einen PrimĂ€r gibt, das heiĂt, sie replizieren einfach Daten untereinander.
Wenn ein DRBD-GerÀt im System gemountet wird, wird es automatisch zu PrimÀr, sodass sogar eine Diskless-Ressource in der Terminologie von DRBD primÀr sein kann.
Warum wird Linstor benötigt?
Indem es alle ressourcenintensiven Aufgaben dem Kern anvertraut, ist Linstor im Wesentlichen eine gewöhnliche Java-Anwendung, die die Erstellung von DRBD-Ressourcen problemlos automatisiert.
Jede erstellte Ressource stellt einen unabhÀngigen DRBD-Cluster dar, der eigenstÀndig arbeitet, unabhÀngig vom Zustand des Control-Planes und anderer DRBD-Ressourcen.
Linstor besteht aus nur zwei Komponenten:
- Linstor-Controller â Der Hauptcontroller, der eine API zur Erstellung und Verwaltung von Ressourcen bereitstellt. Er kommuniziert auch mit den Satelliten, ĂŒberprĂŒft den verfĂŒgbaren Speicherplatz auf diesen und sendet Aufgaben zur Erstellung und Löschung neuer Ressourcen. Er lĂ€uft als Einzelinstanz und verwendet eine Datenbank, die intern (H2) oder extern (PostgreSQL, MySQL, MariaDB) sein kann.
- Linstor-Satellite â Wird auf allen Storage-Knoten installiert und stellt dem Controller Informationen ĂŒber den verfĂŒgbaren Speicherplatz zur VerfĂŒgung und fĂŒhrt Aufgaben aus, die vom Controller erhalten wurden, um neue Volumes und DRBD-GerĂ€te darauf zu erstellen und zu löschen.
Linstor arbeitet mit folgenden SchlĂŒsselbegriffen:
- Node â Der physische Server, auf dem DRBD-Ressourcen erstellt und verwendet werden.
- Storage Pool â Ein LVM- oder ZFS-Pool, der auf dem Knoten erstellt wurde, in dem die DRBD-Ressourcen untergebracht werden. Ein diskless-Pool ist ebenfalls möglich â dies ist ein Pool, in dem nur diskless-Ressourcen untergebracht werden.
- Ressourcendefinition â Definition der Ressource, im Grunde genommen ist dies ein Prototyp, der den Namen und all seine Eigenschaften beschreibt.
- Volumes Definition â Definition des Volumes. Jede Ressource kann aus mehreren Volumes bestehen, jedes Volume muss eine GröĂe haben.
- Ressource â Erstellt durch eine Instanz des BlockgerĂ€ts, jede Ressource muss auf einem bestimmten Knoten und in einem bestimmten Storage-Pool platziert werden.
Installation von Linstor
Ich empfehle, das System Ubuntu zu verwenden, da es dafĂŒr existiert :
add-apt-repository ppa:linbit/linbit-drbd9-stack
apt-get updateOder Debian, wo Linstor aus dem offiziellen Repository fĂŒr Proxmox installiert werden kann:
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 updateController
Hier ist alles einfach:
apt-get install linstor-controller linstor-client
systemctl enable linstor-controller
systemctl start linstor-controllerStorage-Knoten
Momentan wird im Linux-Kernel ein in-tree Kernel-Modul geliefert DRBD8, leider passt es uns nicht und wir mĂŒssen installieren DRBD9:
apt-get install drbd-dkmsDie Erfahrung zeigt, dass die meisten Schwierigkeiten genau dann auftreten, wenn das DRBD8-Modul in das System geladen ist, und nicht DRBD9. GlĂŒcklicherweise lĂ€sst sich dies leicht ĂŒberprĂŒfen, indem man ausfĂŒhrt:
modprobe drbd
cat /proc/drbdWenn Sie sehen version: 9 â dann ist alles in Ordnung, wenn version: 8 â dann ist etwas schiefgelaufen und Sie mĂŒssen zusĂ€tzliche Schritte unternehmen, um die Ursache herauszufinden.
Jetzt installieren wir linstor-satellite und drbd-utils:
apt-get install linstor-satellite drbd-utils
systemctl enable linstor-satellite
systemctl start linstor-satelliteCluster erstellen
Storage-Pools und Knoten
FĂŒr das Backend wĂ€hlen wir ThinLVM, da es am einfachsten ist und Snapshots unterstĂŒtzt.
Installieren Sie lvm2, falls Sie das noch nicht gemacht haben, und lassen Sie uns einen ThinLVM-Pool auf allen unseren Storage-Knoten erstellen:
sudo vgcreate drbdpool /dev/sdb
sudo lvcreate -L 800G -T drbdpool/thinpoolAlle weiteren Schritte können direkt am Controller durchgefĂŒhrt werden:
Lassen Sie uns unsere Knoten hinzufĂŒgen:
linstor node create node1 127.0.0.11
linstor node create node2 127.0.0.12
linstor node create node3 127.0.0.13Lassen Sie uns Storage-Pools erstellen:
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/thinpoolJetzt ĂŒberprĂŒfen wir die erstellten Pools:
linstor storage-pool listWenn alles richtig gemacht wurde, sollten wir etwas sehen wie:
+-------------------------------------------------------------------------------------------------------+ | 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-Ressourcen
Jetzt versuchen wir, unsere neue DRBD-Ressource zu erstellen:
linstor resource-definition create myres
linstor volume-definition create myres 1G
linstor resource create myres --auto-place 2ĂberprĂŒfen wir die erstellten Ressourcen:
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 | +------------------------------------------------------------------------------------------------------+
Ausgezeichnet! â wir sehen, dass die Ressource auf den ersten beiden Nodes erstellt wurde, wir können auch versuchen, eine diskless Ressource auf dem dritten zu erstellen:
linstor resource create --diskless node3 myresAuf den Nodes werden Sie dieses GerÀt immer als /dev/drbd1084 oder /dev/drbd/by-res/myres/0
So funktioniert Linstor, Sie können mehr Informationen aus .
Jetzt werde ich darĂŒber sprechen, wie man es mit OpenNebula integriert
OpenNebula-Konfiguration
Ich werde nicht zu sehr in den Prozess der OpenNebula-Konfiguration eintauchen, da alle Schritte detailliert beschrieben sind in , auf die ich Ihnen empfehle, sich zu beziehen, ich werde nur ĂŒber die Integration von OpenNebula mit Linstor sprechen.
linstor_un
Um dieses Problem zu lösen, habe ich einen eigenen Treiber geschrieben â , der momentan als Plugin verfĂŒgbar ist und separat installiert werden muss.
Die gesamte Installation erfolgt auf den Frontend-Nodes von OpenNebula und erfordert keine zusÀtzlichen Aktionen auf den Compute-Nodes.
Zuerst mĂŒssen wir sicherstellen, dass wir jq und linstor-client:
apt-get install jq linstor-clientTeam linstor node list sollte die Liste der Nodes anzeigen. Alle Compute-Nodes von OpenNebula mĂŒssen dem Linstor-Cluster hinzugefĂŒgt werden.
Laden wir das Plugin herunter und installieren wir es:
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-masterJetzt mĂŒssen wir ihn zur OpenNebula-Konfiguration hinzufĂŒgen. Dazu fĂŒhren wir die beschriebenen einfachen Schritte aus .
Nachdem wir das gemacht haben, starten wir OpenNebula neu:
systemctl restart opennebulaUnd fĂŒgen unsere Datenspeicher hinzu, den Systemspeicher:
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.confUnd das Image-Repository:
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- Parameter
AUTO_PLACEzeigt die Anzahl der Data-Replikate an, die fĂŒr jedes neue Image in OpenNebula erstellt werden. - Parameter
CLONE_MODEgibt an, wie die Images bei der Erstellung neuer virtueller Maschinen geklont werden sollen,Snapshotâ es wird ein Snapshot des Images erstellt und dieser Snapshot wird fĂŒr die virtuelle Maschine verwendet,copyâ es wird eine vollstĂ€ndige Kopie des Images fĂŒr jede virtuelle Maschine erstellt. - Im
BRIDGE_LISTEs wird empfohlen, alle Nodes anzugeben, die fĂŒr das Klonen der Images verwendet werden.
Die vollstĂ€ndige Liste der unterstĂŒtzten Parameter finden Sie in der Projekt.
Damit ist die Konfiguration abgeschlossen, jetzt können wir ein beliebiges Appliance aus dem offiziellen laden und daraus virtuelle Maschinen erstellen.
Link zum Projekt:
Quelle: habr.com
