Software-RAID mit Linux

RAID-Systeme (Redundant Array of Independent Disks) bieten ausfallsichere bzw. wiederherstellbare Datenträger. Dabei werden mehrere Festplatten zu einem virtuellen Datenträger verknüpft. So kann der Ausfall von einzelnen Festplatten kompensiert werden.

Über die Jahrzehnte wurden unzählige sog. RAID-Level geschaffen, die nicht nur Ausfallsicherheit schaffen, sondern auch Vorteile im Bereich der Lese- oder Schreibgeschwindigkeit bieten.

Dieser Artikel beschäftigt sich nur mit standardisierten, Hersteller-unabhängigen RAID-Leveln. Die Eigenentwicklungen der diversen Hersteller werden bewusst ignoriert. Einerseits sind sie im Software-RAID völlig irrelevant, andererseits spielen sie auch im Hardware-RAID heute praktisch keine Rolle mehr.

RAID-Level

Bevor man sich für ein RAID-Level entscheiden kann, muss man ihre Unterschiede kennen. Dieser Artikel ist keine wissenschaftliche Abhandlung und zeigt lediglich die Kernunterschiede auf. Wer mehr Details benötigt, findet diese z.B. im äußerst umfangreichen Wikipedia-Artikel.

JBOD – Just a Bunch of Disks

Schematische Datstellung JBOD
Schematische Darstellung von JBOD

Wie der Name bereits sagt, handelt es sich hier nicht um ein RAID-System. JBOD kann jedoch sowohl im Software- als auch im Hardware-RAID eingerichtet werden. Hier werden mehrere Festplatten „aneinander gehängt“, sodass ein großer virtueller Datenträger entsteht. Ist der erste Datenträger voll, wird auf dem zweiten weiter geschrieben. Fällt jedoch ein Datenträger aus, gibt es keine Wiederherstellungsmöglichkeit für die Dateien, die auch ihm gespeichert waren. Geschwindigkeitsvorteile gibt es auch nicht, weil die Festplatten nur hintereinander „aufgereiht“ werden.

RAID 0 – Striping Array

Schematische Datellung von RAID 0
Schematische Darstellung von RAID 0

RAID 0 ist eigentlich ebenfalls kein RAID, denn es ist nicht redundant – daher auch die Nummer 0. Es bietet jedoch deutlich mehr als JBOD.

Bei RAID 0 wird jede Datei in sog. Streifen aufgeteilt („striping“) und auf die Festplatten des Arrays verteilt. Da die Datenmenge pro Festplatte nun deutlich geringer ist, werden i.d.R. sowohl Lese- als auch Schreibzugriffe beschleunigt.

Die Geschwindigkeitsvorteile reduzieren sich oder fallen weg, wenn mehrere Festplatten den gleichen BUS nutzen, z.B. bei SCSI (7 Geräte an einem Kabel) oder beim alten P-ATA (2 Geräte an einem kabel) der Fall war.

Da jede Datei auf alle Festplatten verteilt wird, ist bei dem Ausfall einer Festplatte aber auch alles verloren.

Die Stripes sind immer gleich groß und eine Datei verbraucht gleich viele Stripes auf allen Festplatten. Bei der Einrichtung muss die Größe der Stripes daher mit bedacht gewählt werden, denn 32 KB (Standard-Wert) ergeben z.B. bei 5 Festplatten eine Mindest-Dateigröße von 160 KB. Jede Datei verbraucht dann also mindestens 160 KB oder ein Vielfaches davon.

RAID 1 – Mirroring oder Duplexing Array

Schematische Datellung von RAID 1
Schematische Darstellung von RAID 1

RAID 1 bietet 100% Ausfallschutz. Bei RAID 1 der Festplatteninhalt auf eine andere Festplatte gespiegelt. Fällt die eine aus, kann mit der anderen verzugslos weitergearbeitet werden.

Abhängig von der Frage, ob Informationen gleichzeitig oder nacheinander auf die einzelnen Festplatten geschrieben werden, spricht man entweder vom Mirroring (gleichzeitiges Schreiben) oder vom Duplexing Array (nacheinander Schreiben).

