Kunden-Skript ausgelöst durch Linux-Cluster Pacemaker

A

aixler

Grünschnabel
Hallo!
Ich komme aus der AIX-Welt wo es im HACMP-Cluster die Möglichkeit der Ausführung eines Start- bzw. Stop-Skriptes im Zuge einer Ressourcen-Gruppe gibt. Nun habe ich mir einen Linux-Cluster auf Basis von Centos7 aufgebaut. Meine Ressourcen bestehen momentan nur aus einer virtuellen IP-Adresse und einem Filesystem. Ich möchte in Zukunft einmal Oracle auf einem Linux-Cluster zum Laufen bringen. Dazu erkunde ich die Möglichkeit mit einem Kunden-Skript die Applikation vor dem Oracle-Shutdown zu beenden bzw. nach dem Oracle-Start mit einem Post-Skript die Applikation wieder zu starten. Leider finde ich keinen passablen Weg dies nachzubilden. Ich habe versucht die Dummy-Vorlage lt. untenstehender Homepage anzupassen, was aber darin geendet hat, dass das Skript alle Sekunde (einfaches "echo" mit Anhängen an eine Datei) aufgerufen wird, obwohl ich nur einen einmaligen Start erwartet habe:

raymii.org/s/tutorials/Corosync_Pacemaker_-_Execute_a_script_on_failover.html

Da ich keinen Link hochladen darf, "https" am Anfang verwenden.
 
Hi,

machst du das Filesystem via DRBD oder wie willst du die Datenbank-Files im Cluster zwischen den Nodes synchron halten?
Wegen dem Fehler des Scripts brauchen wir wie florian meinte den Code, aber soviel sei schon einmal voraus gesagt: Ich würde niemals eine Oracle DB so Clustern, nicht umsonst gibt es DataGuard, RAC & Co. so fällst du aus jedem Oracle-Support raus.
 
Hi,
wir verwenden auf AIX-Basis eine Storage-Anbindung über SAN mit Spiegelungsfunktion. Für meine Test-Umgebung habe ich einen eigenen Server laufen, der eine LUN über iSCSI bereitstellt. Wir verwenden schon seit vielen Jahren den HACMP-Cluster, wo einfach das ORACLE-Base-Verzeichnis im Falle eines Hardware-Ausfalls auf den passiven Node "geschwenkt" wird. Dadurch ist in der Cluster-Definition ein Start- und Stop-Skript definiert, das eben alle nötigen Applikationen wie Oracle, Listener, Samba, Tomcat, usw. vorher beendet bzw. nachher wieder startet. Anders kenne ich den Cluster nicht und ich glaube nicht dass alle meine Vorgänger - die allesamt nicht mehr in der Firma tätig sind - alles falsch gemacht haben. Bei diesem DataGurard geht es was meine ersten Recherchen ergeben haben um eine Primär- und Standby-Datenbank, die immer auf den aktuellen Stand gehalten werden und im Fehlerfall sogar ohne Downtime weiterläuft. Wie schon erwähnt sind solche Techniken bei uns nie zum Einsatz gekommen, sei es auch wegen lizenztechnischen Gründen. Dieses Thema scheint mir doch ein wenig komplex und ich werde wahrscheinlich um eine Beraterfunktion nicht herum kommen, da ich selber auch nur eine eher "dürftige" IT-Ausbildung genossen habe. Aber um zum Thema zurückzukommen. Ich habe das OCF-Script hier hochgeladen, wo in Zeile 95 das einfache Skript von mir eingebunden ist, das folgenden Inhalt hat:

echo "Ich bin die Resource simplescript" >> /u01/app/oracle/test.txt
date >> /u01/app/oracle/test.txt

