Einleitung
Zum heutigen Zeitpunkt habe ich noch keine Artikel gefunden, wie man DRBD mit RDMA unter Debian (11) installiert. In diesem Artikel beschreibe ich Schritt für Schritt, wie sich zwei Volumes über RDMA synchronisieren lassen.Was ist RDMA?
RDMA steht für "Remote Direct Memory Access" und ist eine Technologie, die es Computern ermöglicht, Daten direkt zwischen ihren Speicherbereichen auszutauschen, ohne den Prozessor oder das Betriebssystem des Zielrechners zu belasten. RDMA verwendet spezielle Netzwerkkarten, die direkt auf den Speicher des Computers zugreifen können, anstatt die CPU und den Betriebssystem-Netzwerk-Stack zu verwenden, was eine schnellere Übertragung von Daten ermöglicht.Welche Hardwarevoraussetzungen gibt es für RDMA?
Für RDMA sind spezielle Netzwerkadapter erforderlich, die in der Lage sind, direkt auf den Speicher des Computers zuzugreifen. Diese Adapter können entweder in Form von speziellen Netzwerkkarten oder als integrierte Funktionen in Motherboards oder anderen Systemen vorhanden sein.Diese spezielle Hardware gibt es günstig gebraucht z. B. bei eBay zu kaufen. Dazu kann man einfach nach "40gbe pcie x8" suchen und gute Karten fangen derzeit bei ca. 40 € an.
Vorbereitungen
Für diesen Artikel wurde folgendes verwendet:- Debian 11.6 (cat /etc/debian_version) auf beiden Servern
- 2x InfiniBand: Mellanox Technologies MT25408A0-FCC-QI ConnectX, Dual Port 40Gb/s InfiniBand / 10GigE Adapter
Server 1 (10.0.23.1):
rping -s -v
Server 2 (10.0.23.2):
rping -c -a 10.0.23.1 -v
Nun sollte eine Ausgabe etwa in dieser Art zu sehen sein:
ping data: rdma-ping-10117: Z[\]^_`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM ping data: rdma-ping-10118: [\]^_`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN ping data: rdma-ping-10119: \]^_`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO ping data: rdma-ping-10120: ]^_`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP ping data: rdma-ping-10121: ^_`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ ping data: rdma-ping-10122: _`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR ping data: rdma-ping-10123: `abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS ping data: rdma-ping-10124: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRST ping data: rdma-ping-10125: bcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUDie Übertragung lässt sich mittels Ctrl + c unterbrechen.
Installation von DRBD:
apt install drbd-utilsEine detaillierte Anleitung zur Installation von DRBD finden Sie hier: Einrichtung eines hochverfügbaren Speichers mit DRBD und OCFS2
Bauen eines neuen Kernel-Moduls
Da bei der Installation von DRBD aus dem Debian-Repository ein Kernel-Modul der Version 8.x installiert wird, welches kein RDMA unterstützt, muss ein neues gebaut werden. Die aktuelle Version lässt sich mit folgendem Kommando prüfen:# modinfo drbd
Vor dem Bauen müssen noch ein paar Abhängigkeiten installiert werden:
# apt-get install build-essential flex bison libssl-dev libnl-3-dev libnl-genl-3-dev libxml2-dev xmlto xsltproc python3-pytest python3-sphinx python3-yaml python3-jinja2 graphviz dkms
Nun laden wir uns eine aktuelle Version von DRBD herunter (bitte Version ersetzen):
# wget https://pkg.linbit.com//downloads/drbd/9/drbd-9.2.2.tar.gz
Entpacken:
# tar xfz drbd-9.2.2.tar.gz
Verzeichnis wechseln:
# cd drbd-9.2.2
Bauen:
# make KVER=$(uname -r) all
Installieren:
# make install
Modul laden:
# modprobe drbd
Modul prüfen:
# modinfo drbdNun sollte die neue Version zu sehen sein:
filename: /lib/modules/5.10.0-21-amd64/updates/drbd.ko alias: block-major-147-* license: GPL version: 9.2.2 description: drbd - Distributed Replicated Block Device v9.2.2Es ist wichtig, dass eine Version >= 9.2 installiert wird, da ab dieser Version rdma enthalten ist.
Das RDMA-Modul kann wie folgt geladen werden:
# modprobe drbd_transport_rdma
Wirft dieses Kommando keine Fehler, dann sollte das Modul in der Pseudodatei /proc/drbd zu sehen sein:
Transports (api:18): tcp (9.2.2) rdma (9.2.2)
Damit das Modul nach einem Systemstart automatisch geladen wird, fügen wir es noch zu der Datei /etc/modules hinzu. Nun muss das System neu gestartet werden.
Diese Schritte müssen auf beiden Servern ausgeführt werden. Ab jetzt gibt es eine Downtime, da die DRBD-Ressource von 8.x zu 9.x konvertiert werden muss.
Konvertieren der DRBD-Ressourcen
Die Schritte aus diesem Punkt der Anleitung stammen von folgender Seite: Upgrading DRBD Has Never Been Easier. Es können Datenverluste auftreten, für die ich keine Gewähr übernehme. Vor der Durchführung der Schritte empfehle ich dringend ein komplettes Backup zu erstellen.Metadatenkonvertierung (bitte Ressourcennamen ändern):
# drbdadm create-md ssd1
You want me to create a v09 style flexible-size internal meta data block.
There appears to be a v08 flexible-size internal meta data block
already in place on /dev/vdb at byte offset 8589930496
Valid v08 meta-data found, convert to v09?
[need to type 'yes' to confirm] yes
md_offset 8589930496
al_offset 8589897728
bm_offset 8589635584
Found xfs filesystem
8388060 kB data area apparently used
8388316 kB left usable by current configuration
Even though it looks like this would place the new meta data into
unused space, you still need to confirm, as this is only a guess.
Do you want to proceed?
[need to type 'yes' to confirm] yes
Writing meta data...
New drbd meta data block successfully created.
success
Ressource hochfahren (bitte Ressourcennamen ändern):
# drbdadm up ssd1
Die Überprüfung der /proc/drbd-Ausgabe verifiziert die aktuell geladene DRBD-Modulversion (9.2.0) auf dem aktualisierten Knoten:
# cat /proc/drbd version: 9.2.2 (api:2/proto:86-121) GIT-hash: 8435da3ec2a0a70dee0fedf354276d6f1c6ba708 build by root@s01, 2023-03-11 14:54:04 Transports (api:18): tcp (9.2.2) rdma (9.2.2)Die Befehle müssen auf beiden Servern ausgeführt werden und die Resource wieder verbunden werden.
Verbinden via RDMA
Um die Verbindung umzustellen muss die Konfiguration der Ressourcen angepasst werden. Diese könnte dann so aussehen (/etc/drbd.d/ssd1.res):resource ssd1 {
protocol C;
device /dev/drbd0;
meta-disk internal;
startup {
degr-wfc-timeout 60;
become-primary-on both;
}
disk {
on-io-error detach;
c-plan-ahead 10;
c-fill-target 100K;
c-min-rate 500M;
c-max-rate 1000M;
no-disk-flushes;
no-disk-barrier;
}
net {
transport rdma;
max-buffers 36k;
sndbuf-size 1024k;
rcvbuf-size 2048k;
allow-two-primaries;
}
on s01 {
disk /dev/md2;
address 10.0.23.1:7789;
}
on s02 {
disk /dev/md2;
address 10.0.23.2:7789;
}
}
Nun wird der Service auf beiden Servern neu gestartet:
systemctl restart drbdDas muss ungefähr gleichzeitig passieren, da sonst die Verbindung zum anderen Server nicht hergestellt werden kann.
Nun sollte DRBD mit RDMA aktiv sein. Leider ist mit bisher keine Möglichkeit (außer Performance messen) bekannt, die Verbindung über RDMA zu verifizieren.