Wie funktioniert eigentlich RAID 1 genau?

fiestaforever

Lt. Junior Grade
Registriert
Mai 2013
Beiträge
296
(Ich bitte um Entschuldigung, der Thread-Titel ist etwas unbeholfen, aber leider fällt mir kein besserer ein.)

In der letzten Zeit habe ich mich verstärkt in die diversen RAID-Level (und Alternativmethoden) eingelesen und bin aber aus ein paar Dingen nicht ganz schlau geworden.
Eines davon ist die Frage, wie ein RAID 1 eigentlich die Daten schreibt und liest. Dass die Daten gespiegelt, also parallel geschrieben (und im Prinzip auch gelesen) werden, ist klar.

Aber was heißt das genau? Wie werden die Daten geschrieben, und vor allem, wie werden sie gelesen? Was passiert bei Schreib- oder Lesefehlern?
Und wie ist das z.B. bei billigen RAID1-NAS-Boxen?

Bei Schreiben nehme ich an, dass das einfach Adresse für Adresse (LBA) geschieht.
Was passiert bei einem Schreibfehler? Ich vermute, dass die Platte dann selbständig die Daten an eine Ersatzadresse schreibt. Der RAID-"Controller" (Hard- oder Software, deshalb in Anführungszeichen) würde dann überhaupt nichts von dem Schreibfehler mitbekommen (müsste er aber auch nicht). Das würde aber erfordern, dass die Platte eine Art von "Verify" macht, um zu erkennen, dass die Daten nicht korrekt geschrieben wurden. Ist dem so?

Was passiert beim Lesen? Was ist, wenn die eine Platte die Daten schneller liefert als die andere?
Steigt die andere, langsamere, dann irgendwann aus, und wird nur auf die schnellere zurückgegriffen?

Was passiert bei einem Lesefehler auf einer Platte? Wenn eine Platte einen defekten Sektor hat, der nicht gelesen werden kann, wird dann der Inhalt automatisch von der anderen Platte geliefert, oder nimmt der "Controller" auch defekte Daten entgegen? Wenn eine Platte immer mehrere Versuche unternimmt, einen schwer zu lesenden Sektor auszulesen, müssten die "richtigen" Daten von der anderen Platte ja i.d.R. schneller ankommen, oder? Andererseits, wenn die Platte mit dem defekten Sektor im übrigen schneller war, hätte sie ja vielleicht einen Vorsprung ...
Oder meldet eine Platte Lesefehler immer an den "Controller", der dann immer auf die Daten der anderen Platte zurückgreift? Fragen über Fragen.
Wobei ich auch wieder bei der Einheit wäre, die gelesen wird. Erfolgt das Lesen auf Sektoren-, Block-, Cluster-, Datei- oder einer anderen Ebene? Von anderen RAID-Leveln (0,5) weiß ich, dass die Daten in sog. "Chunks" geschrieben und gelesen werden, die alle möglichen Größen von 512B bis 64kB oder mehr haben können. Verwendet RAID 1 auch solche Größen?

Warum ich eigentlich frage: Manchmal liest man (v.a. bei Anbietern "alternativer" Systeme), dass RAID 1 bei Fehlern auf einer Platte gerne "korrupte" Daten an den "Controller" liefern würde, obwohl auf der anderen Platte die korrekten Daten liegen würden.
Ich bin mir nicht sicher, ob das überhaupt möglich ist.

Evtl. unterscheiden sich die RAID1-Implementationen auch. Wie ist das z.B. bei einem Linux-Software-RAID?
Ich vermute mal, dass günstige NAS-Boxen intern Linux-Software-RAID verwenden, weshalb das besonders interessant wäre.
 
Ein Raid ist, im Prinzip, ein hierachisches System.
Ganz unten stehen die Festplatten und darüber steht der Controller. Der Controller verarbeitet die Anfragen aus dem Betriebssystem in Aufgaben für die Platten. Die wiederum arbeiten das ab und liefern ein Ergebnis zurück. Innerhalb ihres Aufgabenbereiches haben die Platten freie Hand, im Zweifelsfall macht aber der Controller die Ansagen.
Im Falle eines Fehlers versucht die Platte erst gemäß ihrer internen Fehlerkorrektur diesen Fehler selbst zu beheben. Wenn das nicht möglich ist, dann können verschiedene Szenarien eintreten:

1. Die Platte behebt den Fehler und der Betrieb läuft störungsfrei weiter.
2. Die Platte behebt den Fehler nicht UND kennt kein Time Limited Error Recovery, kurz TLER. Da der Raidcontroller keine vernünftige Antwort der Platte bekommt, da sie noch immer versucht den Fehler zu beheben, aber der TLER Timeout schon abgelaufen ist, wirft er die Platte aus dem Raid.
3. Die Platte behebt den Fehler nicht UND kennt TLER. Damit wird der Prozess an den Raidcontroller weitergereicht, der die Platte dann bei der Fehlerkorrektur unterstützen kann. Wenn das klappt ist alles ok, wenn nicht fliegt die Platte aus dem Raid.

So viel zur Fehlerbehandlung.

