Mirror Pools: Einführung

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 VGn‘. 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)

 

Zurück zur Übersicht AIX Artikel