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