Wenn eine Platte schneller Daten liefert als die anderen Platten, dann wird gewartet bis alle Platten ihre Daten geliefert haben. Nur so kann der Raidcontroller dem Betriebssystem eine korrekt Rückmeldung liefern.
Bei einem Raid 1 wird bei eigentlich allen aktuellen Implementationen parallel von allen Platten gelesen, sodass die Schreibrate des Raid 1 der Schreibrate der langsamsten Platte entspricht während die Leserate sehr grob der Summe der Leseraten aller Laufwerke entspricht bzw. grundsätzlich mit der Anzahl der Platten skaliert.

Bei einem Raid 1 unterscheidet sich ein Hardwareraid nicht so sehr von einem Softwareraid.
 
Es kommt dabei vor allem auf die konkrete Implementierung an. Raid1 sagt erstmal nur aus, dass auf beiden/allen Platten die selben Daten liegen. Was genau in den von dir jeweils genannten Szenarien passiert, kann man daher pauschal nicht beantworten.

Eine "billige" Implementierung liefert vielleicht nocht nicht einmal die Daten parallel von allen Platten, wohingegen eine "teure" Implementierung viele Fehlerquellen durch entsprechenden Logik und Checks abzufangen vermag.
 
@ Lawnmower:
Der reflexhafte Verweis auf irgendwelche allgemein bekannten Webseiten ist nicht unbedingt hilfreich.

Es ist schon eine Weile her, dass ich den Wikipedia-Artikel gelesen habe, aber ich habe mir den Abschnitt zu RAID 0 und RAID 1 noch einmal angesehen. Dort steht u.a.:
RAID 0: Striping – Beschleunigung ohne Redundanz[Bearbeiten]
...
RAID 0 bietet gesteigerte Transferraten, indem die beteiligten Festplatten in zusammenhängende Blöcke gleicher Größe aufgeteilt werden, wobei diese Blöcke quasi im Reißverschlussverfahren zu einer großen Festplatte angeordnet werden. Somit können Zugriffe auf allen Platten parallel durchgeführt werden (engl. striping, was „in Streifen zerlegen“ bedeutet, abgeleitet von stripe, der „Streifen“). Die Datendurchsatz-Steigerung (bei sequentiellen Zugriffen, aber besonders auch bei hinreichend hoher Nebenläufigkeit) beruht darauf, dass die notwendigen Festplatten-Zugriffe in höherem Maße parallel abgewickelt werden können. Die Größe der Datenblöcke wird als Striping-Granularität (auch stripe size, chunk size oder interlace size) bezeichnet. Meistens wird bei RAID 0 eine chunk size von 64 kB gewählt.
...
RAID 1: Mirroring – Spiegelung
...
Die Lesecharakteristik entspricht hierbei einem RAID-0-System. Diese Funktion bieten aber nicht alle Controller oder Softwareimplementierungen an. Sie erhöht die Lese-Geschwindigkeit des Systems enorm, geht aber auf Kosten der Sicherheit. Eine solche Implementierung schützt vor einem kompletten Datenträgerausfall, aber nicht vor Problemen mit fehlerhaften Sektoren, zumindest falls diese erst nach dem Speichern (read after write verify) auftreten.
Das hilft nicht unbedingt weiter und ist etwas vage. Danach gibt es (sinngemäß) wohl Controller, die wie bei RAID 0 mit "Chunks" arbeiten und die abwechselnd von den Platten lesen. Aber nicht alle.
M.E. widerspricht das ein bisschen dem Sinn von RAID 1, und deshalb zweifle ich an der Verbreitung dieser Methode.


@ DunklerRabe:

1.-3. würde bedeuten, dass bei einem Fehler und fehlendem TLER jeder Lesefehler die Platte aus einer RAID fliegen lässt, aber niemals falsche Daten geliefert werden.

Die Logik zur Lesegeschwindigkeit verstehe ich nicht. Wenn der Controller immer wartet, bis alle Platten die Daten geliefert haben, dann müsste auch die Lesegeschwindigkeit immer der Geschwindigkeit der langsamsten Platte entsprechen.
 
Zuletzt bearbeitet:
Der reflexhafte Verweis auf irgendwelche allgemein bekannten Webseiten ist nicht unbedingt hilfreich.
Du hättest ja auch schreiben können was Du schon alles gelesen hast, wenn man so sieht was im Forum tagtäglich für Threads erstellt werden dann ist der Link zu Wikipedia oder Google oft genau das Richtige.

Danach gibt es (sinngemäß) wohl Controller, die wie bei RAID 0 mit "Chunks" arbeiten und die abwechselnd von den Platten lesen. Aber nicht alle.
M.E. widerspricht das ein bisschen dem Sinn von RAID 1, und deshalb zweifle ich an der Verbreitung dieser Methode.
Habe ich auch schon festgestellt: Gewisse Controller lesen Raid 1 wie Raid 0 (z.B selbst schon gesehen bei einem Adaptec 5405), mit Onboard Raid / Fake-Raid mit Intel Controller habe ich das dagegen noch nie festgestellt. Finde ich ein super Feature und "verteiltes" Lesen sollte ja kein Problem sein sofern das Raid gesund ist oder?
 
