RDMA für DRBD aktivieren

12.03.2023
 

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
Je nach verwendete Hardware müssen Treiber installiert werden. In diesem Setup überspringe ich diesen Schritt und gehe davon aus, dass sich beide Server bereits mit rping erreichen können.

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: bcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU
Die Übertragung lässt sich mittels Ctrl + c unterbrechen.

Installation von DRBD:
apt install drbd-utils
Eine 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 drbd
Nun 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.2
Es 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 drbd
Das 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.