Blog

Bau eines Raspberry Pi-Speicherclusters für den Einsatz von Big Data-Tools zu Hause

Rogier van der Geer

Aktualisiert Oktober 22, 2025
12 Minuten

Aufgrund des Umfangs der Datensätze werden Data Science-Projekte in der Regel auf großen Rechenclustern oder sehr leistungsstarken Maschinen durchgeführt. Und wegen der Kosten für eine solche Infrastruktur erhalten Sie nur dann Zugang zu Data Science-Tools, wenn Sie aktiv an einem Projekt beteiligt sind. Aber stimmt das wirklich oder gibt es eine Möglichkeit, mit Data Science-Tools herumzuspielen, ohne tief in die Tasche greifen zu müssen? Ich beschloss, mein eigenes Nebenprojekt zu starten und meinen eigenen Cluster zu bauen. Auf ein paar Raspberry Pi-Maschinen...

Wie Ron in seinem jüngsten <a href="/neo4j-ha-on-a-raspberry-pi" title="Neo4J auf einem Raspberry Pi") zeigt, ist der Aufbau eines eigenen Clusters seit der Einführung des [Raspberry Pi](Wiki Raspberry_Pi "Raspberry Pi">post) kein unerreichbarer Traum mehr . Mit nur ein paar dieser kleinen Maschinen kann jeder seinen eigenen Cluster bauen.

Jede Version des Raspberry Pi sollte funktionieren, solange er über einen Netzwerkanschluss verfügt. Natürlich verfügen die neueren Pi über mehr Rechenleistung und Speicher, aber wenn Sie Geschwindigkeit wollen, ist die Einrichtung eines Raspberry Pi-Clusters wahrscheinlich ohnehin eine schlechte Idee.

Für jeden Knotenpunkt benötigen Sie eine SD- oder microSD-Karte (je nach Version) mit mindestens 4 GB, aber es ist wahrscheinlich ratsam, etwas mehr Platz zu haben. Außerdem benötigt jeder Knoten ein Micro-USB-Netzteil. Wenn Sie ein wenig Erfahrung mit Elektronik haben, können Sie etwas Geld (und Platz) sparen, indem Sie einen 5V-Stromversorgungsbaustein kaufen und diesen an alle Pi anschließen. Schließlich müssen Sie alle Knoten mit demselben Netzwerk (und dem Internet) verbinden. Sie benötigen also möglicherweise einen Switch und einige Ethernet-Kabel.

Für diesen Beitrag verwende ich einen Cluster aus vier Raspberry Pi B+ Knoten, jeder mit einem Single-Core BCM2708 Prozessor und 512MB RAM. Auf allen läuft das neueste Raspbian und sie haben SD-Karten mit mindestens 16GB. Ihre Hostnamen lauten rpi0 bis rpi3, und sie haben IP-Adressen 10.0.1.0 bis 10.0.1.3.

GlusterFS

In diesem Beitrag konzentrieren wir uns auf GlusterFS, , ein von RedHat entwickeltes verteiltes Dateisystem. Laut RedHat,

GlusterFS ist ein skalierbares Netzwerk-Dateisystem. Mit handelsüblicher Hardware können Sie große, verteilte Speicherlösungen für Medien-Streaming, Datenanalyse und andere daten- und bandbreitenintensive Aufgaben erstellen. GlusterFS ist eine kostenlose und quelloffene Software.

Wir werden sehen, ob wir GlusterFS auf den Raspberry Pis installieren können, um ein schnelles und hochverfügbares Dateisystem zu erstellen.

Einrichten von Netzwerken

Bevor wir mit der Installation von GlusterFS beginnen, müssen wir sicherstellen, dass sich die Knoten gegenseitig im Netzwerk finden können. Um dies zu erreichen, fügen wir die Hostnamen der anderen Knoten zur hosts-Datei jedes Knotens hinzu, die Sie unter /etc/hosts finden. In der Datei hosts des ersten Knotens fügen wir zum Beispiel die folgenden drei Zeilen hinzu:

10.0.1.1 rpi1
10.0.1.2 rpi2
10.0.1.3 rpi3

Wir können die neue Konfiguration testen, indem wir die anderen Knoten anpingen:

