Vertrauenswürdiger Speicher mit DRBD9 und Proxmox (Teil 2: iSCSI + LVM)

Bild


In einem früheren Artikel habe ich die Möglichkeit untersucht, einen fehlertoleranten NFS-Server mit DRBD und Proxmox zu erstellen. Es hat sich als ziemlich gut herausgestellt, aber wir werden uns nicht auf unseren Lorbeeren ausruhen und jetzt werden wir versuchen, "alle Säfte aus unserem Lager herauszupressen".


In diesem Artikel werde ich Ihnen erklären, wie Sie auf diese Weise ein fehlertolerantes iSCSI-Ziel erstellen, das wir mit LVM in kleine Stücke schneiden und für virtuelle Maschinen verwenden.


Dieser Ansatz reduziert die Last und erhöht die Geschwindigkeit des Zugriffs auf Daten um ein Vielfaches. Dies ist besonders dann von Vorteil, wenn kein wettbewerbsfähiger Zugriff auf Daten erforderlich ist, z. B. wenn Sie Speicher für virtuelle Maschinen organisieren müssen.


Ein paar Worte zu DRBD


DRBD ist eine ziemlich einfache und ausgereifte Lösung. Der Code der achten Version wird als Teil des Linux-Kernels übernommen. Tatsächlich handelt es sich um einen Netzwerkspiegel RAID1. In der neunten Version wurde die Unterstützung für Quorum und Replikation mit mehr als zwei Knoten eingeführt.


Tatsächlich können Sie Blockgeräte auf mehreren physischen Knoten in einem gemeinsamen Netzwerk kombinieren.


Mit DRBD können Sie sehr interessante Konfigurationen erzielen. Heute werden wir über iSCSI und LVM sprechen.


Sie können mehr darüber erfahren, indem Sie meinen vorherigen Artikel lesen, in dem ich diese Lösung ausführlich beschrieben habe.


Ein paar Worte zu iSCSI


iSCSI ist ein Block Device Delivery-Protokoll über ein Netzwerk.


Im Gegensatz zu NBD unterstützt es die Autorisierung, behebt Netzwerkfehler problemlos und unterstützt viele andere nützliche Funktionen. Vor allem zeigt es eine sehr gute Leistung.


Es gibt eine große Anzahl von Implementierungen, einige davon sind auch im Kernel enthalten und erfordern keine besonderen Schwierigkeiten bei der Konfiguration und Verbindung.


Ein paar Worte zu LVM


Es ist erwähnenswert, dass LINBIT eine eigene Lösung für Proxmox hat. Es sollte sofort funktionieren und ein ähnliches Ergebnis erzielen. In diesem Artikel möchte ich mich jedoch nicht nur auf Proxmox konzentrieren und eine universellere Lösung beschreiben, die sowohl für Proxmox als auch für Proxmox geeignet ist Alles andere, in diesem Beispiel, wird proxmox nur als Mittel zur Container-Orchestrierung verwendet. Sie können es sogar durch eine andere Lösung ersetzen, z. B. Container mit einem Ziel in Kubernetes starten.


Speziell für Proxmox funktioniert es gut mit gemeinsam genutzter LUN und LVM, wobei nur die eigenen Standardtreiber verwendet werden.


Zu den Vorteilen von LVM gehört die Tatsache, dass seine Verwendung nicht revolutionär neu und unzureichend eingefahren ist, sondern im Gegenteil eine Trockenstabilität aufweist, die normalerweise für die Lagerung erforderlich ist. Es ist erwähnenswert, dass LVM in anderen Umgebungen, beispielsweise in OpenNebula oder Kubernetes, sehr aktiv verwendet wird und dort recht gut unterstützt wird.


Auf diese Weise erhalten Sie universellen Speicher, der in verschiedenen Systemen (nicht nur in Proxmox) verwendet werden kann und nur vorgefertigte Treiber verwendet, ohne dass eine besondere Änderung mit einer Datei erforderlich ist.


Leider müssen Sie bei der Auswahl einer Speicherlösung immer einige Kompromisse eingehen. Diese Lösung bietet Ihnen also nicht die gleiche Flexibilität wie beispielsweise Ceph.
Die Größe der virtuellen Festplatte ist durch die Größe der LVM-Gruppe begrenzt, und der für eine bestimmte virtuelle Festplatte markierte Bereich wird notwendigerweise neu zugewiesen. Dies verbessert die Geschwindigkeit des Zugriffs auf Daten erheblich, ermöglicht jedoch keine Thin-Provisioning-Funktion (wenn die virtuelle Festplatte weniger Speicherplatz beansprucht als sie tatsächlich ist). Es ist erwähnenswert, dass die Leistung von LVM bei der Verwendung von Schnappschüssen stark nachlässt und daher die Möglichkeit ihrer freien Verwendung häufig ausgeschlossen ist.


