GlusterFS

GlusterFS ist ein netzwerkbasiertes, skalierbares Dateisystem. Es findet u. a. in den Bereichen Cloud Computing, Streaming Media Services und Content Delivery Networks Anwendung. GlusterFS wurde ursprünglich von Gluster Inc. und anschliessend von Red Hat entwickelt, nachdem Red Hat 2011 Gluster übernommen hatte.

Strengenommen ist Gluster kein eigenes Dateisystem wie beispielsweise FS: XFS, sondern nutzt vorhandene Dateisysteme und bietet diese über Rechnergrenzen verteilt als „Volumes“ an. Daher wird Gluster als verteiltes Dateisystem kategorisiert.

Im Juni 2012 wurde Red Hat Storage Server als kommerziell unterstützte Variante von GlusterFS angekündigt. Red Hat kaufte im April 2014 Inktank Storage, das Unternehmen hinter dem verteilten Dateisystem Ceph, und benannte den auf GlusterFS basierenden Red Hat Storage Server in „Red Hat Gluster Storage“ um.

Vorüberlegungen

  • Das OS auf separater/separaten Disks installieren.

  • Frage klären: Deploy der Data-Volumes auf einer Disk, einer Disk-Partition oder einem LVM?
    Disk, wenn diese per UUID in /etc/fstab eingebunden wird.
    LVM macht wegen Benennung in /etc/fstab keine Probleme, wenn eine Disk ersetzt wird. LVM auch dann nehmen, wenn Snapshots in GlusterFS benötigt werden.

Installation

Folgende Schritte auf jedem teilnehmenden (RHEL-)Host durchführen.

  • Mit DNS (inkl. Reverse) und NTP arbeiten.

  • /etc/hosts korrekt setzen.

  • Firewall-Regeln setzen:

    • Port 24007/tcp für glusterd

    • Pro Brick einen TCP-Port

Für aktuelle Versionen anschliessend:

dnf -y install epel-release

# Activate Repo
dnf -y install centos-release-gluster

# for Rocky and others: http://mirror.centos.org/centos-8/8/storage/x86_64/gluster-10/
dnf -y --enablerepo=powertools install glusterfs-server

systemctl enable --now glusterd

Storage-Pool aufsetzen

Pool aktivieren (auf Node gluster01 ausführen):

gluster peer probe gluster02
gluster peer probe gluster03

Bricks konfigurieren (auf jedem Node):

mkfs.xfs -i size=512 /dev/vdb
mkdir -p /bricks/brick01
/etc/fstab
/dev/vdb /bricks/brick01 xfs defaults 0 0

Bemerkung

Natürlich ist ein Eintrag, der mit UUIDs arbeitet, besser. Auch ein LVM (eins pro Brick) wäre besser. Will man Snapshotting-Funktionalität, muss jeder Brick ein Thin provisioned, unabhängiges LVM sein.

mount --all
mkdir /bricks/brick01/vol01

Volume bauen (auf einem Node):

gluster volume create vol01 replica 3 gluster01:/bricks/brick01/vol01 gluster02:/bricks/brick01/vol01 gluster03:/bricks/brick01/vol01
gluster volume start vol01

gluster volume info

Überwachung

gluster peer status
# der Peer, auf dem das ausgeführt wird, wird dabei nicht angezeigt

gluster volume info
gluster volume status
gluster volume status $VOLNAME clients
gluster volume heal $VOLNAME info

Maintenance-Script

Shutdown/Stop all Gluster Nodes:

cd /usr/sbin
wget https://raw.githubusercontent.com/gluster/glusterfs/master/extras/stop-all-gluster-processes.sh
chmod +x stop-all-gluster-processes.sh
/usr/sbin/stop-all-gluster-processes.sh -h

Wird das Skript real mit dem Parameter -g für einen „Graceful Shutdown“ aufgerufen, und es erscheint keine Ausgabe wie:

sending SIGTERM to mount process with pid: 11573
sending SIGTERM to pid: 9231
sending SIGTERM to pid: 9225
sending SIGTERM to pid: 9187
sending SIGTERM to pid: 9181
sending SIGTERM to pid: 13399

… dann hat das Script keine Gluster-Prozesse gestoppt. Grund ist möglicherweise ein laufender Healing-Prozesss.

Volume-Typen

