DRBD Reactor und Promoter auf Debian 12: Installation für HA-Umgebungen

 | 1513 Wörter


In Cluster Umgebungen ist die Bereitstellung von Speicher eine zentrale Fragestellung. Die bekannten Enterprise Lösungen wie NetApp, PowerScale, Nimble und CEPH erfüllen zwar die Anforderungen aber spielen preislich keine Rolle für kleine und mittelständische Betriebe. Lizenzkosten von mehreren 50.000€ pro Jahr sind da keine seltenheit. Auch wenn CEPH an sich kostenlos eingesetzt werden kann, wird jedoch für eine sehr gute Performance ein großes Cluster (>5 Nodes) benötigt, womit es ebenfalls äußerst kostspielig ist.

Alternativen gibt es einige, viele basieren dabei auf DRBD (Distributed Replicated Block Device) welches wir uns heute anschauen wollen.

Einleitung

Gegenüber klassichen SAN-/NAS-Lösungen benötigt der Einsatz von DRBD erheblich weniger Hardware aber mit der Einschränkungen, dass die Leistung dem lokalen Speicher des ausführenden Knotens approximiert. Es wird der Einsatz von Enterprise SSDs mit PLP empfohlen.

Die Grundlage für die Einschränken ist die Replikation im Cluster-Netzwerk. Änderungen werden auf dem ausführenden Knoten in seiner Kopie (bei entpsrechendem Quorum) getätigt und danach im Cluster verteilt. Durch das Einklinken des DRBD Kernelmodul zwischen Block Device und dem zu schreibenden Prozess geht Performance verloren, welche sich aber durch dedizierte CPU Resourcen und NVME Speicher begrenzen lässt. Außerhalb von klassischen Clusterumgebungen, gibt es auch Docker und Kubernetes Plugins welche die Ansteuerung von Linstor/DRBD, sowie das Einhängen und Formatieren für den anfragenden Container übernehmen.

Die Arbeit wird dabei zwischen Controllern (Active-Passive) und Satelliten aufgeteilt. Der DRBD Reactor und Promoter ist dabei für die Hochverfügbarkeit des Controllers zuständig. Standardmäßig gibt es nur mit Lizenz binaries. Leider läuft auch der Container fürs Bauen nicht, also machen wir es von Hand:

Den Guide von LINBIT für den Einsatz von DRBD 9 inkl. Clusteraufbau findet ihr hier: The DRBD9 User’s Guide

Voraussetzungen

Für die beispielhafte Bereitstellung nutze ich ein 4-Node Cluster mit folgenden Specs:

  • 3x 4vCPU-8G
  • 1x 2vCPU-4G
  • je Node: 25GB Block Storage, Public NIC, Private NIC

Das Cluster ist bereits grundlegend Eingerichtet, alle Nodes sind erreichbar und ein Wordpress Cluster nutzt es bereits.

Spoiler: Viel Text!
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
$ linstor n l # linstor node list
╭───────────────────────────────────────────────────────────────╮
┊ Node              ┊ NodeType ┊ Addresses             ┊ State  ┊
╞═══════════════════════════════════════════════════════════════╡
┊ debian-4gb-fsn1-1 ┊ COMBINED ┊ 10.0.0.2:3366 (PLAIN) ┊ Online ┊
┊ debian-8gb-nbg1-1 ┊ COMBINED ┊ 10.0.0.3:3366 (PLAIN) ┊ Online ┊
┊ debian-8gb-nbg1-2 ┊ COMBINED ┊ 10.0.0.5:3366 (PLAIN) ┊ Online ┊
┊ debian-8gb-nbg1-3 ┊ COMBINED ┊ 10.0.0.4:3366 (PLAIN) ┊ Online ┊
╰───────────────────────────────────────────────────────────────╯

$ linstor c which # linstor controller which
linstor://10.0.0.2

$ linstor rg l # linstor resource-group list
╭───────────────────────────────────────────────────────────────────╮
┊ ResourceGroup  ┊ SelectFilter              ┊ VlmNrs ┊ Description ┊
╞═══════════════════════════════════════════════════════════════════╡
┊ DfltRscGrp     ┊ PlaceCount: 2             ┊        ┊             ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄╡
┊ data-rg        ┊ PlaceCount: 40      ┊             ┊
┊                ┊ StoragePool(s): data01    ┊        ┊             ┊
╰───────────────────────────────────────────────────────────────────╯

