Clusterspeicher für kleine Webcluster basierend auf drbd+ocfs2

Worüber wir sprechen werden:
So stellen Sie gemeinsam genutzten Speicher für zwei Server basierend auf drbd+ocfs2-Lösungen schnell bereit.

Für wen ist dies nützlich:
Das Tutorial ist für Systemadministratoren und alle nützlich, die sich für eine Speicherimplementierungsmethode entscheiden oder die Lösung ausprobieren möchten.

Welche Entscheidungen haben wir abgelehnt und warum?

Oft sind wir mit der Situation konfrontiert, dass wir gemeinsam genutzten Speicher mit guter Lese-/Schreibleistung auf einem kleinen Webcluster implementieren müssen. Wir haben verschiedene Optionen zur Implementierung von Shared Storage für unsere Projekte ausprobiert, aber nur wenige konnten uns bei mehreren Indikatoren gleichzeitig zufriedenstellen. Jetzt verraten wir Ihnen warum.

  • Glusterfs konnte uns mit der Lese- und Schreibleistung nicht zufriedenstellen, es gab Probleme beim gleichzeitigen Lesen einer großen Anzahl von Dateien und es kam zu einer hohen Belastung der CPU. Das Problem beim Lesen von Dateien könnte durch den direkten Zugriff auf sie aus dem Brick gelöst werden, dies ist jedoch nicht immer anwendbar und im Allgemeinen falsch.

  • Ceph gefiel die übermäßige Komplexität nicht, die bei Projekten mit 2-4 Servern schädlich sein kann, insbesondere wenn das Projekt nachträglich gepflegt wird. Auch hier gibt es gravierende Leistungseinschränkungen, die uns dazu zwingen, separate Speichercluster zu erstellen, wie bei Glusterfs.

  • Die Verwendung eines NFS-Servers zur Implementierung von Shared Storage wirft Fragen hinsichtlich der Fehlertoleranz auf.

  • s3 ist eine ausgezeichnete, beliebte Lösung für einen bestimmten Aufgabenbereich, aber es ist kein Dateisystem, was seinen Anwendungsbereich einschränkt.

  • lsyncd. Wenn wir bereits über „Nicht-Dateisysteme“ gesprochen haben, lohnt es sich, diese beliebte Lösung durchzugehen. Es ist nicht nur nicht für den bidirektionalen Austausch geeignet (aber wenn Sie es wirklich wollen, dann können Sie es), es funktioniert auch bei einer großen Anzahl von Dateien nicht stabil. Eine schöne Ergänzung zum Ganzen ist, dass es Single-Threaded ist. Der Grund liegt in der Architektur des Programms: Es verwendet inotify zur Überwachung von Arbeitsobjekten, die es beim Start und beim erneuten Scannen zuweist. Als Übertragungsmedium wird rsync verwendet.

Tutorial: So stellen Sie gemeinsam genutzten Speicher basierend auf drbd+ocfs2 bereit

Eine der bequemsten Lösungen für uns war der Link ocfs2+drbd. Jetzt verraten wir Ihnen, wie Sie auf Basis einer Lösungsdatenbank schnell Shared Storage für zwei Server bereitstellen können. Doch zunächst ein wenig zu den Komponenten:

DRBD - ein Speichersystem aus der Standard-Linux-Distribution, mit dem Sie Daten blockweise zwischen Servern replizieren können. Die Hauptanwendung besteht darin, fehlertoleranten Speicher aufzubauen.

OCFS2 - ein Dateisystem, das die gemeinsame Nutzung desselben Speichers durch mehrere Systeme ermöglicht. In der Linux-Distribution enthalten und ein Kernel-Modul sowie Userspace-Tools für die Arbeit mit dem FS. OCFS2 kann nicht nur über DRBD, sondern auch über iSCSI mit mehreren Verbindungen verwendet werden. In unserem Beispiel verwenden wir DRBD.

Alle Aktionen werden auf dem Ubuntu-Server 18.04 in einer Minimalkonfiguration ausgeführt.