Der Unterschied ist i.d.R. an von der Hardware und der Anschlussart der Festplatten abhängig. Teilen sich mehrere Festplatten einen BUS (IDE/P-ATA oder SCSI), kann immer nur eine Festplatte nach der anderen beschrieben werden. Fällt eine Festplatte während eines Schreibzugriffs aus, enthält im Duplexing System die verbleibende Platte nicht exakt die gleiche Information, weil der letzte Schreibzugriff vor dem Ausfall des Systems nur auf einer Festplatte durchgeführt wurde.

Im Gegensatz zur landläufigen Meinung kann ein RAID 1 auch mehr als 2 Festplatten besitzen. Die Speicherkapazität erhöht sich jedoch nicht. Alle Festplatten im RAID 1 Array enthalten die identischen Informationen.

RAID 2 – Hemming-System

RAID 2 ist ein historisches System, das geschaffen wurde, um Lesefehler zu beseitigen. Mit der Einführung von ECC (Error Correction Code) in der Hardware aller Festplatten wurde RAID 2 irrelevant. Es kann zwar immer noch eingerichtet werden, bietet aber keinerlei Vorteile mehr.

RAID 3 – Bit-Striping Array mit Parity-Laufwerk

Schematische Datellung von RAID 3
Schematische Darstellung von RAID 3

Bei RAID 3 werden mindestens 3 Festplatten zu einem virtuellen Laufwerk mit Ausfallsicherheit für eine Festplatte zusammengeschlossen.

Alle, bis auf eine Festplatte bilden praktisch ein RAID 0. Dateien werden allerdings nicht in Stripes aufgeteilt, sondern bitweise auf die Festplatten verteilt. So wird Speicherplatz gespart.

Auf einer Festplatte (üblicherweise die letzte) wird die XOR-Verknüpfung der anderen Festplatten gespeichert. Das ist quasi die Information, ob die Quersumme der Bits auf den anderen Festplatten gerade (0) oder ungerade (1) ist.

Fällt das Parity-Laufwerk aus, ist nicht verloren und es kann verzugslos weitergearbeitet werden. Fällt eine der Datenfestplatten aus, kann mit dem verbleibenden Daten und der Parity darauf geschlossen werden, ob auf der ausgefallenen Festplatte eine 0 oder eine 1 stand.

Abgesehen von teuren Hardware-RAID-Controllern ist RAID 3 bis zum Abschluss der Wiederherstellung nicht nutzbar.

RAID 4 – Block-Striping Array mit Parity-Laufwerk

Schematische Darstellung von RAID 4
Schematische Darstellung von RAID 4

RAID 4 macht prinzipiell das gleiche wie RAID 3.

Bei den Datenfestplatten kommt allerdings ein richtiges RAID 0 mit Stripes zum Einsatz. Dadurch wird der Rechenaufwand geringer, weil Dateien in weniger Teile geteilt werden.

Allerdings kommt es insbesondere bei vielen Festplatten zu einem größeren Speicherverbrauch (s.o.).

RAID 5 – Block-Striping Array mit verteilter Parity

Schematische Darstellung von RAID 5
Schematische Darstellung von RAID 5

Durch dieses statische Parity-Laufwerk kommt es bei RAID 3 und 4 zu starken Leistungseinbußen während des Schreibens, denn jeder Schreibzugriff, egal auf welcher Datenfestplatte, hat immer eine Änderung der Parity und damit einen Schreibzugriff auf das Paritylaufwerk zur Folge.
RAID 5 begegnet der Herausforderung, indem es die Parity gleichmäßig auf alle Festplatten verteilt.

Von dieser Verteilung abgesehen, funktioniert es genauso wie ein RAID 4.

RAID 6 – Block-Striping Array mit doppelter, verteilter Parity

Schematische Darstellung von RAID 6
Schematische Darstellung von RAID 6

Während der Wiederherstellung eines RAID 3, 4, oder 5 sind die Daten völlig ungeschützt. Fällt eine weitere Festplatte aus bevor die Wiederherstellung abgeschlossen wurde, sind alle Daten verloren.

Um dieses Problem zu beseitigen bildet RAID 6 eine zweite Parity, die sich aus allen Datenbits und der ersten Parity berechnet. Dadurch entsteht eine Ausfallsicherheit von 2 Festplatten.

