Mirror Pools: Verstehen der Mirror Pool Strictness

Die Verwendung von Mirror Pools vereinfacht das korrekte Spiegeln von Logical Volumes zwischen Physical Volumes aus verschiedenen Rechenzentren. Für eine möglichst große Redundanz und Ausfallsicherheit, sollte beim Spiegeln darauf geachtet werden, das alle Physical Volumes einer Spiegel-Kopie aus dem gleichen Rechenzentrum kommen. Dies lässt sich mit Mirror Pools sehr einfach erreichen. Im Folgenden soll die Bedeutung der Mirror Pool Strictness genauer untersucht werden, diese kann für jede Volume Gruppe auf einen der Werte ‚n‘ (no), ‚y‘ (yes) oder ‚s‘ (super-strict) gesetzt werden.

1. Unsere Test-Umgebung

Wir haben in unserer Test-Umgebung eine scalable Volume Group mit 4 Physical Volumes angelegt:

$  lsvg -p datavg01
datavg01:
PV_NAME           PV STATE          TOTAL PPs   FREE PPs    FREE DISTRIBUTION
hdisk4            active            39          39          08..08..07..08..08
hdisk5            active            39          39          08..08..07..08..08
hdisk8            active            39          39          08..08..07..08..08
hdisk9            active            39          39          08..08..07..08..08
$

Die 4 Physical Volumes kommen dabei aus 2 unterschiedlichen Rechenzentren, hdisk4 und hdisk5 kommen aus dem Rechenzentrum DC1 und hdisk8 und hdisk9 aus dem Rechenzentrum DC2. Es sind noch keine Mirror Pools definiert worden.

2. Mirror Pool Strictnessno

Mirror Pools können verwendet werden, müssen aber nicht verwendet werden. Wir legen den Mirror Pool DC1 mit hdisk4 und hdisk5 und den Mirror Pool DC2 mit hdisk8 und hdisk9 an:

# chpv -p DC1 hdisk4
# chpv -p DC1 hdisk5
# chpv -p DC2 hdisk8
# chpv -p DC2 hdisk9
#

Zunächst legen wir ein gespiegeltes LV ohne Angabe von Mirror Pools an:

# mklv -c 2 -t jfs2 datavg01 10
fslv00
#

Wie erwartet werden die Physical Volumes hdisk4 und hdisk5 für die beiden Spiegel-Kopien verwendet, womit beide Kopien im gleichen Rechenzentrum liegen:

$ lslv -m fslv00
fslv00:N/A
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0009 hdisk4            0009 hdisk5
0002  0010 hdisk4            0010 hdisk5
0003  0011 hdisk4            0011 hdisk5
0004  0012 hdisk4            0012 hdisk5
0005  0013 hdisk4            0013 hdisk5
0006  0014 hdisk4            0014 hdisk5
0007  0015 hdisk4            0015 hdisk5
0008  0016 hdisk4            0016 hdisk5
0009  0017 hdisk4            0017 hdisk5
0010  0018 hdisk4            0018 hdisk5
$

Das die Physical Volumes einem Mirror Pool zugeordnet sind, spielt keine Rolle, wenn das LV ohne Angabe von Mirror Pools angelegt wird. Alle Physical Volumes sind potentielle Kandidaten, unabhängig ob sie zu einem Mirror Pool gehören oder nicht.

Da die Verwendung von Mirror Pools bei Mirror Pool Strictnessno‘ optional ist, kann man ohne Probleme auch ein gespiegeltes LV anlegen, bei dem eine Kopie in einem der Mirror Pools liegt, die zweite Kopie aber keinem Mirror Pool zugeordnet ist:

# mklv -c 2 -t jfs2 -p copy1=DC1 datavg01 10
fslv01
#

Im konkreten Fall liegt die zweite Kopie zufälligerweise in dem zweiten Mirror Pool. Das hängt von den Allocation Policies und den aktuellen Platz-Verhältnissen auf den Physical Volumes ab:

$ lslv -m fslv01
fslv01:/test
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0019 hdisk4            0009 hdisk8
0002  0020 hdisk4            0010 hdisk8
0003  0021 hdisk4            0011 hdisk8
0004  0022 hdisk4            0012 hdisk8
0005  0023 hdisk4            0013 hdisk8
0006  0024 hdisk4            0014 hdisk8
0007  0025 hdisk4            0015 hdisk8
0008  0026 hdisk4            0016 hdisk8
0009  0027 hdisk4            0017 hdisk8
0010  0028 hdisk4            0018 hdisk8
$

In einem weiteren Versuch legen wir ein gespiegeltes LV an, bei dem beide Spiegel-Kopien dem gleichen Mirror Pool zugewiesen sind:

# mklv -c 2 -t jfs2 -p copy1=DC1 -p copy2=DC1 datavg01 10
fslv02
#

Dies ist ohne weiteres möglich, wenn der Mirror Pool 2 verschiedene Physical Volumes mit ausreichend Platz besitzt. Das LV hat per Default die LV Strictnessyes‚, was die Verwendung von mindestens 2 Physical Volumes bedeutet.