Schritt 1. DRBD konfigurieren:

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 intern – Verwenden Sie dieselben Blockgeräte zum Speichern von Metadaten
Gerät /dev/drbd0 – Verwenden Sie /dev/drbd0 als Pfad zum drbd-Volume.
Festplatte /dev/vdb1 - Verwenden Sie /dev/vdb1
syncer { rate 1000M; } — Gigabit-Kanalbandbreite verwenden
Erlaube zwei Vorwahlen – eine wichtige Option, die es ermöglicht, Änderungen auf zwei Primärservern zu übernehmen
nach-sb-0pri, nach-sb-1pri, nach-sb-2pri – Optionen, die für die Aktionen des Knotens verantwortlich sind, wenn Splitbrain erkannt wird. Weitere Details finden Sie in der Dokumentation.
auf beiden primär werden – setzt beide Knoten auf primär.

In unserem Fall haben wir zwei absolut identische VMs mit einem dedizierten virtuellen Netzwerk mit einem Durchsatz von 10 Gigabit.

In unserem Beispiel lauten die Netzwerknamen zweier Clusterknoten drbd1 und drbd2. Für einen ordnungsgemäßen Betrieb müssen Sie die Namen und IP-Adressen der Hosts in /etc/hosts abgleichen.

10.10.10.192 drbd1
10.10.10.193 drbd2

Schritt 2. Knoten einrichten:

Auf beiden Servern betreiben wir:

drbdadm create-md drbd0

Clusterspeicher für kleine Webcluster basierend auf drbd+ocfs2

modprobe drbd
drbdadm up drbd0
cat /proc/drbd

Wir erhalten Folgendes:

Clusterspeicher für kleine Webcluster basierend auf drbd+ocfs2

Sie können die Synchronisierung starten. Auf dem ersten Knoten müssen Sie Folgendes ausführen:

drbdadm primary --force drbd0

Schauen wir uns den Status an:

cat /proc/drbd

Clusterspeicher für kleine Webcluster basierend auf drbd+ocfs2

Großartig, die Synchronisierung hat begonnen. Wir warten bis zum Ende und sehen uns das Bild an:

Clusterspeicher für kleine Webcluster basierend auf drbd+ocfs2

Schritt 3. Starten Sie die Synchronisierung auf dem zweiten Knoten:

drbdadm primary --force drbd0

Wir erhalten Folgendes:

Clusterspeicher für kleine Webcluster basierend auf drbd+ocfs2

Jetzt können wir von zwei Servern auf drbd schreiben.

Schritt 4. Installieren und konfigurieren Sie 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

Es muss aufgeschrieben werden /etc/ocfs2/cluster.conf auf beiden Knoten.

Wir erstellen einen FS auf drbd0 auf jedem Knoten:

mkfs.ocfs2 -L "testVol" /dev/drbd0

Hier haben wir unter Verwendung der Standardparameter ein Dateisystem mit der Bezeichnung testVol auf drbd0 erstellt.

Clusterspeicher für kleine Webcluster basierend auf drbd+ocfs2

In /etc/default/o2cb müssen Sie (wie in unserer Konfigurationsdatei) festlegen

O2CB_ENABLED=true 
O2CB_BOOTCLUSTER=ocfs2cluster 

und auf jedem Knoten ausführen:

o2cb register-cluster ocfs2cluster

Dann schalten wir ein und fügen alle Einheiten hinzu, die wir für die automatische Ausführung benötigen:

systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2

Einige davon werden bereits während des Einrichtungsvorgangs ausgeführt.

Schritt 5. Fügen Sie Mount-Punkte zu fstab auf beiden Knoten hinzu:

/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0

Verzeichnis /media/shared Es muss im Voraus erstellt werden.

Hier verwenden wir die Optionen noauto, was bedeutet, dass die Datei beim Start nicht gemountet wird (ich bevorzuge das Mounten von Netzwerkdateien über systemd) und heartbeat=local, was bedeutet, dass auf jedem Knoten der Heartbeat-Dienst verwendet wird. Es gibt auch einen globalen Heartbeat, der besser für große Cluster geeignet ist.

Als nächstes können Sie montieren /media/shared und überprüfen Sie die Inhaltssynchronisierung.

Fertig! Als Ergebnis erhalten wir einen mehr oder weniger fehlertoleranten Speicher mit Skalierbarkeit und ordentlicher Leistung.

Source: habr.com

Kommentar hinzufügen