Viele IT-Umgebungen betreiben Ihre Systeme in mehr als einem Rechenzentrum. Um im Falle eines Ausfalls eines kompletten Rechenzentrums trotzdem keinen Datenverlust zu haben, werden die Daten zwischen 2 oder mehr Rechenzentren gespiegelt. Die Spiegelung kann dabei durch das Storage realisiert sein (storage based mirroring) oder durch einen Volume Manager (LVM im Falle von AIX) auf dem Server (host based mirroring). Im Folgenden betrachten wir nur Spiegelungen mittels AIX Logical Volume Manager. Dabei soll gezeigt werden, wie mit Hilfe von Mirror Pools das korrekte Spiegeln von Logical Volumes realisiert werden kann. In größeren Umgebungen mit vielen Physical Volumes ist das Einhalten einer korrekten Spiegelung ohne Mirror Pools schwierig und für den Administrator eine Herausforderung.
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.
2. Das Problem
Erzeugt man ein gespiegeltes Logical Volume, ohne Mapping File und ohne Angabe von zu verwendenden Physical Volumes, dann alloziert LVM Platz auf den Physical Volumes in der Reihenfolge wie die Physical Volumes oben aufgelistet sind.
# mklv -c 2 datavg01 10 lv00 #
Da hdisk4 und hdisk5 die ersten Physical Volumes sind, werden diese für das gespiegelte LV verwendet:
$ lslv -m lv00 lv00: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 $
Damit befinden sich beide Spiegelkopien im Rechenzentrum DC1! Bei einem Ausfall des Rechenzentrums fällt das komplette gespiegelte LV aus!
Dies lässt sich natürlich sehr leicht besser machen, indem man beim Erzeugen des LV die gewünschten Physical Volumes angibt:
# mklv -c 2 -t jfs2 datavg01 10 hdisk4 hdisk8 fslv00 #
Jetzt ist das LV korrekt zwischen den beiden Rechenzentren gespiegelt:
$ lslv -m fslv00 fslv00:N/A 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 $
Allerdings muss der Administrator für jedes Physical Volume wissen zu welchem Rechenzentrum dieses gehört. Das dürfte nicht immer leicht zu erkennen sein.
Wie sieht es beim Erweitern eines LVs aus?
Hierzu schauen wir uns zunächst an, auf welchen der Physical Volumes freier Platz ist:
$ lsvg -p datavg01 datavg01: PV_NAME PV STATE TOTAL PPs FREE PPs FREE DISTRIBUTION hdisk4 active 39 19 08..00..00..03..08 hdisk5 active 39 29 08..00..05..08..08 hdisk8 active 39 29 08..00..05..08..08 hdisk9 active 39 39 08..08..07..08..08 $
Wir erweitern das zweite LV (fslv00) um 20 LPs, zunächst einmal ohne Physical Volumes anzugeben:
# extendlv fslv00 20 #
Das Mapping für das erweiterte LV sieht dann so aus:
$ lslv -m fslv00 fslv00:N/A 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 0011 0001 hdisk4 0009 hdisk9 0012 0002 hdisk4 0010 hdisk9 0013 0003 hdisk4 0011 hdisk9 0014 0004 hdisk4 0012 hdisk9 0015 0005 hdisk4 0013 hdisk9 0016 0006 hdisk4 0014 hdisk9 0017 0007 hdisk4 0015 hdisk9 0018 0008 hdisk4 0016 hdisk9 0019 0029 hdisk4 0017 hdisk9 0020 0030 hdisk4 0018 hdisk9 0021 0031 hdisk4 0019 hdisk9 0022 0032 hdisk4 0020 hdisk9 0023 0033 hdisk4 0021 hdisk9 0024 0034 hdisk4 0022 hdisk9 0025 0035 hdisk4 0023 hdisk9 0026 0036 hdisk4 0001 hdisk9 0027 0037 hdisk4 0002 hdisk9 0028 0038 hdisk4 0003 hdisk9 0029 0039 hdisk4 0004 hdisk9 0030 0019 hdisk8 0005 hdisk9 $
Die erste Spiegel-Kopie liegt jetzt auf hdisk4 und hdisk8 und ist damit auf 2 Rechenzentren verteilt. Die zweite Spiegel-Kopie liegt auf hdisk8 und hdisk9 und damit im zweiten Rechenzentrum. Sollte das zweite Rechenzentrum ausfallen, verliert man den Zugriff auf LP (Logical Partition) 30!
Auch in diesem Fall kann man natürlich die gewünschten Physical Volumes angeben, um sicherzustellen das das erweiterte LV korrekt über zwei Rechenzentren gespiegelt ist. Hierzu haben wir das LV fslv00 gelöscht und noch einmal wie ursprünglich angelegt:
# rmlv -f fslv00 rmlv: Logical volume fslv00 is removed. # mklv -c 2 -t jfs2 datavg01 10 hdisk4 hdisk8 fslv00 #
Wir erweitern jetzt erneut und geben explizit hdisk5 (DC1) und hdisk9 (DC2) als Physical Volumes für die Erweiterung des LVs an. Auf beiden Physical Volumes sind genügend PPs (Physical Partitions) für die Erweiterung frei:
# extendlv fslv00 20 hdisk5 hdisk9 #
Ein Blick auf das resultierende Mapping zeigt leider das dies nicht den gewünschten Erfolg hatte:
$ lslv -m fslv00 fslv00:N/A 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 0011 0009 hdisk9 0019 hdisk5 0012 0010 hdisk9 0020 hdisk5 0013 0011 hdisk9 0021 hdisk5 0014 0012 hdisk9 0022 hdisk5 0015 0013 hdisk9 0023 hdisk5 0016 0014 hdisk9 0001 hdisk5 0017 0015 hdisk9 0002 hdisk5 0018 0016 hdisk9 0003 hdisk5 0019 0017 hdisk9 0004 hdisk5 0020 0018 hdisk9 0005 hdisk5 0021 0019 hdisk9 0006 hdisk5 0022 0020 hdisk9 0007 hdisk5 0023 0021 hdisk9 0008 hdisk5 0024 0022 hdisk9 0024 hdisk5 0025 0023 hdisk9 0025 hdisk5 0026 0001 hdisk9 0026 hdisk5 0027 0002 hdisk9 0027 hdisk5 0028 0003 hdisk9 0028 hdisk5 0029 0004 hdisk9 0029 hdisk5 0030 0005 hdisk9 0030 hdisk5 $
Leider wurde die hdisk5 nicht wie erwartet für die erste Kopie, sondern für die zweite Kopie verwendet und die hdisk9 für die zweite Kopie und nicht die erste Kopie. Damit sind beide Kopien auf beide Rechenzentren verteilt! Ein Ausfall eines der beiden Rechenzentren hätte damit fatale Auswirkungen auf die Verfügbarkeit des LVs.
Das bedeutet aber das man selbst in einem so einfachen Fall schon mit einem Mapping File arbeiten muss, um das korrekte Spiegeln zwischen den Rechenzentren zu erreichen. Der Vollständigkeit halber haben wir das LV wieder gelöscht und neu angelegt. Für die Erweiterung haben wir das folgende Mapping File erstellt:
$ cat mapfile hdisk5:19-38 hdisk9:19-38 $
Führt man jetzt die Erweiterung des LV mit dem Mapping File durch, dann bleibt die korrekte Spiegelung zwischen den Rechenzentren erhalten:
# extendlv -m mapfile fslv00 20 # $ lslv -m fslv00 fslv00:N/A 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 0011 0019 hdisk5 0019 hdisk9 0012 0020 hdisk5 0020 hdisk9 0013 0021 hdisk5 0021 hdisk9 0014 0022 hdisk5 0022 hdisk9 0015 0023 hdisk5 0023 hdisk9 0016 0024 hdisk5 0024 hdisk9 0017 0025 hdisk5 0025 hdisk9 0018 0026 hdisk5 0026 hdisk9 0019 0027 hdisk5 0027 hdisk9 0020 0028 hdisk5 0028 hdisk9 0021 0029 hdisk5 0029 hdisk9 0022 0030 hdisk5 0030 hdisk9 0023 0031 hdisk5 0031 hdisk9 0024 0032 hdisk5 0032 hdisk9 0025 0033 hdisk5 0033 hdisk9 0026 0034 hdisk5 0034 hdisk9 0027 0035 hdisk5 0035 hdisk9 0028 0036 hdisk5 0036 hdisk9 0029 0037 hdisk5 0037 hdisk9 0030 0038 hdisk5 0038 hdisk9 $
Wie erwartet liegt die Spiegel-Kopie 1 auf hdisk4 und hdisk5 und damit im Rechenzentrum DC1 und die Kopie 2 auf hdisk8 und hdisk9 und damit in DC2. Es ist allerdings sehr aufwändig bei jeder Erweiterung zunächst ein Mapping File anzulegen.
Als letztes schauen wir uns den Fall einer Filesystem-Erweiterung an. Dazu löschen wir das LV wieder und legen es neu an und Erzeugen anschließend ein Filesystem auf dem LV:
# mklv -c 2 -t jfs2 datavg01 10 hdisk4 hdisk8 fslv00 # crfs -v jfs2 -d /dev/fslv00 -m /fs00 -a log=INLINE File system created successfully. 2610916 kilobytes total disk space. New File System size is 5242880 # mount /fs00 #
Wir erweitern jetzt das gemountete Filesystem um 5 GB:
# chfs -a size=+5G /fs00 Filesystem size changed to 15728640 Inlinelog size changed to 30 MB. #
Beim Kommando chfs können weder Physical Volumes noch ein Mapping File angegeben werden. Damit hat man keine Möglichkeit bei einer Filesystem-Erweiterung gezielt zu bestimmen, welche Physical Volumes für die Erweiterung verwendet werden. Dementsprechend liegen die Spiegel-Kopien nach der Filesystem-Erweiterung wieder jeweils in beiden Rechenzentren:
$ lslv -m fslv00 fslv00:/fs00 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 0011 0001 hdisk4 0009 hdisk9 0012 0002 hdisk4 0010 hdisk9 0013 0003 hdisk4 0011 hdisk9 0014 0004 hdisk4 0012 hdisk9 0015 0005 hdisk4 0013 hdisk9 0016 0006 hdisk4 0014 hdisk9 0017 0007 hdisk4 0015 hdisk9 0018 0008 hdisk4 0016 hdisk9 0019 0029 hdisk4 0017 hdisk9 0020 0030 hdisk4 0018 hdisk9 0021 0031 hdisk4 0019 hdisk9 0022 0032 hdisk4 0020 hdisk9 0023 0033 hdisk4 0021 hdisk9 0024 0034 hdisk4 0022 hdisk9 0025 0035 hdisk4 0023 hdisk9 0026 0036 hdisk4 0001 hdisk9 0027 0037 hdisk4 0002 hdisk9 0028 0038 hdisk4 0003 hdisk9 0029 0039 hdisk4 0004 hdisk9 0030 0019 hdisk8 0005 hdisk9 $
Als Workaround kann man zunächst extendlv mit einem Mapping File verwenden und danach chfs für die Filesystem-Erweiterung ausführen.
Fazit: Korrekte Spiegelung zwischen Rechenzentren ist ohne Mirror Pools sehr schwierig zu realisieren. Selbst einfache LVM Operationen können zu überraschenden Resultaten führen, wie einige der Beispiele zeigen.
3. Verwendung von Mirror Pools
Die Idee bei Mirror Pools ist, die Physical Volumes in Pools zu organisieren, und dann die Spiegel-Kopien diesen Pools zuzuordnen. Mirror Pools können nur für scalable VGs konfiguriert werden.
Zunächst müssen hierzu die Physical Volumes den Mirror Pools zugewiesen werden. In unserem Fall kommen die Physical Volumes aus den beiden Rechenzentren DC1 und DC2, was nahe legt 2 Mirror Pools anzulegen, einen für die Physical Volumes aus DC1 und einen für die Physical Volumes aus DC2.
# chpv -p DC1 hdisk4 # chpv -p DC1 hdisk5 # chpv -p DC2 hdisk8 # chpv -p DC2 hdisk9 #
Welches Physical Volume zu welchem Mirror Pool gehört, lässt sich leicht mit Hilfe der Option ‚-P‘ beim Kommando lsvg herausfinden:
# lsvg -P datavg01 Physical Volume Mirror Pool hdisk4 DC1 hdisk5 DC1 hdisk8 DC2 hdisk9 DC2 #
Ein Mirror Pool gehört immer zu einer VG. Jede VG hat von anderen VGs unabhängige Mirror Pools.
Ob und wie Mirror Pools in einer VG verwendet werden, hängt von der Mirror Pool Strictness ab. Die Mirror Pool Strictness ist ein Attribut der VG und legt für die gesamte VG fest, wie die Verwendung von Mirror Pools aussieht. Das Attribut kann über die Option ‚-M‘ beim Erzeugen einer VG mit mkvg oder auch nachträglich mittels chvg gesetzt werden. Die möglichen Werte sind dabei:
n – No, Mirror Pools können benutzt werden, müssen aber nicht benutzt werden (Default) y – Yes, Mirror Pools müssen benutzt werden, jeder Spiegel-Kopie muss ein Mirror Pool zugewiesen sein s – Super-strict: Mirror Pools müssen benutzt werden, jeder Mirror Pool muss von jedem LV mindestens eine Spiegel-Kopie haben.
Per Default ist die Mirror Pool Strictness einer VG ‚n‘. Es müssen also nicht zwingend Mirror Pools verwendet werden.
Beim Erzeugen eines LVs kann man jeder Spiegel-Kopie einen Mirror Pool zuweisen:
# mklv -c 2 -t jfs2 -p copy1=DC1 -p copy2=DC2 datavg01 10 fslv00 #
Die Spiegel-Kopien liegen nun wie angegeben in den entsprechenden Mirror Pools:
$ lslv -m fslv00 fslv00:N/A 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 $
Eine Erweiterung des LVs, mit extendlv oder chfs, wird jetzt für jede Spiegel-Kopie nur noch durch Verwendung von Physical Volumes des zugehörigen Mirror Pools durchgeführt:
$ lslv -m fslv00 fslv00:N/A 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 0011 0001 hdisk4 0019 hdisk8 0012 0002 hdisk4 0020 hdisk8 0013 0003 hdisk4 0021 hdisk8 0014 0004 hdisk4 0022 hdisk8 0015 0005 hdisk4 0023 hdisk8 0016 0006 hdisk4 0001 hdisk8 0017 0007 hdisk4 0002 hdisk8 0018 0008 hdisk4 0003 hdisk8 0019 0029 hdisk4 0004 hdisk8 0020 0030 hdisk4 0005 hdisk8 0021 0031 hdisk4 0006 hdisk8 0022 0032 hdisk4 0007 hdisk8 0023 0033 hdisk4 0008 hdisk8 0024 0034 hdisk4 0024 hdisk8 0025 0035 hdisk4 0025 hdisk8 0026 0036 hdisk4 0026 hdisk8 0027 0037 hdisk4 0027 hdisk8 0028 0038 hdisk4 0028 hdisk8 0029 0039 hdisk4 0029 hdisk8 0030 0019 hdisk5 0030 hdisk8 $
Da weiterhin Intra und Inter Physical Volume Allocation Policies berücksichtigt werden, kann das zwar wie hier geschehen zu unterschiedlichen Mappings bei den Spiegel-Kopien führen (Spiegel Kopie 1 verwendet hdisk4 und hdisk5 und damit 2 Physical Volumes, Spiegel Kopie 2 verwendet nur hdisk8 und damit nur ein Physical Volume), aber es werden innerhalb einer Spiegel-Kopie nicht mehr Physical Volumes aus 2 verschiedenen Rechenzentren verwendet! Durch Angabe der gewünschten Physical Volumes kann man natürlich erreichen das beide Spiegel-Kopien PPs von zusätzlichen Physical Volumes verwenden und damit beide Spiegel-Kopien jeweils 2 Physical Volumes verwenden:
# extendlv fslv00 20 hdisk5 hdisk9 #
Sind Physical Volumes und Spiegel-Kopien Mirror Pools zugeordnet, dann ist die Aufrechterhaltung einer korrekten Spiegelung zwischen Rechenzentren sehr einfach möglich.
Weitere Artikel zum Thema AIX LVM:
Mirror Pools: Verstehen der Mirror Pool Strictness
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)