user@rpi0~$ ping rpi1 -c 1
PING rpi1  (10.0.1.1)  56(84)  Bytes an Daten.
64  Bytes von rpi1  (10.0.1.1):  icmp_seq=1 ttl=64 Zeit=0,608 ms

Installieren von GlusterFS

Die Installation des GlusterFS-Pakets ist sehr einfach: Führen Sie

user@rpi0~$ sudo apt-get install glusterfs-server

werden alle erforderlichen Pakete auf einem Knoten installiert. Wiederholen Sie diesen Vorgang auf jedem Knoten.

Sondierung der Peers

Nun müssen wir die einzelnen GlusterFS-Server einander vorstellen. Dies geschieht mit dem Befehl peer probe:

user@rpi0~$ sudo gluster peer probe rpi1
Peer Probe: Erfolg.
user@rpi0~$ sudo gluster peer probe rpi2
Peer Probe: Erfolg.
user@rpi0~$ sudo gluster peer probe rpi3
Peer Probe: Erfolg.

Nachdem Sie die Peers geprüft haben, sollten sie in der Peer-Statusliste angezeigt werden:

user@rpi0~$ sudo gluster peer status
Anzahl der Peers: 3

Hostname: rpi1
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Hostname: rpi2
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Hostname: rpi3
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Wenn Sie einen Peer auf einem der Knoten testen, wird dieser automatisch zu den Peer-Listen aller Knoten hinzugefügt. Wenn wir einen Blick auf die Peer-Statusliste auf einem der anderen Knoten werfen, werden die Peers ebenfalls angezeigt:

user@rpi1~$ sudo gluster peer status
Anzahl der Peers: 3

Hostname: 10.0.1.0
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Hostname: 10.0.1.2
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Hostname: 10.0.1.3
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Beachten Sie, dass die IP-Adressen der anderen Knoten in der Liste auftauchen und nicht die Hostnamen. Dies kann behoben werden, indem Sie die Peers in umgekehrter Reihenfolge abfragen. Nach der Ausführung von

user@rpi1~$ sudo gluster peer probe rpi0
Peer Probe: Erfolg.
user@rpi1~$ sudo gluster peer probe rpi2
Peer Probe: Erfolg.
user@rpi1~$ sudo gluster peer probe rpi3
Peer Probe: Erfolg.

sollten die Hostnamen in der Peer-Statusliste sichtbar sein:

user@rpi1~$ sudo gluster peer status
Anzahl der Peers: 3

Hostname: rpi0
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Hostname: rpi2
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Hostname: rpi3
Uuid: xxxxxxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxx
Zustand: Peer im Cluster  (Verbunden)

Möglicherweise müssen Sie diesen Vorgang auch für die übrigen Knoten wiederholen.

Ein Volume erstellen

Jetzt sind wir bereit, ein Volume zu erstellen. Ein Volume ist eine Sammlung von Bricks, wobei ein Brick ein Verzeichnis auf einem der Server ist. Die einfachste Art von Volume ist das verteilte Volume, bei dem die Dateien zufällig auf die Bricks des Volumes verteilt sind. Ein verteiltes Volume hat daher keine Redundanz, was es sehr anfällig für Ausfälle macht. Wir können ein verteiltes Volume mit zwei Bricks mit dem folgenden Befehl erstellen:

gluster volume erstellen    transport tcp server1:/exp1 server2:/exp2

In einem replizierten Volume wird jede Datei in mehrere Bricks repliziert, was für Redundanz sorgt. Die Anzahl der Bricks in einem replizierten Volume sollte ein Vielfaches der Anzahl der benötigten Replikate sein. Wenn die Anzahl der Bricks größer ist als die Anzahl der Replikate, wird das Volume als repliziertes verteiltes Volume bezeichnet. Wir können ein repliziertes Volume mit zwei Bricks und einer Replikatanzahl von 2 mit dem folgenden Befehl erstellen:

gluster volume erstellen    Replikat 2 Transport tcp server1:/exp1 server2:/exp2

