[[:tux|{{ :linux.png?40|}}]]
=====ZFS RAID-Z Pool erstellen und verwalten=====
ZFS >>RAID-Z<< Pools sind neben den __[[:tux:zfs_mirror|»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-Systemen((http://de.wikipedia.org/wiki/RAID)), 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 [[:tux:zfs_copy-on-write|»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