$ linstor r l # linstor resource list
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ ResourceName               ┊ Node              ┊ Port ┊ Usage  ┊ Conns ┊      State ┊ CreatedOn           ┊
╞═══════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ test01                     ┊ debian-4gb-fsn1-1 ┊ 7000 ┊ Unused ┊ Ok    ┊   UpToDate ┊ 2024-09-07 18:39:42 ┊
┊ test01                     ┊ debian-8gb-nbg1-1 ┊ 7000 ┊ Unused ┊ Ok    ┊   UpToDate ┊ 2024-09-07 18:39:42 ┊
┊ test01                     ┊ debian-8gb-nbg1-2 ┊ 7000 ┊ Unused ┊ Ok    ┊   UpToDate ┊ 2024-09-07 18:44:40 ┊
┊ test01                     ┊ debian-8gb-nbg1-3 ┊ 7000 ┊ Unused ┊ Ok    ┊   UpToDate ┊ 2024-09-07 18:39:42 ┊
┊ wordpress_db-data          ┊ debian-4gb-fsn1-1 ┊ 7004 ┊ Unused ┊ Ok    ┊   UpToDate ┊ 2024-09-07 18:16:39 ┊
┊ wordpress_db-data          ┊ debian-8gb-nbg1-1 ┊ 7004 ┊ Unused ┊ Ok    ┊   UpToDate ┊ 2024-09-07 18:16:39 ┊
┊ wordpress_db-data          ┊ debian-8gb-nbg1-2 ┊ 7004 ┊ InUse  ┊ Ok    ┊   Diskless ┊ 2024-09-08 08:03:33 ┊
┊ wordpress_db-data          ┊ debian-8gb-nbg1-3 ┊ 7004 ┊ Unused ┊ Ok    ┊   Diskless ┊ 2024-09-07 19:17:35 ┊
┊ wordpress_wp-data          ┊ debian-8gb-nbg1-1 ┊ 7003 ┊ Unused ┊ Ok    ┊ TieBreaker ┊ 2024-09-07 18:16:34 ┊
┊ wordpress_wp-data          ┊ debian-8gb-nbg1-2 ┊ 7003 ┊ Unused ┊ Ok    ┊   UpToDate ┊ 2024-09-07 18:16:35 ┊
┊ wordpress_wp-data          ┊ debian-8gb-nbg1-3 ┊ 7003 ┊ InUse  ┊ Ok    ┊   UpToDate ┊ 2024-09-07 18:16:35 ┊
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯

$ linstor v l # linstor volume list
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ Node              ┊ Resource                   ┊ StoragePool          ┊ VolNr ┊ MinorNr ┊ DeviceName    ┊  Allocated ┊ InUse  ┊      State ┊
╞════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ debian-4gb-fsn1-1 ┊ test01                     ┊ data01               ┊     01000 ┊ /dev/drbd1000 ┊   1.02 MiB ┊ Unused ┊   UpToDate ┊
┊ debian-8gb-nbg1-1 ┊ test01                     ┊ data01               ┊     01000 ┊ /dev/drbd1000 ┊   1.02 MiB ┊ Unused ┊   UpToDate ┊
┊ debian-8gb-nbg1-2 ┊ test01                     ┊ data01               ┊     01000 ┊ /dev/drbd1000 ┊   1.02 MiB ┊ Unused ┊   UpToDate ┊
┊ debian-8gb-nbg1-3 ┊ test01                     ┊ data01               ┊     01000 ┊ /dev/drbd1000 ┊   1.02 MiB ┊ Unused ┊   UpToDate ┊
┊ debian-4gb-fsn1-1 ┊ wordpress_db-data          ┊ data01               ┊     01004 ┊ /dev/drbd1004 ┊ 218.08 MiB ┊ Unused ┊   UpToDate ┊
┊ debian-8gb-nbg1-1 ┊ wordpress_db-data          ┊ data01               ┊     01004 ┊ /dev/drbd1004 ┊ 137.91 MiB ┊ Unused ┊   UpToDate ┊
┊ debian-8gb-nbg1-2 ┊ wordpress_db-data          ┊ DfltDisklessStorPool ┊     01004 ┊ /dev/drbd1004 ┊            ┊ InUse  ┊   Diskless ┊
┊ debian-8gb-nbg1-3 ┊ wordpress_db-data          ┊ DfltDisklessStorPool ┊     01004 ┊ /dev/drbd1004 ┊            ┊ Unused ┊   Diskless ┊
┊ debian-8gb-nbg1-1 ┊ wordpress_wp-data          ┊ DfltDisklessStorPool ┊     01003 ┊ /dev/drbd1003 ┊            ┊ Unused ┊ TieBreaker ┊
┊ debian-8gb-nbg1-2 ┊ wordpress_wp-data          ┊ data01               ┊     01003 ┊ /dev/drbd1003 ┊  84.94 MiB ┊ Unused ┊   UpToDate ┊
┊ debian-8gb-nbg1-3 ┊ wordpress_wp-data          ┊ data01               ┊     01003 ┊ /dev/drbd1003 ┊ 219.51 MiB ┊ InUse  ┊   UpToDate ┊
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

