ZFS RAID

ZFS unterstützt natürlich „RAID“ ein einfacher Mirror ist genau so möglich wie eine Art Raid5 (raidz genannt) oder eine Art Raid6 (raidz2 genannt). Natürlich sind spare Platte kein Problem und Striping ist überhaupt kein Problem.

Ich habe ja bereits einen Pool mit dem Namen backup. Wenn ich aus diesem nun lieber einen Mirror über zwei Platten machen möchte geht das so:

$ zpool attach backup c2d1p0 c3d0p0
Make sure to wait until resilver is done before rebooting.

Wichtig ist hier die richtige Reihenfolge der Platten. Denn man Packt ja der Platte c2d1p0 im Pool backup die Platte c3d0p0 als Spiegel hinzu. Vertauscht man die Platten im Befehlt spiegelt ZFS die leere Platte auf die Datenplatte. Auch ein schöner Mirror, sogar genau wie angegeben aber so leer 😛

Mal angenommen alles wurde richtig angegeben, dann beginnt ZFS nun den Pool zu resilvern. Da es bei ZFS keine Trennung mehr zwischen RAID / Volumemanager bzw. Dateisystem gibt, weiss ZFS genau wo Daten liegen und spiegelt nur diese. Sind nur ein paar GB belegt ist der sync das resilvering schnell durch. Andere Systeme würden hier nun stumpf Block für Block herüber schieben. Egal ob in diesem nun Daten liegen oder nicht. Woher soll dieses auch wissen was das Dateisystem macht? Daher kann es je nach Plattengröße sehr lange dauern.
// Schon mal versucht sechs 3TB Platten eines RAID6 per Linux mdadm nach einem Plattentausch im Betrieb zu resilvern? 10 Stunden sind da nichts, selbst wenn nur 1TB belegt ist… //

Zurück zum backup Pool. Um sich den Status des Pools anzuschauen gebe ich folgendes ein:

$ zpool status backup
pool: backup
state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Oct 31 13:18:13 2011
444M scanned out of 4,04G at 18,5M/s, 0h3m to go
440M resilvered, 10,72% done
config:

NAME        STATE     READ WRITE CKSUM
rpool       ONLINE       0     0     0
mirror-0  ONLINE       0     0     0
c2d1p0  ONLINE       0     0     0
c3d0p0  ONLINE       0     0     0  (resilvering)

errors: No known data errors

Ja das Testsystem ist LANGSAM 😉 ich habe alte Hardware genommen (sehr alte Hardware). Denn noch sieht man das ZFS nur die eigentlichen Daten resilverd. Hier also knapp 4,04GB. Würde es die ganzen 80GB resilvern hätte ich eine längere Kaffeepause! Nach getaner Arbeit schaut es nun so aus:

$ zpool status backup
pool: backup
state: ONLINE
scan: resilvered 4,04G in 0h5m with 0 errors on Mon Oct 31 13:33:00 2011
config:

NAME        STATE     READ WRITE CKSUM
rpool       ONLINE       0     0     0
mirror-0  ONLINE       0     0     0
c2d1p0  ONLINE       0     0     0
c3d0p0  ONLINE       0     0     0

errors: No known data errors

Ein 80GB Mirror in 5 Minuten resilvern und das auf kack Hardware… Schöne Zeit, oder?

Will ich direkt einen Pool als Mirror anlegen geht dieses natürlich mit:

$ zpool create backup mirror c2d1p0 c3d0p0
Make sure to wait until resilver is done before rebooting.

Sind meine Datenplatten gespiegelt ist dieses gut gegen Datenverlust. Fällt eine Systemplatte aus kommen die User denn noch nicht an ihre Daten. Daher macht es Sinn einen root pool zu mirrorn. Das ist nun etwas aufwändiger, vor allem da man ja grub nicht vergessen darf. Denn was bringt einem ein gespiegelter Root Pool, wenn man den ohne Bootmanager nicht booten kann? Ich habe da nun folgendes gemacht…

So schaut der rpool meines Testsystems aus:

$ zpool status rpool
pool: rpool
state: ONLINE
scan: none requested
config:

NAME        STATE     READ WRITE CKSUM
rpool       ONLINE       0     0     0
c2d0s0    ONLINE       0     0     0

errors: No known data errors

Diesen möchte ich nun auf die Platte c2d1s0 spiegeln. Dafür lege ich auf dieser zuerst ein Lable an:

$ format c2d1s0
selecting c2d1s0
NO Alt slice
No defect list found
[disk formatted, no defect list found]
 FORMAT MENU: disk       - select a disk type       - select (define) a disk type partition  - select (define) a partition table Total disk size is 9729 cylinders Cylinder size is 16065 (512 byte) blocks Cylinders Partition   Status    Type          Start   End   Length    % =========   ======    ============  =====   ===   ======   === 1       Active    Solaris2          1  9728    9728    100 SELECT ONE OF THE FOLLOWING: 1. Create a partition 2. Specify the active partition 3. Delete a partition 4. Change between Solaris and Solaris2 Partition IDs 5. Edit/View extended partitions 6. Exit (update disk configuration and exit) 7. Cancel (exit without updating disk configuration) Enter Selection: 6 format> quit 

Nun die Partitionseinstellungen der s2 von der Hauptplatte auf die zweite Platte übernehmen:

$ prtvtoc /dev/rdsk/c2d0s2 | fmthard -s - /dev/rdsk/c2d1s2
fmthard:  New volume table of contents now in place.

Dann die zweite Platte dem Pool als mirror hinzuzwingen:

$ zpool attach -f rpool c2d0s0 c2d1s0
Make sure to wait until resilver is done before rebooting.

Damit sollte der rootpool gespiegelt sein. Nun fehlt noch der Bootmanager grub auf der zweiten Platte.

$ installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c2d1s0
stage2 written to partition 0, 275 sectors starting at 50 (abs 16115)
stage1 written to partition 0 sector 0 (abs 16065)

Fertig….

Jetzt reiße ich einfach mal die eigentliche Hauptplatte aus dem Testsystem und starte die Kiste neu. Nach ordentlichem Boot (muuaaahhhhrrrr) schaue ich mal den Status des Pools an:

$ zpool status
pool: rpool
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid.  Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-4J
scan: scrub in progress since Mon Oct 31 13:47:29 2011
17,8M scanned out of 4,06G at 261K/s, 4h30m to go
0 repaired, 0,43% done
config:

NAME        STATE     READ WRITE CKSUM
rpool       DEGRADED     0     0     0
mirror-0  DEGRADED     0     0     0
c2d0s0  FAULTED      0     0     0  corrupted data
c2d1s0  ONLINE       0     0     0

errors: No known data errors

Passt und funktioniert also wie gewünscht. Weiter gehts!