Ja, LVM unterstützt Thin-Provision-Pools, die diesen Nachteil nicht aufweisen. Leider ist ihre Verwendung nur im Kontext eines Knotens möglich, und es gibt keine Möglichkeit, einen Thin-Provision-Pool für mehrere Knoten im Cluster freizugeben.


Trotz dieser Mängel erlaubt LVM aufgrund seiner Einfachheit den Wettbewerbern immer noch nicht, es zu umgehen und es vollständig vom Schlachtfeld zu verdrängen.


Mit einem relativ geringen Overhead bietet LVM immer noch eine sehr schnelle, stabile und ziemlich flexible Lösung.


Allgemeines Schema


  • Wir haben drei Knoten
  • Jeder Knoten verfügt über ein verteiltes drbd-Gerät .
  • Über dem drbd-Gerät wird ein LXC-Container mit einem iSCSI-Ziel gestartet.
  • Das Ziel ist mit allen drei Knoten verbunden.
  • Auf dem verbundenen Ziel wurde eine LVM-Gruppe erstellt.
  • Bei Bedarf kann der LXC-Container zusammen mit dem iSCSI-Ziel auf einen anderen Knoten verschoben werden

Anpassung


Wir haben die Idee jetzt herausgefunden und fahren mit der Implementierung fort.


Standardmäßig wird die achte Version von drbd mit dem Linux-Kernel geliefert. Leider passt sie nicht zu uns und wir müssen die neunte Version des Moduls installieren.


Verbinden Sie das LINBIT-Repository und installieren Sie alles, was Sie benötigen:


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 drbd-dkms drbd-utils drbdtop 

  • pve-headers - Kernel-Header, die zum Erstellen des Moduls benötigt werden
  • drbd-dkms - Kernelmodul im DKMS-Format
  • drbd-utils - grundlegende DRBD-Verwaltungsdienstprogramme
  • drbdtop ist ein interaktives Tool wie top nur für DRBD

Überprüfen Sie nach der Installation des Moduls, ob alles in Ordnung ist:


 # modprobe drbd # cat /proc/drbd version: 9.0.14-1 (api:2/proto:86-113) 

Wenn Sie die achte Version in der Ausgabe des Befehls sehen, ist ein Fehler aufgetreten und das Kernelmodul im Baum wird geladen. Überprüfen Sie den dkms status um herauszufinden, was der Grund ist.


Auf jedem Knoten, den wir haben, wird dasselbe drbd-Gerät auf regulären Partitionen ausgeführt. Zuerst müssen wir diesen Abschnitt für drbd auf jedem Knoten vorbereiten.


Eine solche Partition kann ein beliebiges Blockgerät sein , es kann sich um lvm, zvol, eine Festplattenpartition oder die gesamte Festplatte handeln. In diesem Artikel werde ich eine separate NVME-Festplatte mit einer Partition unter drbd verwenden: /dev/nvme1n1p1


Es ist erwähnenswert, dass sich Gerätenamen manchmal ändern. Es ist daher besser, sofort die Gewohnheit zu verwenden, einen konstanten Symlink zum Gerät zu verwenden.


Sie können einen solchen Symlink für /dev/nvme1n1p1 :


 # find /dev/disk/ -lname '*/nvme1n1p1' /dev/disk/by-partuuid/847b9713-8c00-48a1-8dff-f84c328b9da2 /dev/disk/by-path/pci-0000:0e:00.0-nvme-1-part1 /dev/disk/by-id/nvme-eui.0000000001000000e4d25c33da9f4d01-part1 /dev/disk/by-id/nvme-INTEL_SSDPEKKA010T7_BTPY703505FB1P0H-part1 

Wir beschreiben unsere Ressource auf allen drei Knoten:


 # cat /etc/drbd.d/tgt1.res resource tgt1 { meta-disk internal; device /dev/drbd100; protocol C; net { after-sb-0pri discard-zero-changes; after-sb-1pri discard-secondary; after-sb-2pri disconnect; } on pve1 { address 192.168.2.11:7000; disk /dev/disk/by-partuuid/95e7eabb-436e-4585-94ea-961ceac936f7; node-id 0; } on pve2 { address 192.168.2.12:7000; disk /dev/disk/by-partuuid/aa7490c0-fe1a-4b1f-ba3f-0ddee07dfee3; node-id 1; } on pve3 { address 192.168.2.13:7000; disk /dev/disk/by-partuuid/847b9713-8c00-48a1-8dff-f84c328b9da2; node-id 2; } connection-mesh { hosts pve1 pve2 pve3; } } 

Es wird empfohlen, ein separates Netzwerk für die drbd-Synchronisation zu verwenden.


