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 erstellentransport 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 erstellenReplikat 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 erstellenstripe 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 erstellentransport 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 erstellenreplica 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 erstellenreplica 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
Unsere Ideen
Weitere Blogs
Contact