Wenn Sie nicht an Redundanz, sondern an einem schnellen Lesen sehr großer Dateien interessiert sind, sollten Sie ein Striped-Volume in Betracht ziehen, bei dem die Dateien auf mehrere Bricks verteilt sind. Wie bei den replizierten Volumes sollte die Anzahl der Bricks in einem Striped-Volume ein Vielfaches der Stripe-Anzahl sein, und wenn die Anzahl der Bricks größer ist als die Stripe-Anzahl, wird es zu einem verteilten Striped-Volume. Die Erstellung eines Striped-Volumes mit zwei Bricks und einem Stripe Count von 2 erfolgt mit dem folgenden Befehl:

gluster volume erstellen    stripe 2 transport tcp server1:/exp1 server2:/exp2

Wenn Sie mehrere Festplatten in jedem Server haben, können Sie ein Volume mit mehr als einem Brick pro Server erstellen:

gluster volume erstellen    transport tcp server1:/exp1 server1:/exp2 server2:/exp3 server2:/exp4

Wenn Sie ein verteiltes Striping- oder verteiltes repliziertes Volume mit mehreren Bricks auf jedem Server erstellen, sollten Sie bedenken, dass die Replikat- und Stripe-Gruppen durch die Reihenfolge, in der Sie die Volumes angeben, festgelegt werden. Beispiel: In einem Volume mit der Replikatanzahl 2 und 4 Bricks auf 2 Servern,

gluster volume erstellen    replica 2 transport tcp server1:/exp1 server1:/exp2 server2:/exp3 server2:/exp4

bilden die ersten beiden Bricks ein Replikat-Set, ebenso wie die letzten beiden Bricks. In diesem Fall bedeutet das, dass die Replikate auf demselben Server liegen, was im Allgemeinen eine schlechte Idee ist. Stattdessen können Sie die Bricks so anordnen, dass die Dateien auf beiden Servern repliziert werden:

gluster volume erstellen    replica 2 transport tcp server1:/exp1 server2:/exp3 server1:/exp2 server2:/exp4

Wir erstellen ein repliziertes verteiltes Volume namens gv mit einer Replikationsanzahl von 2. Wir platzieren die Bricks auf USB-Flash-Laufwerken, gemountet auf /mnt/usb auf jedem der Knoten, in Ordnern namens gv:

user@rpi0~$ sudo gluster volume create gv replica  2  transport tcp rpi0:/mnt/usb/gv rpi1:/mnt/usb/gv rpi2:/mnt/usb/gv rpi3:/mnt/usb/gv
volume create: gv: Erfolg: Bitte starten Sie das Volume, um auf die Daten zuzugreifen

Wenn die Erstellung erfolgreich war, können wir das Volume mit starten:

user@rpi0~$ sudo gluster volume start gv
Volumenstart: gv: Erfolg

Danach können wir überprüfen, ob er tatsächlich gestartet ist:

user@rpi0~$ sudo gluster volume info

Band Name: gv
Typ: Verteiltes Replikat
Volume ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
Status: Gestartet
Anzahl von Steinen:  2  x  2 =  4
Transport-Typ: tcp
Ziegelsteine:
Baustein1: rpi0:/mnt/usb/gv
Baustein2: rpi1:/mnt/usb/gv
Baustein3: rpi2:/mnt/usb/gv
Baustein4: rpi3:/mnt/usb/gv

Ein Volume mounten

Jetzt, wo das Volume gestartet wurde, ist das Mounten ein Kinderspiel. Erstellen Sie zunächst einen Einhängepunkt (z.B. /mnt/gluster), und mounten Sie das Volume dann mit:

user@rpi0~$ sudo mount -t glusterfs rpi0:/gv /mnt/gluster/

Sie können gluster auf jeden Ihrer Knoten verweisen, der Teil des Volumes ist ( rpi1:/gv würde also genauso gut funktionieren), solange sie zum Zeitpunkt des Mountens aktiv sind: Der glusterfs-Client verwendet diesen Knoten nur, um eine Datei zu erhalten, die das Volume beschreibt. Tatsächlich können Sie den Client mit jedem beliebigen Knoten verbinden, auch mit einem, der nicht Teil des Volumes ist, solange er sich in der gleichen Peer-Gruppe wie das Volume befindet.