$ lslv -m fslv02
fslv02:N/A
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0019 hdisk5            0029 hdisk4
0002  0020 hdisk5            0030 hdisk4
0003  0021 hdisk5            0031 hdisk4
0004  0022 hdisk5            0032 hdisk4
0005  0023 hdisk5            0033 hdisk4
0006  0024 hdisk5            0034 hdisk4
0007  0025 hdisk5            0035 hdisk4
0008  0026 hdisk5            0036 hdisk4
0009  0027 hdisk5            0037 hdisk4
0010  0028 hdisk5            0038 hdisk4
$

Natürlich kann man auch ein LV mit Spiegel-Kopien in zwei verschiedenen Mirror Pools erzeugen, was für die meisten Fälle die sinnvolle Variante sein sollte:

# mklv -c 2 -t jfs2 -p copy1=DC1 -p copy2=DC2 datavg01 10
fslv03
#
$ lslv -m fslv03
fslv03:N/A
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0029 hdisk5            0009 hdisk9
0002  0030 hdisk5            0010 hdisk9
0003  0031 hdisk5            0011 hdisk9
0004  0032 hdisk5            0012 hdisk9
0005  0033 hdisk5            0013 hdisk9
0006  0034 hdisk5            0014 hdisk9
0007  0035 hdisk5            0015 hdisk9
0008  0036 hdisk5            0016 hdisk9
0009  0037 hdisk5            0017 hdisk9
0010  0038 hdisk5            0018 hdisk9
$

Wie die Beispiele zeigen, kann man im Falle von Mirror Pool Strictnessno‘ nicht verhindern das ein Administrator Mirror Pools gar nicht verwendet (1. Beispiel) oder Mirror Pools nur teilweise verwendet (2. Und 3. Beispiel). Daher sollte Mirror Pool Strictnessno‘ nur dann verwendet werden, wenn man keine Mirror Pools benutzen möchte.

3. Mirror Pool Strictnessyes

Setzt man die Mirror Pool Strictness auf ‚yes‘, dann müssen Mirror Pools zwingend verwendet werden.

Wir starten, indem wir alle LVs löschen und dann die Zuordnung der Physical Volumes zu den beiden Mirror Pools aufheben, womit die Mirror Pools gelöscht werden:

# rmlv -f fslv03
rmlv: Logical volume fslv03 is removed.
# rmlv -f fslv02
rmlv: Logical volume fslv02 is removed.
# rmlv -f fslv01
rmlv: Logical volume fslv01 is removed.
# rmlv -f fslv00
rmlv: Logical volume fslv00 is removed.
# chpv -P hdisk4
# chpv -P hdisk5
# chpv -P hdisk8
# chpv -P hdisk9
#

Bevor wir den Wert für Mirror Pool Strictness ändern, legen wir noch ein gespiegeltes LV ohne Mirror Pools an. Dies entspricht dann dem Fall in der Praxis, bei dem man für eine bestehende VG Mirror Pools einführen möchte:

# mklv -c 2 -t jfs2 datavg01 10
fslv00
#

Die beiden Spiegel-Kopien (hier nicht gezeigt) liegen wieder auf hdisk4 und hdisk5.

Wir erzwingen jetzt die Verwendung von Mirror Pools, indem wir die Mirror Pool Strictness für die VG auf ‚yes‘ setzen:

# chvg -M y datavg01
#

Nun versuchen wir ein LV ohne Mirror Pools anzulegen:

# mklv -c 2 -t jfs2 datavg01 10
0516-1814 lcreatelv: Mirror pools must be defined for each copy when strict mirror
pools are enabled.
0516-822 mklv: Unable to create logical volume.
#

Dies ist jetzt nicht mehr möglich, wie die recht eindeutige Fehlermeldung zeigt.

Wir legen wieder die beiden Mirror Pools DC1 und DC2 wie oben an:

# chpv -p DC1 hdisk4
# chpv -p DC1 hdisk5
# chpv -p DC2 hdisk8
# chpv -p DC2 hdisk9
#

Es ist aber weiterhin möglich ein LV ohne Spiegelung anzulegen, die einzige Kopie muß lediglich einem Mirror Pool zugewiesen werden:

# mklv -t jfs2 -p copy1=DC1 datavg01 10
fslv01
#

Oder man kann gespiegelte LVs anlegen, bei denen mehrere Spiegel-Kopien dem gleichen Mirror Pool zugewiesen sind:

# mklv -t jfs2 -p copy1=DC1 -p copy2=DC1 datavg01 10
fslv02
#

Der Mirror Pool DC2 wird in beiden Beispielen nicht verwendet. Das Spiegeln innerhalb eines Mirror Pools ist zwar möglich, aber sicher im allgemeinen nicht sinnvoll!

D.h. man muß zwar für jedes LV Mirror Pools für die Spiegel-Kopien verwenden, aber nicht alle Mirror Pools müssen verwendet werden.