Mein Hauptproblem ist dass das Skript laufend in die Test-Datei das Ergebnis des "echo"-Kommandos schreibt.
Ich möchte ja nur eine einmalige Ausführung eines selbst gestrickten Skripts vor dem Beenden der Ressourcen bzw. nach dem Starten auf dem anderen Node den einmaligen Start eines anderen Skripts. Ich habe im Pacemaker-GUI eine Reihe von Anwendungen gesehen, die über den Cluster verwaltet werden können, so auch "oracle" und "oralsnr". Dies ist auf den ersten Blick zwar sehr praktisch, aber wie soll ich selbst programmierte Anwendungen handeln, die natürlich nicht in dieser Class/Providerliste "ocf:heartbeat" aufscheinen? Kann es sein dass auf RHEL7 hier mehr Möglichkeiten als im Centos7 geboten werden? Vielleicht ist mein Ansatz auch ein komplett falscher, aber ich lasse mich gerne eines Besseren belehren.
 

Anhänge

  • FailOverScript.txt
    4,7 KB · Aufrufe: 3
Pack mal den Echo in ein separates Script und rufe es dediziert im failoverscript_start nach erfolgreichem Start auf.

Code:
failoverscript_start() {
    failoverscript_monitor
    /usr/local/bin/failover.sh
    if [ $? =  $OCF_SUCCESS ]; then
    return $OCF_SUCCESS
         /usr/local/bin/echoscript.sh
    fi
    touch ${OCF_RESKEY_state}
}

Vermutlich ist der Resourcen-Status nicht weitergereicht worden, dann versucht er immer wieder zu starten und du bekommst die ganzen Echos mehrmals in die Log.

Wenn du das ganze mit SAN-Spiegelung und Failover auf SAN-Ebene machst, dann ist ja gut, bei DRBD und Co wäre ich etwas vorsichtig mit Oracle.

Eigene Anwendungen unter Pacemaker zu stellen geht eigentlich recht einfach.
Du brauchst ein Start/Stop/Status init-Script und damit kannst du eigentlich schon alles machen, der Heartbeat fragt dann auf dem Master-System in einem vorgegebenen Intervall den Status ab, sollte dieser anhand der Return-Codes sehen, dass der Service auf Master nicht mehr lauft, wird die vorgegebene Kette ausgelöst und auf dem Slave gestartet. Schau dir mal LCMC und die dazugehörigen Beispiele an, damit kommst du sicher am einfachsten weiter:

http://lcmc.sourceforge.net/
 
Ich habe nun das Skript an die vorgeschlagene Stelle nach "return $OCF_SUCCESS" gestellt, mit dem Ergebnis dass es jetzt überhaupt keine Wirkung zeigt. Das Tool "LCMC" bringt bei den einzelnen Nodes immer "waiting for Pacemaker", was nur eine eingeschränkte Bedienung zulässt. Auf jeden Fall Danke für die guten Tipps, aber ich werde es vorerst aufgeben, da ich das Prinzip selbst definierter Services einfach nicht verstehe.
 
Hallo!
Ich habe doch noch einen kleinen Erfolg erreicht.
Nun funktioniert zumindest das Stopskript wie gewünscht.
Beim Starten wird das eingetragene Skript leider nicht aufgerufen.
Vielleicht könnt ihr mir doch noch helfen.

failoverscript_start() {
failoverscript_monitor
if [ $? = $OCF_SUCCESS ]; then
/usr/local/bin/startscript.sh
return $OCF_SUCCESS
fi
touch ${OCF_RESKEY_state}
}

failoverscript_stop() {
failoverscript_monitor
if [ $? = $OCF_SUCCESS ]; then
/usr/local/bin/stopscript.sh
rm ${OCF_RESKEY_state}
fi
return $OCF_SUCCESS
}

[root@centos7_cl-node1 ~]# pcs status resources
Resource Group: testgroup
VirtIP (ocf::heartbeat:IPaddr2): Started node1
OraFS (ocf::heartbeat:Filesystem): Started node1
customscript (ocf::heartbeat:FailOverScript): Started node1

[root@centos7_cl-node1 ~]# pcs constraint
Location Constraints:
Ordering Constraints:
start OraFS then start customscript (kind:Mandatory)
Colocation Constraints:
OraFS with customscript (score:INFINITY)
 
Zurück
Oben