Sobald das Volume gemountet ist, wird es in der Liste der Dateisysteme angezeigt:

user@rpi0~$ df
Dateisystem 1K-Blöcke Verwendet Verfügbare Nutzung% Eingebunden in
/dev/root
 31134100   1459216  28382804  5% /
devtmpfs  218416         0    218416  0% /dev
tmpfs  222688         0    222688  0% /dev/shm
tmpfs  222688      4484    218204  3% /laufen
tmpfs  5120         4      5116  1% /ausführen/sperren
tmpfs  222688         0    222688  0% /sys/fs/cgroup
/dev/mmcblk0p1
 61384     20480     40904  34% /boot
/dev/sda1
 7658104     19208   7226840  1% /mnt/usb
rpi0:/gv  15316096     35584  14456448  1% /mnt/gluster

Beachten Sie, dass seine Größe fast doppelt so groß ist wie die des USB-Laufwerks in /mnt/usb. Das ist das, was wir erwarten, da das Volume auf vier USB-Laufwerke verteilt ist und alle Daten doppelt repliziert werden.

Wenn Sie möchten, dass das Gluster-Volume bei jedem Start eines Servers eingehängt wird, können Sie den Einhängepunkt zu Ihrem /etc/fstab Datei. In unserem Beispiel würden wir eine Zeile wie diese hinzufügen:

rpi0:/gv /mnt/gluster glusterfs defaults,_netdev  0  0

Montage auf anderen Maschinen

Um das Volume auf einem anderen Rechner zu mounten, müssen Sie den GlusterFS-Client installieren. Auf Debian-basierten Distributionen können Sie dies tun, indem Sie sudo apt-get install glusterfs-client ausführen. Außerdem müssen Sie (einen der) glusterfs Server zur /etc/hosts Datei hinzufügen, wie oben für die Peers beschrieben.

Sie könnten auf Probleme stoßen, wenn die Version von GlusterFS, die im Paket glusterfs-client auf Ihrem Client enthalten ist, nicht mit der Version übereinstimmt, die im Paket glusterfs-server auf Ihren Servern enthalten ist. In diesem Fall können Sie stattdessen den Client aus dem Quellcode installieren.

Leistung

Um die Leistung des neu erstellten Dateisystems zu testen, werden wir einen fünften Raspberry Pi verwenden, auf den ich das Volume wie oben beschrieben gemountet habe. Da es sich auch hier um einen Raspberry Pi handelt, ist zu beachten, dass alle nachfolgenden Leistungsmessungen auch durch die Rechenleistung auf der Client-Seite eingeschränkt sein können (sind).

Leistung schreiben

Wir können die Geschwindigkeit beim Schreiben auf das GlusterFS-Dateisystem testen, indem wir dd verwenden, um eine 64-Megabyte-Datei mit einer variierenden Blockgröße zu schreiben:

user@client~$ dd  wenn=/dev/urandom
 von=/mnt/gluster/file1.rnd
 zählen=65536 bs=1024
65536+0 Datensätze in
65536+0 Datensätze heraus
67108864  Bytes  (67  MB)  kopiert, 239.101 s,  281  kB/s

Die erreichte Geschwindigkeit, 281 kB/s, ist alles andere als beeindruckend. Eine Erhöhung der Blockgröße auf 128 kB erhöht diese Geschwindigkeit erheblich:

user@client~$ dd  wenn=/dev/urandom
 von=/mnt/gluster/file2.rnd
 bs=131072 zählen=512
512+0 Datensätze in
512+0 Datensätze aus
67108864  Bytes  (67  MB)  kopiert, 67.4289 s,  995  kB/s

Diese Geschwindigkeit ist nicht allzu weit von der maximalen Lesegeschwindigkeit von /dev/random entfernt:

user@client~$ dd  wenn=/dev/urandom
 von=/dev/null
 zählen=65536 bs=1024
65536+0 Datensätze in
65536+0 Datensätze heraus
67108864  Bytes  (67  MB)  kopiert, 42.3208 s, 1.6 MB/s

Leseleistung

Das Lesen einer Datei ist viel schneller als das Schreiben, wie Sie vielleicht erwartet haben:

user@client~$ dd  wenn=/mnt/gluster/file2.rnd
 von=/dev/null
 bs=131072
512+0 Datensätze in
512+0 Datensätze aus
67108864  Bytes  (67  MB)  kopiert, 9.89423 s, 6.8 MB/s

Einmal gelesen, bleibt die Datei im Cache gespeichert, wie Sie sehen können, wenn Sie sie erneut lesen:

user@client~$ dd  wenn=/mnt/gluster/file2.rnd
 von=/dev/null
 bs=131072
512+0 Datensätze in
512+0 Datensätze aus
67108864  Bytes  (67  MB)  kopiert, 0.252037 s,  266  MB/s

Kleine Dateien

Erst wenn Sie viele kleine Dateien bearbeiten, sinkt die Leistung wirklich. Wenn wir zum Beispiel einen Ordner mit 1024 Dateien von je 4 kB erstellen:

user@client~$ mkdir /mnt/gluster/dir1/
user@client~$  für  i in  {1..1024}; tun  dd  wenn=/dev/urandom
 von=/mnt/gluster/dir1/file${i}.rnd  bs=4096 zählen=1; fertig

und kopieren Sie diesen Ordner dann rekursiv in einen anderen Ordner:

user@client~$  Zeit  cp -r /mnt/gluster/dir1 /mnt/gluster/dir2

real 3m15.665s
Benutzer 0m0.120s
sys 0m1.900s

dauert es mehr als drei Minuten, um etwa 4 MB zu kopieren! Zum Vergleich: Auf der SD-Karte des Raspberry Pi (die ziemlich langsam ist) dauert dies etwa eine halbe Sekunde:

user@client~$  Zeit  cp -r ~/dir1 ~/dir2

real 0m0.612s
Benutzer 0m0.020s
sys 0m0.590s

Verfügbarkeit

Eines der wichtigsten Versprechen von GlusterFS ist die Redundanz. Wir können dies ganz einfach testen, indem wir einen der Server herunterfahren, woraufhin das Dateisystem reagiert, als wäre nichts geschehen. Sie können sogar zwei der Server herunterfahren, solange Sie nicht zwei Server im selben Replikatset herunterfahren (in unserem Beispiel rpi0 und rpi2 oder rpi1 und rpi3).

Selbst wenn Sie zwei Server, die sich im selben Replikatset befinden, nacheinander vorübergehend herunterfahren (z.B. rpi0 neu starten, ein paar Minuten warten und dann rpi2 neu starten), läuft alles weiter, als wäre nichts geschehen, da GlusterFS die Änderungen automatisch verteilt, wenn der Brick wieder hochfährt. Wenn Sie jedoch nicht genügend Zeit für die Neusynchronisierung einplanen, geht alles schief und es kommt zu Fehlern wie:

user@Client/mnt/gluster$ rm -r *
rm: 'dir1' kann nicht entfernt werden: Transport-Endpunkt ist nicht verbunden
rm: 'dir2' kann nicht entfernt werden: Transport-Endpunkt ist nicht verbunden
rm: Kann 'file3.rnd' nicht entfernen: Ungültiges Argument
rm: Kann 'file4.rnd' nicht entfernen: Ungültiges Argument

Einige dieser Fehler können Sie möglicherweise beheben, indem Sie das Volume auf dem Client neu mounten oder vielleicht alle Server neu starten. Wenn das Problem dadurch nicht behoben wird, versuchen Sie, das Volume neu auszugleichen. Führen Sie auf einem der Server aus:

user@rpi0~$ sudo gluster volume rebalance gv fix-layout start

Fazit

Obwohl die Raspberry Pis eindeutig nicht für diese Art von Dateisystem ausgelegt sind (und natürlich wurde GlusterFS nicht für den Betrieb auf einem Raspberry Pi entwickelt), ist es durchaus möglich, Ihr eigenes hochleistungsfähiges und hochverfügbares Dateisystem zu erstellen. Selbst wenn einer Ihrer Raspberry Pis abstürzt (was bei mir hin und wieder vorkommt), können Sie immer noch auf alle Ihre Dateien zugreifen.

Verfasst von

Rogier van der Geer

Contact

Let’s discuss how we can support your journey.