Zuletzt bearbeitet:
Ja richtig, korrupte Daten werden da eher nicht zurückgeliefert. Natürlich gibt es genug (theoretische) Möglichkeiten um da korrupte Daten geliefert zu kriegen, aber die ergeben sich nicht unbedingt aus dem Raid. Meine etwas vorsichtige Formulierung an der Stelle ergibt sich daraus, dass man trotz aller Unwahrscheinlichkeit niemals ausschliessen sollte, dass ein Raid 1 doch mal korrupte Daten liefert.

Bei der Lesegeschwindigkeit musst du bedenken, dass die schnelleren Platten nach dem Ende des aktuellen Lesejobs ja nicht warten bis sie den nächsten anfangen. Wenn da eine Platte also gewaltig hinterher hinkt, dann beeinflusst das die Gesamtperformance zwar teilweise, allerdings nicht unbedingt in einer extrem relevanten Art und Weise.

Natürlich ist das alles nur Raidtheorie. In der Praxis können, je nach Use Case, leicht andere Ergebnisse rauskommen.
 
Es ist, wie KillerCow schon geschrieben hat, alles von der konkreten Implementierung abhängig. Man muss daher diese Fragen für jeden RAID Controller einzeln beantworten, was aber auch nur sehr lückenhaft gelingen dürfte, einfach weil die Hersteller viele Implmentierungsdetails nicht preisgeben. So gibt es z.B. RAID 1 Controller die Daten immer nur von einer Platte lesen (solange diese keine Lesefehler meldet) und somit kann er parallele Leseanfragen auf beide Platten verteilen und damit beschleunigen.

Schreibfehler werden von einer HDD übrigens beim Schreiben nicht erkannt, dass passiert erst beim Lesen der Daten. Ausnahmen kann es hier geben, wenn der Sektor als schwebend markiert ist, also die Daten die dort stehen schon nicht mehr fehlerfrei gelesen werden können. Wollte man immer alle Daten nach dem Schreiben verifizieren, so dürfte man nur so viel schreiben wie in den Cache passt und müsste danach alles noch mal lesen, hätte also einen gewaltigen Performanceeinbruch beim Schreiben von größeren Dateien.
 
@ Holt:

> Schreibfehler werden von einer HDD übrigens beim Schreiben nicht erkannt, dass passiert erst beim Lesen der Daten.

Was sind dann die Schreibfehler, die manche Platten per SMART melden?

SMART_CrystalDiskInfo_Write-Errors.png
 
Das sind Fehler bei der Positionierung des Schreib/Lesekopfes, Seagate gibt dabei den treffenderen Wert "High Fly Writes" aus.
 
Ah, danke.

Stelle gerade fest, dass der Wert in smartctl anders heißt: "Multi_Zone_Error_Rate".
Auch kein Begriff, unter dem man sich viel vorstellen kann, und von http://linuxwiki.de/SmartMonTools wiederum mit "Fehlerrate beim Schreiben" übersetzt.

Nachtrag: Die in meinem letzten Post gezeigte Platte hat übrigens im Datenträgerintegritäts-Test von H2benchw versagt weil sie verfälschte Daten zurückgeliefert hat, also genau das gemacht hat, was nach der obigen Diskussion (wie ich sie verstanden habe) gar nicht passieren dürfte.
 
Zuletzt bearbeitet:
Würden HDDs alle Daten nach dem Schreiben prüfen, dann wären die Schreibrate zwangsläufig spürbar geringer als die Leserate, weil ja nach dem Schreiben immer erst eine weitere Umdrehung abgewartet werden müsste um die Daten nochmal zu Lesen und zu Prüfen. Wie Du in praktischem jedem Review einer normalen HDD sehen kannst, ist das aber nicht der Fall. Diese Überprüfung der Daten machen die Controller der HDDs nur für Sektoren, die schon Probleme beim Lesen der Daten haben und dann entscheiden sie eben aufgrund des Ergebnisses auch, ob der Sektor durch einen Reservesektor ersetzt werden muss oder nicht. Daher verschwinden Schwebende Sektoren, also solche mit gravierenden Lesefehlern, auch erst wenn diese neu beschrieben werden. Das hatte ich aber schon geschrieben.

"Multi_Zone_Error_Rate" sagt es doch eigentlich ganz gut, viel besser als die Übersetzung mit "Fehlerrate beim Schreiben": Es ist ein Fehler bei dem mehrere Zonen eine Rolle spielen und das bezieht sich eben auf die Zylinder. Da wurde der Kopf nicht richtig über einem Zylinder positioniert.
 
Einfach gesagt:

Es arbeitet so wie wenn du jede Datei von der einen auf die andere Platte kopierst.
Wenn dann eine Disk down ist, "kopierst" du die Daten wieder auf die neue rüber(darum 50% Speicherverlust).
Wenn du zb. mit synctoy eine Replizierung von a nach b und umgekehrt einrichtest, wäre es im Prinzip fast das selbe(nur umständlicher)
 
Zurück
Oben