Im Gegensatz zu einem ZFS Simple Pool bietet ein »ZFS Mirror Pool« durch die Spiegelung Redundanz und somit Ausfallsicherheit. In einem klassischen Setup ist dieses Konzept mit einem »RAID-1« vergleichbar. Ein ZFS Mirror Pool ist im Prinzip genau so einfach zu erstellen, wie ein ZFS Simple Pool, jedoch sind dafür logischerweise mindestens zwei Platten erforderlich, es können aber auch drei oder mehr Platten sein. Die Entwickler von ZFS gehen sogar soweit, dass sie sagen, dass es sinnvoll ist die beiden Platten an jeweils einen Controller zu betreiben. Das hat den Hintergedanken, dass auch ein Ausfall eines Controllers den Betrieb der anderen Platte am anderen Controller und somit des ganzen Systems sicherstellt.
Um einen Mirror Pool zu erstellen gehen Sie wie folgt vor:
# zpool create -f tank mirror /dev/sdb /dev/sdc
Danach steht Ihnen bereits ein einsatzbereiter Mirror Pool namens »tank« zur Verfügung:
# zpool status tank
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
errors: No known data errors
Erstellen wir uns für die weiteren Schritte mal eine 512MiB große Testdatei:
# dd if=/dev/zero of=/tank/big_test_file.img bs=1M count=512
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 5,16102 s, 104 MB/s
# ls -l /tank
insgesamt 524365
-rw-r--r-- 1 root root 536870912 14. Okt 08:28 big_test_file.img
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 513M 463M 512M /tank
# zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
tank 1008M 513M 495M 50% 1.00x ONLINE -
Wir können eine Platte aus dem Mirror Pool entnehmen:
# zpool detach tank /dev/sdc
Und unser Mirror Pool hat sich selbst zu einem Simple Pool degradiert:
# zpool status tank
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
sdb ONLINE 0 0 0
errors: No known data errors
Aber unsere Daten sind nach wie vor vorhanden:
# ls -l /tank
insgesamt 524366
-rw-r--r-- 1 root root 536870912 14. Okt 09:24 big_test_file.img
Durch folgenden Befehl können Sie die Platte (oder jede andere) dann wieder hinzufügen:
# zpool attach -f tank /dev/sdb /dev/sdc
Durch das »zpool attach« Kommando wird die zweite Platte auch wieder automatisch als Spiegelplatte hinzugefügt. Der Hinweis in der scan-Zeile zeigt auch, dass der Mirror wieder hergestellt wurde. Oracle nennt das »resilvered«, was eine Anlehnung an den Silberbelag eines Spiegels ist und nichts anderes wie einen »Rebuild« bedeutet:
# zpool status tank
pool: tank
state: ONLINE
scan: resilvered 512M in 0h0m with 0 errors on Sun Oct 14 09:37:59 2012
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
errors: No known data errors
Man kann diesem einfachen Mirror Pool jetzt einen weiteren Mirror Pool hinzufügen und erhält dadurch sozusagen ein RAID-10:
# zpool add -f tank mirror /dev/sdd /dev/sde
Dem ZFS Pool »tank« der bislang aus dem Mirror »mirror-0« bestand, wurde nun ein weiterer Mirror »mirror-1« hinzugefügt:
# zpool status tank
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
Bei einem Fehler einer Platte würde sich der Status zB in etwa wie folgt verändern:
# zpool status tank
pool: tank
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://zfsonlinux.org/msg/ZFS-8000-4J
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
mirror-1 DEGRADED 0 0 0
sdd UNAVAIL 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
An dieser Stelle ist die Platte »/dev/sdd« ausgefallen und wird nun mit dem »zpool replace« Kommando durch die »/dev/sdf« ersetzt:
# zpool replace -f tank /dev/sdd /dev/sdf
Der Rebuild wird automatisch veranlasst und der Status des Pools kehrt zu normalen Konditionen zurück:
# zpool status tank
pool: tank
state: ONLINE
scan: resilvered 256M in 0h0m with 0 errors on Sun Oct 14 11:53:27 2012
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdf ONLINE 0 0 0
sde ONLINE 0 0 0
errors: No known data errors
— pronto 2012/10/16 10:23
Verwandte Artikel:
-> ZFS Support auf Linux Debian installieren
-> ZFS Simple Pool erstellen und verwalten