Das RAID aufzubauen ist eigentlich auch kein Hexenwerk. Jetzt muss nur noch das RAID Array definiert werden, ein Dateisystem muss drauf angelegt werden und das Dateisystem muss dann in den Verzeichnisbaum eingehängt werden. Fangen wir also mal ganz von Anfang an an.
Erstellen des RAIDs
Wir wissen, wir wollen ein RAID5, wir haben die Laufwerke /dev/sdb, /dev/sdc und /dev/sdd zur Verfügung. Außerdem wollen wir die Chunk-Size ändern.
Chunk-Size?
Ein RAID5 schreibt ja eine Datei auf alle ihm zur Verfügung stehende Platten. In unserem Falle sind das 3. Die Chunk-Size legt fest, wie groß der Teil der Datei ist, welche auf eine Platte geschrieben wird. Der Standardwert ist 512k. Das bedeutet für eine Datei, die 1 MB groß ist, dass die ersten 512 KB auf Platte 1, und die zweiten 512 KB auf Platte 2 geschrieben werden. die Paritätsinformationen, die zur Rekonstruktion nötig wären, wenn eine Platte ausfällt, werden auf die jeweils andere Platte geschrieben.
Jedes Chunk, also jeder Teil, der auf die Platten verteilt wird, ist also 512 KB groß. Das ist prima für viele große Dateien, das erhöht tatsächlich die Performance. Hätte man viele kleine Dateien, hätte man ein Problem. Nehmen wir an, wir schreiben viele kleine Dateien, die kleiner als 64 KB sind, dann müssen dennoch Schreiboperationen für 512 KB pro Block und Platte durchgeführt werden. Das würde die Performance wirklich niederdrücken. Da wäre es besser, man hat eine kleinere Chunk-Größe, so 64k wären OK. Ich habe ein Gemisch aus vielen kleinen, einigen mittelgroßen und einigen sehr großen Dateien. Also mache ich einen Kompromiss und entscheide mich für eine Chunk-Size von 128k. Das sollte die Performance nicht zu sehr drücken und stellt eigentlich ein gutes Mittelmaß dar. Im übrigen habe ich gesehen, dass mein QNAP sein RAID mit einer Chunk-Size von 64k angelegt hat.
RAID erstellen
Um unser RAID nun zu erstellen, geben wir folgenden Befehl ein:
sudo mdadm --create --verbose /dev/md0 --level=5 --chunk=128 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
Was genau wollte ich jetzt also von MDADM?
--create
: Erstelle mir ein RAID,--verbose
: sag mir genau, was du da tust,- /dev/md0: nenne das RAID-Gerät dann /dev/md0,
--level=5
erzeuge es als RAID5,--chunk=128
: stelle die Chunk-Größe auf 128k ein,--raid-devices=3
: die Zahl der beteiligten Festplatten oder Partitionen und- /dev/sdb1 /dev/sdc1 /dev/sdd1: das sind die einzelnen beteiligten Partitionen.
Nachdem wir diesen Befehl eingegeben haben, fängt das RAID an sich zu synchronisieren. Wir können dennoch schon damit arbeiten, z. B. ein Dateisystem drauf erstellen.
Um zu sehen, was das RAID gerade tut oder in welchem Zustand es gerade ist, kann man sich die Datei mdstat anzeigen lassen:
cat /proc/mdstat
Und so sieht meine gerade aus:
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
7813772544 blocks super 1.2 level 5, 128k chunk, algorithm 2 [3/2] [UU_]
[>....................] recovery = 0.1% (4061324/3906886272) finish=480.4min speed=135377K/sec
unused devices: <none>
Diese Ausgabe zeigt, das ich beim Erstellen ein kleines Problem hatte, welches normalerweise nicht auftritt. Das lag einfach daran, dass ich den Befehl zum Erstellen des RAIDs gegeben hatte, wo die Festplatten im Standby waren und eine davon nicht rechtzeitig aufgewacht ist... 🙂 Da dies aber sonst nicht vorkommt, habe ich mal darauf verzichtet, das Problem darzustellen. Zur Problemlösung kommen wir noch früh genug.
Nun will ich aber mal darstellen, was diese Ausgabe eigentlich bedeutet:
- Personalities : [raid6] [raid5] [raid4] Diese Zeile zeigt die vom Kernel unterstützten RAID-Modi an.
- md0 : active raid5 sdd1[3] sdc1[1] sdb1[0] Dies ist das RAID-Gerät. Das Wort nach "md0 : " Zeigt an, ob es aktiv, "Active", Nur-Lese-Modus "Read-Only" oder herabgesetzt "Degraded" ist. Anschließend werden das RAID-Level und die beteiligten Geräte aufgelistet.
- 7813772544 blocks super 1.2 level 5, 128k chunk, algorithm 2 [3/2] [UU_] Das sind die Anzahl der Blöcke, RAID-Level, Superblock-Version, Chunk-Größe, genutzter Algorithmus und Laufwerksstatus. Das [UU_] bedeutet, dass die ersten beiden Laufwerke OK sind, aber das 3. nicht.
- [>....................] recovery = 0.1% (4061324/3906886272) finish=480.4min speed=135377K/sec Das ist der aktuelle Status, und wie lange es noch dauert, bis er fertig ist. In diesem Falle sind es 480 Minuten.
- unused devices:
Dies zeigt an, ob noch Laufwerke im RAID angegeben wurden, die aber gerade nicht genutzt werden. Dies ist von Bedeutung, wenn wir ein Hot-Spare, also ein bereits eingebautes Ersatzlaufwerk im System hätten. Haben wir hier aber nicht.
Dateisystem erstellen
Obwohl das RAID gerade dabei ist, sich zu synchronisieren, können wir dennoch damit weiterarbeiten. Zwar ist die Ausfallsicherheit gerade nicht gegeben, aber das ist in diesem Stadium auch nicht so wichtig.
Nun muss ein Dateisystem auf das RAID aufgesetzt werden. Hierzu nehme ich ein EXT4-Dateisystem. Aber, wie sollte es auch anders sein, wird es nicht ganz unkompliziert. Zwar würde es mit einem einfach draufgeklatschten Dateisystem auch prima funktionieren, aber ich will es doch noch etwas optimieren. Vor allem die Chunk-Size kommt hier zum Tragen. Ich erstelle also mein Dateisystem als EXT 4 so:
sudo mkfs.ext4 -v -m .1 -E stride=32,stripe-width=64 /dev/md0
Und was tun diese Optionen nun?
-v
: Ausführliche Ausgabe.-m .1
: Reserviere nur 0,1 % des Dateisystems für Betriebssystem. Standard sind 5 %, aber da wir ein monströs großes Dateisystem anlegen, wäre das reine Platzverschwendung.-E stride=32,stripe-width=64
: Das hat mit der Chunk-Size zu tun. Der Stride-Wert errechnet sich durch Chunk-Size dividiert durch Dateisystemblockgröße. Meine Chunk-Size ist 128, die Dateisystemblöcke sind alle 4 K groß. Also 128 / 4 = 32. Der Stripe-Width-Wert errechnet sich durch Stride multipliziert mit der Anzahl Nutzplatten. In meinem RAID 5 habe ich 3 Platten, das sind 2 Nutzplatten und eine Paritätsplatte, also 2. Dies sind dann 32 * 2 = 64. Dies optimiert den Dateisystemdurchsatz./dev/md0
: Das RAID-Gerät, auf dem das Dateisystem erstellt werden soll.
Das dauert nur ein paar Sekunden bis zu einer Minute, dann ist das Dateisystem bereit.
RAID Konfiguration in Datei speichern
Damit das RAID beim Start des Servers auch immer mitgestartet wird, muss dessen Konfiguration in die Konfigurationsdatei mdadm.conf eingetragen werden. MDADM kann mittels eines Befehls die entsprechende Zeile ausgeben. Was mir nicht gelungen ist, ist die Zeile auch automatisch an die Konfiguration anzuhängen. Daher müssen wir dies mit Markieren und Einfügen erledigen. Zunächst einmal zeigen wir die Zeile an, die in die Konfiguration eingefügt werden soll.
sudo mdadm --detail --scan
Nun markiere ich die Zeile indem ich den Jaws-Cursor verwende. Hier muss man leider die Maus verwenden, ob nun mittels des Jaws-Cursors, einer anderen Methode eines anderen Screenreaders, die die Maus an die entsprechende Stelle zieht oder mittels Sehrest.
Da diese Markierungsmethode ziemlich ungenau ist, füge ich die Zeile in einen leeren Editor ein, um sie von Zeilenumbrüchen zu bereinigen. Anschließend markiere ich die ganze Zeile wieder und kopiere sie in die Zwischenablage.
Ich weiß, es klingt kompliziert, ich weiß ehrlich gesagt auch nicht, warum es nicht funktioniert hat, die Ausgabe direkt in die Konfigurationsdatei umzuleiten. Die Datei hat "Permission denied" gemeldet, obwohl ich es als Super User gemacht habe. Na, egal.
Jedenfalls öffne ich nun die MDADM-Konfigurationsdatei und gehe mit dem Cursor ganz nach unten.
sudo nano /etc/mdadm/mdadm.conf
Übrigens sieht die bereinigte Zeile, die ich ganz unten in die Konfigurationsdatei einfüge, so aus:
ARRAY /dev/md0 metadata=1.2 name=server01:0 UUID=3282449e:63a42eea:ec51f565:89790348
So, die Datei nur noch mit Ctrl+X speichern, fertig.
Dateisystem automatisch einhängen
Damit beim Start des Servers das Dateisystem auch gleich mitstartet, muss es in die Datei fstab eingetragen werden. Hier trägt man alle Dateisysteme ein, die automatisch gemounted werden sollen.
sudo nano /etc/fstab
In dieser Datei stehen schon einige Einträge, die wir aber in Ruhe lassen, weil diese das eigentliche Server-Dateisystem und dessen Auslagerungsdateisystem laden. Ganz unten fügen wir eine Zeile hinzu.
/dev/md0 /raid1 ext4 defaults 0 2
/dev/md0
: Das RAID-Gerät./raid1
: Der Ort, also der Mountpunkt, an dem das RAID ins Dateisystem eingehängt wird.- ext4: Der Typ des Dateisystems.
- defaults: Verwendet die normalen Dateisystemparameter.
Die 0 hinter dem "default", nun, was die tut, weiß ich auch nicht wirklich. Aber die 2 am Ende ist wichtig. Das eigentliche Dateisystem der SSD hat am Ende eine 1. Das legt die Priorität fest, wie die Dateisysteme beim Start auf Fehler überprüft werden. Das eigentliche Root-Dateisystem hat hierbei natürlich die höchste Priorität. Danach erst wird das Dateisystem auf dem RAID überprüft.
Wenn wir nun den Server neu starten, und ins Verzeichnis /raid1 wechseln, befinden wir uns also nicht mehr auf der SSD, sondern im Hauptverzeichnis des RAIDs. Hier können wir natürlich Verzeichnisse anlegen und dergleichen.
Und nun?
Im nächsten Teil werden wir mit dem RAID experimentieren. Wir werden es kaputt machen, herausfinden, welche Platte kaputt ist, es wieder reparieren und dergleichen. Es ist wichtig dies mal gemacht zu haben, jetzt, wo noch keine Daten drauf sind, die verloren gehen könnten. Später, wenn man mal in eine Notlage gerät, weiß man wenigstens, wie man sich da wieder herauswindet... 🙂
Server hat Aua!
Und wenn es dem Server, hier dem RAID, in irgendeiner Art an etwas fehlt, schickt es auch gleich eine Mail. So eine habe ich bekommen, als ich vorhin beim Erstellen auf ein Problem gestoßen bin. Und so eine Mail kann so aussehen:
DegradedArray event on /dev/md0:server01
This is an automatically generated mail message from mdadm
running on server01
A DegradedArray event had been detected on md device /dev/md0.
Faithfully yours, etc.
P.S. The /proc/mdstat file currently contains the following:
Personalities : [raid6] [raid5] [raid4]
md0 : active (auto-read-only) raid5 sdd1[3](S) sdc1[1] sdb1[0]
7813772544 blocks super 1.2 level 5, 128k chunk, algorithm 2 [3/2] [UU_]
unused devices: <none>
Wie gesagt, wie man mit solchen Fehlern umgeht, probieren wir im nächsten Teil aus.