ZFS Mirror Pool erstellen und verwalten

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

Note: Bei der Auswahl der Platten ist zu beachten, dass idealerweise gleich große und gleich schnelle Platten verwendet werden. Dabei ist zu berücksichtigen, dass zB eine 500GB Platte eines Herstellers von der Größe her nicht zwingend mit einer 500GB Platte eines anderen Herstellers übereinstimmt. Ein fehlendes MB kann beim Auswechseln einer defekten Platte das Vorhaben zum Scheitern verurteilen.

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