FireDrunk schreef op vrijdag 14 december 2012 @ 13:11:
Dat verhaal van die ouderwetse RAID5 engine trek ik zelfs in twijfel. Niet alle RAID5 engines doen dat volgens mij. Uit mijn ervaring haal ik even op dat ik nog NOOIT een RAID5 setup heb gezien, die read performance heeft van 3 disks als deze maar uit 3 devices bestaat. Er word namelijk altijd een full-stripe gelezen, omdat de parity niet altijd op een vaste plek staat (die wisselt namelijk per keer van device).
Toevallig heb ik geom_raid5 op de pijnbank gelegd voordat ik met ZFS aan de slag ging, en ik weet dat dat daar wel zo werkt. Volgens mij doen veel RAID5 engines dat ook zo.
Dat kun je simpelweg controleren door naar de sequential read te kijken. Als de parity wordt meegelezen, kan deze nooit hoger zijn dan de STR snelheid van N-1 disks. Dus aangenomen dat een disk 100MB/s doet, kan RAID5 met 3 disks ofwel 200MB/s lezen als het parity leest, ofwel max. 300MB/s lezen als het van alle 3 disks exclusief parity leest.
Alleen dat laatste klopt niet helemaal; die 300MB/s haal je namelijk nooit. Waarom? De parity wordt wel keurig overgeslagen en de 'parity disk' (distributed maar je begrijpt wat ik bedoel) leest dus alvast de volgende blok uit, maar dat betekent wel dat het om de zoveel tijd een blok moet overslaan. Dat overslaan betekent dat het mechanische gedeelte niet altijd nuttig gebruikt kan worden. Bij SSDs heb je dat probleem niet.
Hetzelfde probleem komt voor bij mirrors. Theoretisch kun je bij mirrors net zo snel lezen als van RAID0, héél theoretisch dan want als je dit probeert loop je tegen hetzelfde probleem aan: disk2 wil dan een plek overslaan en alvast de volgende blok lezen, maar dat elke keer overslaan zorgt wel dat de disk maar 50% van de tijd effectief data kan lezen van het mechanische medium. Althans bij kleine blok groottes. Pas bij veel grotere blok groottes kan de schijf seeken en haal je bijna dezelfde STR snelheid als een RAID0. ZFS doet dat naar alle waarschijnlijkheid, want RAID1 read komt aardig dicht in de buurt van RAID0.
RAID-Z heeft al die gegevens in metadata volgens mij, en kan daarom juist wél een hogere read performance halen, omdat hij vooruit kan plannen.
Juist RAID-Z kan geen voordeel halen uit de 'parity disk' omdat RAID-Z werkt zoals een RAID3. Elke I/O request wordt uitgesmeerd over alle disks (ex parity) dus je kunt de parity disk wel iets anders laten doen, maar effectief win je daar niets bij. RAID5 wel omdat die de parity disk een eigen I/O request kan laten lezen.
Wat jij zegt over mirrors klopt wel, maar de checksum word dus wel gevalideerd, alleen word deze gevalideerd tegen de data van de disk aangehouden van welke de data daadwerkelijk gelezen is.
ZFS kan dus altijd garanderen dat de data die je daadwerkelijk geleverd krijgt, altijd 100% consistent is. En inderdaad, op de disk waarvan NIET gelezen is, kan bit rot zitten. Deze word inderdaad pas gezien bij een scrub.
Dat was dus exact mijn punt. Bij mirrors is het 50/50 kans dat je on-disk corruptie niet detecteert omdat per blok maar van één bron/disk wordt gelezen, pas als die blok niet overeenkomt met de checksum, wordt de tweede bron/disk aangesproken.
Als mijn theorie hierboven klopt, dan betekent dit dat een volledige read van alle data (bijvoorbeeld met rsync) bij een mirror dus
niet gelijk is aan een scrub, terwijl bij een RAID-Z dat
wel gelijk is aan een scrub, omdat ook de parity wordt gevalideerd. Dat laatste weet ik niet zeker en hoop ik te kunnen controleren met wat testjes...
Update
Wat betreft dat laatste lijk ik geen gelijk te hebben:
code:
1
2
3
4
5
6
7
| dT: 1.002s w: 1.000s filter: gpt
L(q) ops/s r/s kBps ms/r w/s kBps ms/w %busy Name
0 1 1 32 0.7 0 0 0.0 0.1| gpt/seagate1
0 1 1 32 0.8 0 0 0.0 0.1| gpt/seagate2
0 1 1 32 0.6 0 0 0.0 0.1| gpt/seagate3
0 0 0 0 0.0 0 0 0.0 0.0| gpt/seagate4
0 2 2 96 4.2 0 0 0.0 0.8| gpt/seagate5 |
Je ziet hier dat gpt/seagate4 wordt overgeslagen. Seagate5 doet extra werk waarschijnlijk omdat het metadata moet inlezen om de checksum te kunnen valideren. Aangezien de schijf hiervoor moet seeken, duurt dit ook langer (4.2ms versus 0.7ms gemiddeld voor de andere disks).
Als ik gelijk had gehad, zou seagate4 ook meegedaan hebben. Soms zie ik inderdaad alle 5 disks bezig, maar waarschijnlijk omdat de metadata voor die leesactie zich dan op die schijf bevindt.
Mijn voorlopige conclusie is dus dat een
scrub altijd nodig is om zeker te zijn dat er geen corruptie aanwezig is op de disks. Simpelweg alle gegevens inlezen met rsync is dus niet voldoende om die maximale zekerheid te krijgen, natuurlijk al wel vrij veel zekerheid; maar niet maximale zekerheid.
[
Voor 15% gewijzigd door
Verwijderd op 14-12-2012 13:47
]