http://docs.gluster.org/en/latest/Administrator%20Guide/Setting%20Up%20Volumes/

  • Distributed: nur verteilt, keine Redundanz

  • Replicated: verteilt plus Replikation = Hochverfügbarkeit

  • Striped

  • Distributed Striped

  • Distributed Replicated

  • Distributed Striped Replicated

  • Striped Replicated

  • Dispersed (interessant, 5 Bricks)

  • Distributed Dispersed

Troubleshooting

gluster volume heal $VOLNAME liefert Launching heal operation to perform index self heal on volume $VOLNAME has been unsuccessful: Quorum not met. Volume operation not allowed.

Wurden in einem n-Node-Setup (n > 2) die Hosts neu gestartet? Dann auf jedem Host systemctl restart glusterd in 30 Sekunden-Abstand ausführen. Anschliessend gluster volume heal $VOLUME starten.

Geht immer noch nicht? Dann lokale Host-Firewall auf Aktivität prüfen, vielleicht blockt sie Netzwerkverkehr.

VMs im oVirt laufen ohne Probleme, aber Gluster meldet mal „Shards out of sync“, und dann mal wieder alles ok - bis zum nächsten Mal?

Ein Poweroff der betroffenen VMs tut Gluster gut, um I/O zu reduzieren und Gluster Zeit zum Sync zu geben, aber welche VMs müssen abgeschaltet werden?

Lässt sich beispielsweise so herausfinden:

  • Shard-Meldung anschauen: Brick gluster:/.../e3596fa3-e9d4-.../images/ac21a5ab-873c-46cb-.../f47f8223-fce2-4c19-...

  • Der entscheidende Tipp: Die GUID nach images/ ist die GUID der Disk der VM in oVirt.

  • Also beispielsweise im oVirt-GUI unter Storage > Disks nach obiger ac21a5ab suchen. Damit wird die passende VM gefunden.

  • VM herunterfahren, Gluster Healing anstossen, VM hochfahren.

Healing für Gluster-Volume angestossen, es erholt sich aber nicht, das Healing läuft endlos? Tipp 1:

Alle VMs in oVirt runtergefahren, und es besser sich nicht? Taucht das hier auf?:

/e80eabe4-ced2-44e7-9ad1-cd48320b8a18/dom_md/ids
/__DIRECT_IO_TEST__
Status: Connected
Number of entries: 2

Dann ist ohne die GUID nachzuschauen die laufende oVirt-Engine schuld. Was hilft, statt auch noch die oVirt-Engine herunterzufahren: Storage Domain in Maintenance Mode schicken.

  • alle VMs auf dem betroffenen Volume herunterfahren

  • Compute > Data Centers > Datacenter auswählen > Storage auswählen > Maintenance

  • Healing anstossen und abwarten

  • Compute > Data Centers > Datacenter auswählen > Storage auswählen > Aktivieren

Healing für Gluster-Volume angestossen, es erholt sich aber nicht, das Healing läuft endlos? Tipp 1:

Nachschauen, welche Clients auf das Volume zugreifen:

systemctl status glusterd
gluster volume status $VOLNAME clients

Log des Clients anschauen:

less /var/log/glusterfs/$MOUNTPOINT.log

Am Ende half der Reboot jedes einzelnen Gluster-Members, und nach dem Reboot ein einzelnes systemctl restart glusterd.

GlusterFS Cheat Sheet

gluster peer detach $PEER
gluster peer probe $PEER
gluster peer status

gluster peer probe $PEER
gluster volume create $VOLNAME replica $REPL $PEER:/path/to/brick ...
gluster volume delete $VOLNAME
gluster volume get all
gluster volume heal $VOLNAME
gluster volume heal $VOLNAME gluster volume heal data info
gluster volume heal $VOLNAME info
gluster volume heal $VOLNAME split-brain bigger-file
gluster volume heal info
gluster volume info
gluster volume rebalance $VOLNAME start
gluster volume rebalance $VOLNAME status
gluster volume replace-brick $VOLNAME $PEER:/path/to/brick
gluster volume set $VOLNAME $KEY $VALUE
gluster volume start $VOLNAME
gluster volume status
gluster volume status $VOLNAME clients
gluster volume stop $VOLNAME
gluster volume tier $VOLNAME start
gluster volume tier $VOLNAME start force
gluster volume tier $VOLNAME status
gluster volume tier $VOLNAME stop

Built on 2024-04-18