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 Strictness ‚no‘
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 Strictness ‚no‘ 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 Strictness ‚yes‚, 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 Strictness ‚no‘ 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 Strictness ‚no‘ nur dann verwendet werden, wenn man keine Mirror Pools benutzen möchte.
3. Mirror Pool Strictness ‚yes‘
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 Strictness ‚yes‘ möglich.
4. Mirror Pool Strictness ‚super-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 Strictness ‚super-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 Strictness ‚super-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
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)