Erstellen Sie nun die Metadaten für drbd und führen Sie sie aus:


 # drbdadm create-md tgt1 initializing activity log initializing bitmap (320 KB) to all zero Writing meta data... New drbd meta data block successfully created. success # drbdadm up tgt1 

Wiederholen Sie diese Schritte auf allen drei Knoten und überprüfen Sie den Status:


 # drbdadm status tgt1 role:Secondary disk:Inconsistent pve2 role:Secondary peer-disk:Inconsistent pve3 role:Secondary peer-disk:Inconsistent 

Jetzt befindet sich unsere inkonsistente Festplatte auf allen drei Knoten. Dies liegt daran, dass drbd nicht weiß, welche Festplatte als Original verwendet werden soll. Wir müssen einen von ihnen als primär markieren, damit sein Status mit den anderen Knoten synchronisiert wird:


 drbdadm primary --force tgt1 drbdadm secondary tgt1 

Unmittelbar danach beginnt die Synchronisation :


 # drbdadm status tgt1 role:Secondary disk:UpToDate pve2 role:Secondary replication:SyncSource peer-disk:Inconsistent done:26.66 pve3 role:Secondary replication:SyncSource peer-disk:Inconsistent done:14.20 

Wir müssen nicht warten, bis es fertig ist, und wir können parallel weitere Schritte ausführen. Sie können auf jedem Knoten ausgeführt werden , unabhängig vom aktuellen Status der lokalen Festplatte in DRBD. Alle Anforderungen werden automatisch mit dem Status UpToDate an das Gerät umgeleitet .


Vergessen Sie nicht, die automatische Ausführung des drbd-Dienstes auf den Knoten zu aktivieren:


 systemctl enable drbd.service 

Konfigurieren eines LXC-Containers


Wir werden den Konfigurationsteil des Proxmox-Clusters mit drei Knoten weglassen. Dieser Teil ist im offiziellen Wiki gut beschrieben


Wie ich bereits sagte, funktioniert unser iSCSI-Ziel in einem LXC-Container . Wir werden den Container auf dem Gerät /dev/drbd100 , das wir gerade erstellt haben.


Zuerst müssen wir ein Dateisystem darauf erstellen:


 mkfs -t ext4 -O mmp -E mmp_update_interval=5 /dev/drbd100 

Proxmox enthält standardmäßig einen Multimount-Schutz auf Dateisystemebene. Im Prinzip können wir darauf verzichten, da DRBD hat standardmäßig einen eigenen Schutz. Es verbietet lediglich die zweite Primärdatenbank für das Gerät, aber Vorsicht schadet uns nicht.


Laden Sie jetzt die Ubuntu-Vorlage herunter:


 # wget http://download.proxmox.com/images/system/ubuntu-16.04-standard_16.04-1_amd64.tar.gz -P /var/lib/vz/template/cache/ 

Und erstellen Sie unseren Container daraus:


 pct create 101 local:vztmpl/ubuntu-16.04-standard_16.04-1_amd64.tar.gz \ --hostname=tgt1 \ --net0=name=eth0,bridge=vmbr0,gw=192.168.1.1,ip=192.168.1.11/24 \ --rootfs=volume=/dev/drbd100,shared=1 

In diesem Befehl geben wir an, dass sich das /dev/drbd100 unseres Containers auf dem Gerät /dev/drbd100 und fügen den Parameter shared=1 , um die Migration des Containers zwischen Knoten zu ermöglichen.


Wenn etwas schief gelaufen ist, können Sie es jederzeit über die Proxmox- Oberfläche oder in der Containerkonfiguration /etc/pve/lxc/101.conf


Proxmox entpackt die Vorlage und bereitet das Container- Root-System für uns vor. Danach können wir unseren Container starten:


 pct start 101 

Konfigurieren eines iSCSI-Ziels.


Aus der ganzen Reihe von Zielen habe ich istgt ausgewählt , da es die höchste Leistung aufweist und im Benutzerbereich funktioniert.


Melden wir uns jetzt in unserem Container an:


 pct exec 101 bash 

Installieren Sie Updates und istgt :


 apt-get update apt-get -y upgrade apt-get -y install istgt 

Erstellen Sie eine Datei, die wir über das Netzwerk weitergeben:


 mkdir -p /data fallocate -l 740G /data/target1.img 

