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!
Schreibe einen Kommentar