ZFS RAID-Z Pool erstellen und verwalten

ZFS »RAID-Z« Pools sind neben den »ZFS Mirror Pools« eine weitere Möglichkeit die Datenintegrität und Verfügbarkeit auch beim Ausfall einer oder sogar mehrerer Platten zu gewährleisten. Das Prinzip ist das gleiche wie bei konventionellen RAID-Systemen1), hier wird zu den Daten eine Parität ermittelt und sowohl die Daten, wie auch die Parität werden so auf den Platten verteilt, dass beim Fehlen der Informationen auf einer Platte (RAID-5) oder mehreren Platten ( ≥ RAID-6) aus den verbliebenen Informationen die fehlende Information restauriert werden kann.

Grundsätzliches

Vereinfacht, kann man sich das Paritätsschema folgendermaßen zB anhand einer »ungeraden Kreuzparität« vorstellen:

0 0 1 0 1 1 0 0 | 1
1 0 1 1 0 1 0 1 | 1
0 0 0 1 1 0 1 1 | 0
-------------------
1 0 0 0 0 0 1 1 | 0

Die erste Zeile »0 0 1 0 1 1 0 0« repräsentieren hierbei die Daten auf einer Platte und die abschließende »1« ergibt sich als Parität durch die ungerade Anzahl der Einsen in den Daten. Die letzte Zeile (unter der gestrichelten Linie) ergibt sich wiederum aus der Anzahl der Einsen in den Datenblöcken darüber. Eine Eins bei einer ungeraden Anzahl Einsen, eine Null bei einer geraden Anzahl Einsen (wobei Null Einsen als gerade Anzahl gewertet wird) Fällt nun zB die erste Platte aus, können aus den verbliebenen Daten die verlorenen Daten der ersten Platte rekonstruiert werden. In der Praxis laufen diese Vorgänge zwar wesentlich komplexer ab aber im Prinzip läuft das nach diesem Schema ab.

Die heute gebräuchlichsten paritäts-basierten RAID-Level sind »RAID-5« und »RAID-6«, wobei bei einem »RAID-5« eine Platte und bei einem »RAID-6« zwei Platten des RAID-Verbunds ausfallen können, ohne das Daten verloren gehen. Bei einem ZFS-RAID entspricht ein »raidz1« (»single-parity«) einem »RAID-5« und ein »raidz2« einem »RAID-6« (»double-parity«). ZFS stellt darüber hinaus ein »raidz3« (»triple-parity«) zur Verfügung, wo man den Ausfall einer dritten Platte ohne Datenverlust hinnehmen kann.

Der Hauptunterschied zu klassischen RAID-Systemen liegt bei RAID-Z in der Vermeidung des »write-holes«, welches entsteht wenn Daten und Prüfsummen (Paritäten) noch nicht vollständig auf die Platten geschrieben wurden und es während diesen Vorgangs zu einem Systemausfall kommt. In so einem Fall sind die Daten auf dem RAID-System nicht konsistent und idR unbrauchbar. ZFS macht sich hier ihr »Copy-On-Write« (CoW) zunutze, wo eine Schreibaktion erst dann als abgeschlossen gilt, wenn alle Teil-Vorgänge (zB das Errechnen und Schreiben der Prüfsumme etc) ebenfalls abgeschlossen sind. Da ZFS vorhandene Daten nicht überschreibt sondern zuerst eine Kopie des zu bearbeitenden Blocks anlegt und dort dann die Änderungen vornimmt, kann bei einem fehlerhaften oder unterbrochenen Schreibvorgang jederzeit auf die alten Daten zurückgegriffen werden. So verfährt ZFS generell, dass ist kein Merkmal nur der ZFS-RAID Komponenten.

»RAID-Z Pools« anlegen

Für einen »RAID-Z« Verband benötigt man mindestens zwei Platten, wobei ein solches sinnvoll aber erst mit mindesten drei Platten betrieben werden kann. Jede weitere Platte im Verbund erhöht dabei die Performance des Gesamtverbundes, weil sich zB Schreibzugriffe auf die Anzahl der Platten verteilt und mit jeder Platte im Verband mehr parallele Schreibzugriffe möglich sind.

Legen wir also ein RAID-Z1 Pool »tank« mit drei Festplatten an:

# zpool create -f tank raidz1 /dev/sdb /dev/sdc /dev/sdd

# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   115K  1,94G  38,6K  /tank

Wir sehen in der Ausgabe des »zfs list« Kommandos zB die totale Kapazität des RAID-Z Pools »tank«, welche um die Größe einer Platte dezimiert wurde. Der Verband besteht aus drei 1GiB Platten und hat eine Kapazität von knappe 2GiB. Die Gesamtkapazität eines RAID-Z1 Pools wird immer um die Kapazität einer Festplatte reduziert (single-parity).

Bei einem »double-parity« basierten RAID-Z Pools, fehlen bei der Gesamtkapazität dann die Summe der Kapazitäten von zwei Platten, bei einer »triple-parity« dann analog dazu drei Platten:

  • »double-parity«:
    # zpool create -f tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
    # zfs list
    NAME   USED  AVAIL  REFER  MOUNTPOINT
    tank   111K  1,93G  43,3K  /tank
  • »triple-parity«:
    # zpool create -f tank raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde
    # zfs list
    NAME   USED  AVAIL  REFER  MOUNTPOINT
    tank  76,5K   976M    30K  /tank

»RAID-Z Pools« erweitern

Einem RAID-Z Pool können ebenso einfach weitere Platten während der Laufzeit hinzugefügt werden, wie in den anderen ZFS-Konzepten »Simple-Pool« und »Mirror-Pool«:

# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    sdb     ONLINE       0     0     0
	    sdc     ONLINE       0     0     0
	    sdd     ONLINE       0     0     0

errors: No known data errors
# zpool add -f tank raidz1 /dev/sde /dev/sdf
# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  raidz1-0  ONLINE       0     0     0
	    sdb     ONLINE       0     0     0
	    sdc     ONLINE       0     0     0
	    sdd     ONLINE       0     0     0
	  raidz1-1  ONLINE       0     0     0
	    sde     ONLINE       0     0     0
	    sdf     ONLINE       0     0     0

errors: No known data errors

tux/zfs_raid-z.txt (17868 views) · Zuletzt geändert: 2012/10/18 17:21 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0