$ linstor sp l # linstor storage-pool list
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ StoragePool          ┊ Node              ┊ Driver   ┊ PoolName            ┊ FreeCapacity ┊ TotalCapacity ┊ CanSnapshots ┊ State ┊ SharedName                             ┊
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ DfltDisklessStorPool ┊ debian-4gb-fsn1-1 ┊ DISKLESS ┊                     ┊              ┊               ┊ False        ┊ Ok    ┊ debian-4gb-fsn1-1;DfltDisklessStorPool ┊
┊ DfltDisklessStorPool ┊ debian-8gb-nbg1-1 ┊ DISKLESS ┊                     ┊              ┊               ┊ False        ┊ Ok    ┊ debian-8gb-nbg1-1;DfltDisklessStorPool ┊
┊ DfltDisklessStorPool ┊ debian-8gb-nbg1-2 ┊ DISKLESS ┊                     ┊              ┊               ┊ False        ┊ Ok    ┊ debian-8gb-nbg1-2;DfltDisklessStorPool ┊
┊ DfltDisklessStorPool ┊ debian-8gb-nbg1-3 ┊ DISKLESS ┊                     ┊              ┊               ┊ False        ┊ Ok    ┊ debian-8gb-nbg1-3;DfltDisklessStorPool ┊
┊ data01               ┊ debian-4gb-fsn1-1 ┊ LVM_THIN ┊ linstor_vg/thinpool ┊    24.39 GiB ┊     24.94 GiB ┊ True         ┊ Ok    ┊ debian-4gb-fsn1-1;data01               ┊
┊ data01               ┊ debian-8gb-nbg1-1 ┊ LVM_THIN ┊ linstor_vg/thinpool ┊    24.55 GiB ┊     24.94 GiB ┊ True         ┊ Ok    ┊ debian-8gb-nbg1-1;data01               ┊
┊ data01               ┊ debian-8gb-nbg1-2 ┊ LVM_THIN ┊ linstor_vg/thinpool ┊    24.57 GiB ┊     24.94 GiB ┊ True         ┊ Ok    ┊ debian-8gb-nbg1-2;data01               ┊
┊ data01               ┊ debian-8gb-nbg1-3 ┊ LVM_THIN ┊ linstor_vg/thinpool ┊    24.52 GiB ┊     24.94 GiB ┊ True         ┊ Ok    ┊ debian-8gb-nbg1-3;data01               ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

DRBD Reactor

1
2
3
4
$ git clone https://github.com/LINBIT/drbd-reactor.git -b v1.4.2
Cloning into 'drbd-reactor'...
...
Note: switching to '816c6cf0fa551419976b78e27e825aa25d87fd63'.

Normalerweise müsste Docker bereits eingerichtet sein, damit die Makefile die Binaries bauen kann. Da das aber nicht funktioniert, bauen wir es von Hand mit Cargo. Die aktuelle Rust Version unter Deb 12 ist zu alt, also über rustup die aktuelle Version holen:

1
2
3
4
$ rustup update stable
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'

  stable-x86_64-unknown-linux-gnu unchanged - rustc 1.81.0 (eeb90cda1 2024-09-04)

Nun wechseln wir ins Repo und bauen anhand der Vorlage in der Dockerfile die Binaries:

1
2
3
4
5
6
$ cd drbd-reactor
$ cargo install --path . --bin drbd-reactor
...
Finished `release` profile [optimized] target(s) in 1m 33s
  Installing /root/.cargo/bin/drbd-reactor
   Installed package `drbd-reactor v1.4.2 (/root/drbd-reactor)` (executable `drbd-reactor`)

Im Anschluss verteilen wir die Binary und die Konfiguration auf allen Controllern

1
2
3
4
5
6
$ cp ./target/release/drbd-reactor /usr/sbin
$ cp ./example/drbd-reactor.toml /etc
$ mkdir /etc/drbd-reactor.d
$ chown root:root /etc/drbd-reactor.d
$ chown root:root /usr/sbin/drbd-reactor
$ chown root:root /etc/drbd-reactor.toml

In dem Ordern example finden sich ebenfalls SystemD-Service Dateien, welcher essentieller Teil der Funktionsweise vom DRBD Promoter sind.

DRBD Promoter - aber was ist mit Pacemaker?

An idiot admires complexity, a genius admires simplicity

@Terry Davis, creator of TempleOS

Pacemaker ist ein tolles Werkzeug, außerst flexibel und heutzutage der de-facto standard in HA-Umgebungen. Mit seiner Flexibilität kommt aber auch eine große Komplexität, Verwaltungsaufwand und dann noch die Plugins (Corosync etc.). Da das der Firma hinter DRBD Linbit anscheinend hart auf den Keks gegangen ist - immerhin muss deren Support auch die Kundensysteme fixen, haben sich deren Techniker zusammengesetzt und stellten ein System aus etablierter Werkzeuge zusammen. Einfach, verwaltbar und skalierbar.

Linbit wollte das Rad nicht neu erfinden und setzt “einfach” auf das zugrunde liegende DRBD-Cluster um den Controller Knoten zu bestimmen. Im Zusammenspiel mit SystemD, womit leider viele Derivate und BSD ausgeschlossen werden, und dem Einsatz von Overrides wird das Übernahmeverhalten gesteuert. Details entnehmt bitte der Dokumention.

Folgende Funktionsweise wollen wir für eine einfache Konfiguration verwenden:

  • Verschieben der Controller Datenbank auf DRBD
  • Erstellen von SystemD Mount dieser Datenbank auf allen Controllern
  • Failover Test

Der example Ordner ist ein guter Startpunkt, genauso wie das Repository, folgende Schritt-für-Schritt Anleitung High-Availability with DRBD Reactor & Promoter und die Dokumentation Configuring Highly Available LINSTOR Database Storage.