Jetzt müssen wir eine Konfiguration für istgt /etc/istgt/istgt.conf schreiben:


 [Global] Comment "Global section" NodeBase "iqn.2018-07.org.example.tgt1" PidFile /var/run/istgt.pid AuthFile /etc/istgt/auth.conf MediaDirectory /var/istgt LogFacility "local7" Timeout 30 NopInInterval 20 DiscoveryAuthMethod Auto MaxSessions 16 MaxConnections 4 MaxR2T 32 MaxOutstandingR2T 16 DefaultTime2Wait 2 DefaultTime2Retain 60 FirstBurstLength 262144 MaxBurstLength 1048576 MaxRecvDataSegmentLength 262144 InitialR2T Yes ImmediateData Yes DataPDUInOrder Yes DataSequenceInOrder Yes ErrorRecoveryLevel 0 [UnitControl] Comment "Internal Logical Unit Controller" AuthMethod CHAP Mutual AuthGroup AuthGroup10000 Portal UC1 127.0.0.1:3261 Netmask 127.0.0.1 [PortalGroup1] Comment "SINGLE PORT TEST" Portal DA1 192.168.1.11:3260 [InitiatorGroup1] Comment "Initiator Group1" InitiatorName "ALL" Netmask 192.168.1.0/24 [LogicalUnit1] Comment "Hard Disk Sample" TargetName disk1 TargetAlias "Data Disk1" Mapping PortalGroup1 InitiatorGroup1 AuthMethod Auto AuthGroup AuthGroup1 UseDigest Auto UnitType Disk LUN0 Storage /data/target1.img Auto 

Neustart istgt:


 systemctl restart istgt 

Damit ist die Zieleinstellung abgeschlossen


HA-Setup


Jetzt können wir mit der HA-Manager- Konfiguration fortfahren. Erstellen wir eine separate HA-Gruppe für unser Gerät:


 ha-manager groupadd tgt1 --nodes pve1,pve2,pve3 --nofailback=1 --restricted=1 

Unsere Ressource funktioniert nur auf den für diese Gruppe angegebenen Knoten. Fügen Sie unseren Container dieser Gruppe hinzu:


 ha-manager add ct:101 --group=tgt1 --max_relocate=3 --max_restart=3 

Empfehlungen und Abstimmung


DRBD

Wie oben erwähnt, ist es immer ratsam, ein separates Netzwerk für die Replikation zu verwenden. Es wird dringend empfohlen, 10-Gigabit-Netzwerkadapter zu verwenden , da sonst die Portgeschwindigkeit beeinträchtigt wird.
Wenn die Replikation langsam genug erscheint, probieren Sie einige der Optionen für DRBD aus . Hier ist die Konfiguration, die meiner Meinung nach für mein 10G-Netzwerk optimal ist :


 # cat /etc/drbd.d/global_common.conf global { usage-count yes; udev-always-use-vnr; } common { handlers { } startup { } options { } disk { c-fill-target 10M; c-max-rate 720M; c-plan-ahead 10; c-min-rate 20M; } net { max-buffers 36k; sndbuf-size 1024k; rcvbuf-size 2048k; } } 

Weitere Informationen zu den einzelnen Parametern finden Sie in der offiziellen DRBD-Dokumentation.


Öffnen Sie iSCSI

Da wir kein Multipathing verwenden, wird in unserem Fall empfohlen, die regelmäßigen Verbindungsprüfungen auf Clients zu deaktivieren und die Wartezeiten für die Sitzungswiederherstellung in /etc/iscsi/iscsid.conf .


 node.conn[0].timeo.noop_out_interval = 0 node.conn[0].timeo.noop_out_timeout = 0 node.session.timeo.replacement_timeout = 86400 

Verwenden Sie


Proxmox


Das resultierende iSCSI-Ziel kann sofort mit Proxmox verbunden werden, ohne die Option " LUN direkt verwenden" zu deaktivieren.



Unmittelbar danach ist es möglich, LVM darüber zu erstellen. Vergessen Sie nicht, das freigegebene Kontrollkästchen zu aktivieren:



Andere Umgebungen


Wenn Sie diese Lösung in einer anderen Umgebung verwenden möchten, müssen Sie möglicherweise eine Clustererweiterung für LVM installieren, da zwei Implementierungen vorhanden sind. CLVM und lvmlockd .


Das Konfigurieren von CLVM ist nicht trivial und erfordert einen funktionierenden Cluster-Manager.
Als zweite Methode ist lvmlockd noch nicht vollständig getestet und erscheint gerade erst in stabilen Repositorys.


Ich empfehle, einen ausgezeichneten Artikel über das Blockieren in LVM zu lesen


Bei Verwendung von LVM mit Proxmox ist das Hinzufügen von Clustern nicht erforderlich , da die Datenträgerverwaltung von proxmox selbst bereitgestellt wird, das LVM-Metadaten unabhängig aktualisiert und überwacht. Gleiches gilt für OpenNebula , wie aus der offiziellen Dokumentation eindeutig hervorgeht.

Source: https://habr.com/ru/post/de417597/


All Articles