Ist die Mirror Pool Strictness auf ‚yes‘ gesetzt, dann kann man Spiegeln, muss aber nicht Spiegeln. Benötigt man bei der Verwendung von Mirror Pools sowohl gespiegelte LVs (natürlich über Mirror Pools hinweg gespiegelt) und gleichzeitig auch ungespiegelte LVs, dann ist dies mit Mirror Pool Strictnessyes‘ möglich.

4. Mirror Pool Strictnesssuper-strict

Bei dieser Einstellung müssen für jedes LV alle Mirror Pools verwendet werden. Die Anzahl der Mirror Pools gibt damit an wieviele Spiegel-Kopien jedes LV mindestens haben muss.

Wir starten wieder mit der Konfiguration ohne LVs und ohne Mirror Pools und legen wiederum das erste gespiegelte LV ohne Mirror Pools an:

# mklv -c 2 -t jfs2 datavg01 10
fslv00
#

Anschließend setzen wir die Mirror Pool Strictness auf ‚super-strict‘:

# chvg -M s datavg01
#

Wie im Fall vorher, lassen sich LVs nur noch durch Angabe von Mirror Pools erzeugen. Daher legen wir wiederum die gleichen Mirror Pools wie oben an:

# chpv -p DC1 hdisk4
# chpv -p DC1 hdisk5
# chpv -p DC2 hdisk8
# chpv -p DC2 hdisk9
#

Hat man nur einen Mirror Pool (nicht sinnvoll), dann kann man nur ungespiegelte LVs anlegen, oder muss beim Spiegeln alle Kopien dem einzigen Mirror Pool zuweisen. Das entspricht aber im Wesentlichen der Situation ohne Mirror Pools.

Hat man zwei Mirror Pools (das dürfte die am häufigsten anzutreffende Konfiguration sein), ist es nicht mehr möglich ein ungespiegeltes LV anzulegen

# mklv -t jfs2 -p copy1=DC1 datavg01 10
0516-1829 mklv: Every mirror pool must contain a copy of
the logical volume.
0516-822 mklv: Unable to create logical volume.
#

Bei zwei Mirror Pools sollten alle LVs genau 2 Spiegel-Kopien haben, wobei dann jede Kopie in einem anderen Mirror Pool liegt:

# mklv -c 2 -t jfs2 -p copy1=DC1 -p copy2=DC2 datavg01 10
fslv01
#
$ lslv -m fslv01
fslv01:/test
LP    PP1  PV1               PP2  PV2               PP3  PV3
0001  0019 hdisk4            0009 hdisk8
0002  0020 hdisk4            0010 hdisk8
0003  0021 hdisk4            0011 hdisk8
0004  0022 hdisk4            0012 hdisk8
0005  0023 hdisk4            0013 hdisk8
0006  0024 hdisk4            0014 hdisk8
0007  0025 hdisk4            0015 hdisk8
0008  0026 hdisk4            0016 hdisk8
0009  0027 hdisk4            0017 hdisk8
0010  0028 hdisk4            0018 hdisk8
$

Auch wenn es nicht sinnvoll ist, kann man ein LV mit 3 Spiegel-Kopien anlegen, dazu müssen lediglich für 2 der Kopien der gleiche Mirror Pool angegeben werden:

# mklv -c 3 -t jfs2 -p copy1=DC1 -p copy2=DC2 -p copy3=DC1 datavg01 10
fslv02
#

Hat man 3 Mirror Pools, so können nur noch LVs mit 3 Spiegel-Kopien angelegt werden.

Mehr als 3 Mirror Pools sind mit Mirror Pool Strictnesssuper-strict‘ nicht möglich, da der AIX LVM nur maximal 3 Spiegel-Kopien unterstützt. Der Versuch einen vierten Mirror Pool zu erzeugen, führt zu einer Fehlermeldung:

# chpv -p DC3 hdisk8
# chpv -p DC4 hdisk9
0516-1828 lchangepv: Maximum number of mirror pools reached.
0516-722 chpv: Unable to change physical volume hdisk9.
#

Die Verwendung der Mirror Pool Strictnesssuper-strict‘ stellt also sicher, das alle LVs in einer VG über alle (maximal 3) Mirror Pools hinweg gespiegelt sind. Oder anders gesagt: jeder Mirror Pool hat mindestens 1 Kopie eines jeden LVs.

Der häufigste Anwendungsfall in der Praxis dürfte der Fall sein, bei dem man zwischen 2 Rechenzentren korrektes Spiegeln erzwingen möchte. Man legt dann für jedes Rechenzentrum einen Mirror Pool mit den Physical Volumes des Rechenzentrums an und hat damit sicher gestellt, das alle LVs in der VG gespiegelt sind und jeweils mindestens 1 Spiegel-Kopie in jedem dieser beiden Rechenzentren besitzen.

Weitere Artikel zum Thema AIX LVM

Mirror Pools: Einführung

Michael Perzl: Introduction to AIX Mirror Pools

AIX LVM: Mechanik von migratelp

AIX LVM: Mechanik von migratepv (Part I)

AIX LVM: Mechanik von migratepv (Part II)

AIX LVM: Mechanik von migratepv (Part III)

 

Zurück zur Übersicht AIX Artikel