Ich erstelle einen 2+1 Failovercluster unter Red Hat 5.5 mit 4 Diensten, von denen 2 auf demselben Knoten laufen müssen und dieselbe virtuelle IP-Adresse verwenden. Einer der Dienste auf jedem Knoten (genanntFestplatte1UndFestplatte2in cluster.conf weiter unten) benötigt eine (SAN-)Festplatte, die andere nicht (sie heißennodisk1Undnodisk2). Auf jedem Knoten sollte es also einen Dienst geben, der eine Festplatte benötigt (FestplatteN) und dem entsprechenden Dienst, der keine Festplatte benötigt (nodiskN). Ich verwende HA-LVM.
Wenn ich die beiden mit dem SAN verbundenen Schnittstellen herunterfahre (über ifdown), um einen SAN-Ausfall zu simulieren, wird der Dienst, der die Festplatte benötigt, deaktiviert, der andere läuft wie erwartet weiter. Überraschenderweise (und unglücklicherweise) wird auch die virtuelle IP-Adresse entfernt, die von den beiden Diensten auf derselben Maschine gemeinsam genutzt wird, wodurch der noch laufende Dienst nutzlos wird. Wie kann ich den Cluster so konfigurieren, dass die IP-Adresse aktiv bleibt? Die einzige Möglichkeit, die ich bisher gefunden habe, war, jedem Dienst, der keine Festplatte benötigt, eine andere virtuelle IP-Adresse zuzuweisen (nicht implementiert in der folgenden cluster.conf).
cluster.conf sieht folgendermaßen aus:
<?xml version="1.0" ?>
<cluster config_version="1" name="cluster">
<fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
<cman shutdown_timeout="10000"/>
<clusternodes>
<clusternode name="node1" nodeid="1" votes="1">
<fence>
<method name="1">
<device name="device1"/>
</method>
</fence>
</clusternode>
<clusternode name="node2" nodeid="2" votes="1">
<fence>
<method name="1">
<device name="device2"/>
</method>
</fence>
</clusternode>
<clusternode name="node3" nodeid="3" votes="1">
<fence>
<method name="1">
<device name="device3"/>
</method>
</fence>
</clusternode>
</clusternodes>
<fencedevices>
<fencedevice agent="fence_ilo" ipaddr="10.0.24.101" login="admin" name="device1" passwd="password"/>
<fencedevice agent="fence_ilo" ipaddr="10.0.24.102" login="admin" name="device2" passwd="password"/>
<fencedevice agent="fence_ilo" ipaddr="10.0.24.103" login="admin" name="device3" passwd="password"/>
</fencedevices>
<rm>
<failoverdomains>
<failoverdomain name="domain1" nofailback="0">
<failoverdomainnode name="node1" priority="1"/>
</failoverdomain>
<failoverdomain name="domain2" nofailback="0">
<failoverdomainnode name="node2" priority="1"/>
</failoverdomain>
</failoverdomains>
<resources>
<ip address="10.0.24.111" monitor_link="1"/>
<ip address="10.0.24.112" monitor_link="1"/>
</resources>
<service autostart="1" exclusive="0" name="disk1" recovery="restart" domain="domain1">
<ip ref="10.0.24.111"/>
<script file="/etc/init.d/disk1" name="disk1"/>
<fs device="/dev/VolGroup10/LogVol10" force_fsck="0" force_unmount="1" fstype="ext3" mountpoint="/mnt/lun1" name="lun1" self_fence="1"/>
<lvm lv_name="LogVol10" name="VolGroup10/LogVol10" vg_name="VolGroup10"/>
</service>
<service autostart="1" exclusive="0" name="nodisk1" recovery="restart" domain="domain1">
<ip ref="10.0.24.111"/>
<script file="/etc/init.d/nodisk1" name="nodisk1"/>
</service>
<service autostart="1" exclusive="0" name="disk2" recovery="restart" domain="domain2">
<ip ref="10.0.24.112"/>
<script file="/etc/init.d/disk2" name="disk2"/>
<fs device="/dev/VolGroup20/LogVol20" force_fsck="0" force_unmount="1" fstype="ext3" mountpoint="/mnt/lun2" name="lun2" self_fence="1"/>
<lvm lv_name="LogVol20" name="VolGroup20/LogVol20" vg_name="VolGroup20"/>
</service>
<service autostart="1" exclusive="0" name="nodisk2" recovery="restart" domain="domain2">
<ip ref="10.0.24.112"/>
<script file="/etc/init.d/nodisk2" name="nodisk2"/>
</service>
</rm>
</cluster>
Antwort1
Ich denke, Sie benötigen einen anderen Dienst, um diese IP beizubehalten. Das Problem besteht darin, dass rgmanager bei einem Ausfall des SAN-Dienstes eine ip addr del <ip>
an den Knoten ausgibt, auf dem der Dienst ausgeführt wird. Da diese IP gemeinsam genutzt wird, wird sie aus dem anderen Dienst herausgezogen. Sie müssen also einen anderen Dienst hinzufügen, beispielsweise:
<service autostart="1" domain="<fo_domain_of_services>" name="floating_ip">
<ip ref="your_ip" />
</service>
Die Art und Weise, wie Sie Ihre Failover-Domänen einrichten, ist entscheidend. Wenn Sie es falsch machen, endet es damit, dass die IP auf einem Knoten sitzt und die Dienste auf dem anderen. Leider habe ich derzeit keinen Cluster zum Testen, aber ich denke, Sie möchten alle drei Dienste (die beiden, die die IP benötigen, und die IP selbst) in einer einzigen eingeschränkten Failover-Domäne mit einer Priorität von mindestens 1.
Denken Sie immer daran, dass Sie, wenn Sie Änderungen manuell vornehmen, /etc/cluster/cluster.conf
die Versionsnummer erhöhen und dann ccs_tool update /etc/cluster/cluster.conf
die Konfiguration an die anderen Knoten übertragen müssen. Außerdem sollten Sie bedenken, dass ccs_tool
es ausläuft, aber in RHEL 5.4 sollte es noch funktionieren. Der andere Befehl, den Sie sich merken sollten, ist, rg_test
dass Sie damit genau sehen können, was der Cluster tut, wenn Sie Dienste starten/stoppen. Richten Sie Ihre Debug-Levels hoch und beobachten Sie immer die Protokolldateien. Viel Glück!
Antwort2
Haben Sie versucht, die beiden von der Festplatte abhängigen Dienste in eine eigene Ressourcengruppe zu integrieren?
Die beste Vorgehensweise scheint zu sein, die IP und den laufenden Dienst zu löschen, wenn der Fehler erkannt wird, und dann die IP und beide Dienste auf ein anderes Clustermitglied zu verschieben.
Antwort3
Die einzige Möglichkeit, dies zu erreichen, bestand darin, den Diensten, die keine Festplatte benötigten, eigene virtuelle IP-Adressen zuzuweisen.
cluster.conf sieht nun folgendermaßen aus:
<?xml version="1.0" ?>
<cluster config_version="1" name="cluster">
<fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
<cman shutdown_timeout="10000"/>
<clusternodes>
<clusternode name="node1" nodeid="1" votes="1">
<fence>
<method name="1">
<device name="device1"/>
</method>
</fence>
</clusternode>
<clusternode name="node2" nodeid="2" votes="1">
<fence>
<method name="1">
<device name="device2"/>
</method>
</fence>
</clusternode>
<clusternode name="node3" nodeid="3" votes="1">
<fence>
<method name="1">
<device name="device3"/>
</method>
</fence>
</clusternode>
</clusternodes>
<fencedevices>
<fencedevice agent="fence_ilo" ipaddr="10.0.24.101" login="admin" name="device1" passwd="password"/>
<fencedevice agent="fence_ilo" ipaddr="10.0.24.102" login="admin" name="device2" passwd="password"/>
<fencedevice agent="fence_ilo" ipaddr="10.0.24.103" login="admin" name="device3" passwd="password"/>
</fencedevices>
<rm>
<failoverdomains>
<failoverdomain name="domain1" nofailback="0">
<failoverdomainnode name="node1" priority="1"/>
</failoverdomain>
<failoverdomain name="domain2" nofailback="0">
<failoverdomainnode name="node2" priority="1"/>
</failoverdomain>
</failoverdomains>
<resources>
<ip address="10.0.24.111" monitor_link="1"/>
<ip address="10.0.24.112" monitor_link="1"/>
<ip address="10.0.24.113" monitor_link="1"/>
<ip address="10.0.24.114" monitor_link="1"/>
</resources>
<service autostart="1" exclusive="0" name="disk1" recovery="restart" domain="domain1">
<ip ref="10.0.24.111"/>
<script file="/etc/init.d/disk1" name="disk1"/>
<fs device="/dev/VolGroup10/LogVol10" force_fsck="0" force_unmount="1" fstype="ext3" mountpoint="/mnt/lun1" name="lun1" self_fence="1"/>
<lvm lv_name="LogVol10" name="VolGroup10/LogVol10" vg_name="VolGroup10"/>
</service>
<service autostart="1" exclusive="0" name="nodisk1" recovery="restart" domain="domain1">
<ip ref="10.0.24.112"/>
<script file="/etc/init.d/nodisk1" name="nodisk1"/>
</service>
<service autostart="1" exclusive="0" name="disk2" recovery="restart" domain="domain2">
<ip ref="10.0.24.113"/>
<script file="/etc/init.d/disk2" name="disk2"/>
<fs device="/dev/VolGroup20/LogVol20" force_fsck="0" force_unmount="1" fstype="ext3" mountpoint="/mnt/lun2" name="lun2" self_fence="1"/>
<lvm lv_name="LogVol20" name="VolGroup20/LogVol20" vg_name="VolGroup20"/>
</service>
<service autostart="1" exclusive="0" name="nodisk2" recovery="restart" domain="domain2">
<ip ref="10.0.24.114"/>
<script file="/etc/init.d/nodisk2" name="nodisk2"/>
</service>
</rm>
</cluster>