Worüber wir sprechen werden:
Wie man schnell einen gemeinsamen Speicher für zwei Server auf Basis von drbd+ocfs2 bereitstellt.
Für wen es nützlich sein wird:
Das Tutorial wird für Systemadministratoren und alle, die eine Speicherlösung implementieren oder ausprobieren möchten, von Nutzen sein.
Von welchen Lösungen wir Abstand genommen haben und warum
Häufig stehen wir vor der Situation, dass wir auf einem kleinen Web-Cluster einen gemeinsamen Speicher mit guter Lese- und Schreibgeschwindigkeit realisieren müssen. Wir haben verschiedene Ansätze für die Implementierung eines gemeinsamen Speichers für unsere Projekte ausprobiert, aber nur wenige konnten uns in mehreren Kriterien gleichzeitig zufriedenstellen. Jetzt werden wir erklären, warum.
- Glusterfs hat uns in Bezug auf die Lese- und Schreibgeschwindigkeit nicht überzeugt, es gab Probleme mit dem gleichzeitigen Lesen einer großen Anzahl von Dateien und die CPU-Last war hoch. Das Problem beim Lesen von Dateien konnte gelöst werden, indem man direkt auf die Bricks zugreift, aber das ist nicht immer sinnvoll und im Allgemeinen nicht korrekt.
- Ceph fiel uns aufgrund der übermäßigen Komplexität negativ auf, die in Projekten mit 2-4 Servern, insbesondere wenn das Projekt später gewartet wird, schädlich sein kann. Darüber hinaus gibt es ernsthafte Leistungsbeschränkungen, die es erforderlich machen, separate Storage-Cluster wie bei Glusterfs zu erstellen.
- Die Verwendung eines NFS-Servers zur Implementierung eines gemeinsamen Speichers wirft Fragen zur Ausfallsicherheit auf.
- S3 ist eine hervorragende, beliebte Lösung für einen bestimmten Aufgabenbereich, aber es ist auch kein Dateisystem, was den Anwendungsbereich einschränkt.
- Lsyncd. Wenn wir bereits über „Nicht-Dateisysteme“ sprechen, sollten wir auch diese beliebte Lösung erwähnen. Abgesehen davon, dass es nicht für bidirektionalen Austausch geeignet ist (aber wenn man wirklich möchte, kann es funktionieren), funktioniert es auch nicht stabil bei einer großen Anzahl von Dateien. Ein angenehmes Merkmal ist, dass es einflusslos arbeitet. Der Grund liegt in der Programmarchitektur: Sie verwendet Inotify zur Überwachung von Arbeitsobjekten, die beim Start und beim Rescanning angehängt werden. Als Übertragungsmedium wird Rsync verwendet.
Tutorial: So richten Sie einen gemeinsamen Speicher auf Basis von drbd+ocfs2 ein
Eine der bequemsten Lösungen für uns war die Kombination ocfs2+drbd. Jetzt erklären wir, wie man schnell einen gemeinsamen Speicher für zwei Server auf Basis von Lösung Daten aufbauen kann. Aber zuerst einige Informationen zu den Komponenten:
DRBD — ein Speichersystem, das standardmäßig mit Linux geliefert wird und die Replikation von Daten zwischen Servern in Blöcken ermöglicht. Die Hauptanwendung besteht im Aufbau von ausfallsicheren Speichern.
OCFS2 — ein Dateisystem, das die gemeinsame Nutzung desselben Speichers durch mehrere Systeme ermöglicht. Es ist Bestandteil der Linux-Distribution und besteht aus einem Kernelmodul und einem Userspace-Tool zur Arbeit mit dem FS. OCFS2 kann nicht nur über DRBD, sondern auch über iSCSI mit mehrfacher Verbindung verwendet werden. In unserem Beispiel verwenden wir DRBD.
Alle Aktionen werden auf Ubuntu Server 18.04 in minimaler Konfiguration durchgeführt.
Schritt 1. Konfigurieren von DRBD:
In der Datei /etc/drbd.d/drbd0.res beschreiben wir unser virtuelles Blockgerät /dev/drbd0:
resource drbd0 {
syncer { rate 1000M; }
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
startup { become-primary-on both; }
on drbd1 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.192:7789;
}
on drbd2 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.193:7789;
}
} meta-disk internal — die gleichen Blockgeräte zur Speicherung von Metadaten verwenden
device /dev/drbd0 — /dev/drbd0 als Pfad zu DRBD verwenden.
disk /dev/vdb1 — /dev/vdb1 verwenden
syncer { rate 1000M; } — eine Gigabit-Kapazität des Kanals verwenden
allow-two-primaries — eine wichtige Option, die Änderungen auf zwei Primärservern zulässt
after-sb-0pri, after-sb-1pri, after-sb-2pri — Optionen, die das Verhalten des Knotens bei Erkennung von Split-Brain steuern. Weitere Informationen finden Sie in der Dokumentation.
become-primary-on both — setzt beide Knoten auf primär.
In unserem Fall haben wir zwei identische VMs mit einem dedizierten virtuellen Netzwerk, das eine Bandbreite von 10 Gigabit bietet.
In unserem Beispiel sind die Netzwerknamen der beiden Clusterknoten drbd1 und drbd2. Um richtig zu funktionieren, müssen Sie in /etc/hosts die Namen und IP-Adressen der Knoten zuordnen.
10.10.10.192 drbd1
10.10.10.193 drbd2Schritt 2. Konfigurieren der Knoten:
Auf beiden Servern führen wir aus:
drbdadm create-md drbd0 
modprobe drbd
drbdadm up drbd0
cat /proc/drbdWir erhalten folgendes:

Jetzt kann die Synchronisation gestartet werden. Auf dem ersten Knoten muss Folgendes ausgeführt werden:
drbdadm primary --force drbd0Wir überprüfen den Status:
cat /proc/drbd 
Perfekt, die Synchronisation hat begonnen. Wir warten auf das Ende und sehen folgendes Bild:

Schritt 3. Synchronisation auf dem zweiten Knoten starten:
drbdadm primary --force drbd0
Wir erhalten folgendes:

Jetzt können wir in drbd von beiden Servern schreiben.
Schritt 4. Installation und Konfiguration von ocfs2.
Wir werden eine ziemlich triviale Konfiguration verwenden:
cluster:
node_count = 2
name = ocfs2cluster
node:
number = 1
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.192
name = drbd1
node:
number = 2
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.193
name = drbd2
Dies muss in /etc/ocfs2/cluster.conf beiden Knoten geschrieben werden.
Erstellen Sie ein FS auf drbd0 auf einem beliebigen Knoten:
mkfs.ocfs2 -L "testVol" /dev/drbd0
Hier haben wir ein FS mit dem Label testVol auf drbd0 erstellt, unter Verwendung der Standardparameter.

In /etc/default/o2cb müssen folgende Werte gesetzt werden (wie in unserer Konfigurationsdatei):
O2CB_ENABLED=true
O2CB_BOOTCLUSTER=ocfs2cluster und auf jedem Knoten ausgeführt werden:
o2cb register-cluster ocfs2clusterDanach aktivieren wir und fügen allen benötigten Unit-Elementen den Autostart hinzu:
systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2Ein Teil davon wird bereits während der Konfiguration gestartet.
Schritt 5. Fügen Sie die Einhängepunkte in fstab auf beiden Knoten hinzu:
/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0Das Verzeichnis /media/shared muss im Voraus erstellt werden.
Hier verwenden wir die Optionen noauto, was bedeutet, dass das FS beim Start nicht eingehängt wird (ich bevorzuge es, Netzwerkspeicher über systemd einzuhängen) und heartbeat=local, was die Verwendung des Heartbeat-Dienstes auf jedem Knoten bedeutet. Es gibt auch ein globales Heartbeat, das besser für größere Cluster geeignet ist.
Danach kann es eingehängt werden /media/shared und die Synchronisation des Inhalts überprüft werden.
Fertig! Als Ergebnis erhalten wir ein mehr oder weniger ausfallsicheres Speichergerät mit Skalierungsmöglichkeiten und anständiger Leistung.
Quelle: habr.com