Kombinierte RAID-Level

Schematische Darstellung von RAID 01
Schematische Darstellung von RAID 01

Die zuvor genannten RAID-Level 0 bis 6 können miteinander kombiniert werden.

Ein bekanntes Beispiel dafür ist das RAID 10 bzw. 01. Hier werden zwei gleich große RAID 0 gebildet, die dann zu einem RAID 1 zusammengeschlossen werden. Dadurch können die Geschwindigkeitsvorteile von RAID 0 mit der 100-prozentigen Ausfallsicherheit von RAID 1 kombiniert werden.

Selbstverständlich sind auch ausgefallenere Kombinationen wie RAID 15 oder RAID 115 möglich. Dazu sind aber in aller Regel Hardware-RAID-Controller erforderlich.

Einsatz im Software-RAID md

Erstellen eines Arrays

Die Erstellung eines Software-RAID funktioniert mit einigen wenigen Befehlen.

Die zugrunde liegenden Partitionen müssen exakt gleich groß sein. Der folgende Befehl fasst z.B. die beiden Partitionen /dev/sda1 und /dev/sdb1 zu einem RAID 1 mit dem Namen /dev/md0 zusammen:

# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

Durch den Parameter –level können natürlich auch andere RAID-Level gewählt werden.

Der Parameter –raid-devices gibt die Anzahl der einzusetzenden Partitionen an, die am ende des Befehls aufzulisten sind.

Nach der Erstellung wird das Array im Hintergrund erstellt. Der PC sollte während dieser Zeit nicht ausgeschaltet werden. Davon abgesehen, kann er bereits jetzt regulär genutzt werden, ist aber aufgrund der laufenden Erstellung des RAIDs deutlich langsamer. Linux führt die Erstellung des RAIDs mit minimaler Priorität aus. Wer schnell fertig sein möchte, sollte den PC bis zum Abschluss der Maßnahme in Ruhe lassen – immerhin gibt es bis dahin auch keine Ausfallsicherheit.

Den Status der Synchronisation schreibt Linux in die Datei /proc/mdstat wo er mit einem simplen Befehl abgefragt werden kann:

# watch cat /proc/mdstat
Every 2.0s: cat /proc/mdstat media: Sun Mar 3 10:03:10 2019
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[1] sda2[0]
2928036288 blocks super 1.2 [2/2] [UU]
[===============>…..] resync = 77.4% (2266735232/2928036288) finish=1473.7min speed=7478K/sec
bitmap: 8/22 pages [32KB], 65536KB chunk
md0 : active raid1 sda1[0] sdb1[1]
2095104 blocks super 1.2 [2/2] [UU]
unused devices: <none>

Alternativ kann auch der Befehl mdadm genutzt werden, um weitere Informationen zu erhalten:

# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Mar 2 05:05:10 2019
Raid Level : raid1
Array Size : 2095104 (2046.00 MiB 2145.39 MB)
Used Dev Size : 2095104 (2046.00 MiB 2145.39 MB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Sun Mar 3 04:50:46 2019
State : clean Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Consistency Policy : resync
Name : rescue:0
UUID : 91f5d150:ef17c72d:0cd6bc9f:0a89d666
Events : 69
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1

Hotspare hionzufügen und entfernen

Hotspare-Festplatten sind Festplatten, die für den Notfall bereitgehalten werden. Eine Hotspare-Festplatte ist bereits im System verbaut und korrekt paritioniert. Die einzelnen Partitionen werden des RAID-Arrays so zugeteilt, dass Linux selbstständig mit der Wiederherstellung beginnen kann, sobald eine Festplatte ausfällt.

So könnte die Partition /dev/sdc1 dem zuvor erstellten Array als Hotspare hinzugefügt werden:

# mdadm --manage /dev/md0 -a /dev/md0 /dev/sdc1

Genauso kann sie auch jederzeit wieder entfernt werden:

# mdadm --manage /dev/md0 -r /dev/sdc1

Das funktioniert auf diese Art allerdings nur, solange sie auch tatsächlich noch eine Hotspare-Partition ist und noch nicht für eine Wiederherstellung genutzt wurde.

Wiederherstellung (Rebuild) eines Arrays

Fällt ein Array aus, muss zuerst einmal das defekte Gerät entfernt werden – in diesem Beispiel /dev/sdb1:

# mdadm --manage /dev/md0 -r /dev/sdb1

Sofern ein Hotspare zur Verfügung steht, beginnt Linux im Hintergrund bereits unmittelbar nach dem Ausfall mit der Wiederherstellung.

In jedem Fall muss schnellstmöglich eine neue Festplatte eingesetzt werden – entweder um die defekte Platte zu ersetzen, oder um wieder eine neue Hotspare-Platte einzurichten. Dabei muss die Partitionierung nicht aufwendig von Hand erstellt werden. Auf hierfür hält Linux ein praktisches Tool bereit:

# sfdisk -d /dev/sda > /tmp/part_table
# sfdisk /dev/sdb < /tmp/part_table

Anschließend kann die neue Festplatte /dev/sdb eingebunden werden:

# mdadm --manage /dev/md0 -a /dev/sdb1

Wenn keine Hotspare-Platte zur Verfügung stand, beginnt Linux nun automatisch mit der Wiederherstellung. Sofern die Wiederherstellung von /dev/md0 mit Hilfe der Hotspare-Partition /dev/sdc1 bereits gestartet wurde, ist /dev/sdb1 nun die neue Hotspare-Partition.

Alte Festplatte ersetzen

In manchen Situationen gilt es eine Festplatte präventiv, d.h. bevor sie versagt zu ersetzen. Das kann z.B. erforderlich werden, wenn die SMART-Werte der Festplatte ein bevorstehendes Versagen anzeigen. In diesem Beispiel soll die Festplatte /dev/sdb aus dem zuvor erstellten Array ersetzt werden.

Zu Beginn wird (falls noch nicht geschehen) eine Hotspare-Platte /dev/sdc hinzugefügt:

# sfdisk -d /dev/sda > /tmp/part_table
# sfdisk /dev/sdb < /tmp/part_table
# mdadm --manage /dev/md0 -a /dev/md0 /dev/sdc1

Danach wird die Partition /dev/sdb1 manuell auf faulty (=fehlerhaft) gesetzt und aus dem Array entfernt:

# mdadm --manage --set-faulty /dev/md0 /dev/sdb1
# mdadm --manage /dev/md0 -r /dev/md0 /dev/sdb1

Nachdem der Rebuild fehlerfrei zu Ende gelaufen ist, kann der PC heruntergefahren und die Festplatte /dev/sdb entfernt werden.

Löschen eines Arrays

Ein erstelltes Array kann jederzeit gelöscht werden. Dazu muss es zuerst deaktiviert werden:

# mdadm --stop /dev/md0

Nachdem das Array deaktiviert wurde, bleibt auf allen Datenträgern der letzte Informationsstand erhalten. Bei einem RAID 1 könnte der Datenträger mit geringem Aufwand außerhalb des RAID genutzt werden. Um den Superblock, in dem die Informationen über das RAID-Array gespeichert sind, von beiden Partitionen zu löschen, nutzt man folgendes Kommando:

# mdadm --zero-superblock /dev/sda1
# mdadm --zero-superblock /dev/sdb1

Natürlich muss die Festplatte komplett überschrieben werden, um enthaltene Daten tatsächlich zu löschen. Nach Entfernung des Superblocks kann die Festplatte aber wieder ganz normal als allein stehender Datenträger genutzt werden.

Überwachung und E-Mail-Benachrichtigung

Linux überwacht die eingebundenen Arrays dauerhaft. Auf Wunsch kann auch eine Benachrichtigung per E-Mail erfolgen. Dazu wird in der Datei
/etc/mdadm/mdadm.conf bei MAILADDR statt root die gewünschte Zieladresse eingetragen.

Selbstverständlich ist für den Versand von Mails die Einrichtung eines E-Mail-Diensts wie z.B. Postfix erforderlich.

Quellen: Die schematischen Darstellungen der RAID-Systeme wurden Wikimedia entnommen (User Cburnett)

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.