Das dns_probe-Programm implementiert einen ständig ausgeführten Prozess, der überprüft, ob die vom Beispieldatendienst gesteuerte DNS-Ressource läuft. Der dns_probe-Befehl wird von der dns_monitor_start-Methode ausgelöst, die wiederum automatisch von RGM aufgerufen wird, sobald der Beispieldatendienst online gebracht wurde. Der Datendienst wird von der dns_monitor_stop-Methode gestoppt, die RGM anschließend aufruft, bevor der Beispieldatendienst offline gebracht wird.
Dieser Abschnitt beschreibt die Hauptteile der PROBE-Methode für die Beispielanwendung. Die Funktionalität, die allen Rückmeldemethoden gemeinsam ist, wird nicht beschrieben, wie zum Beispiel die parse_args()-Funktion und das Abrufen von syslog (in Bereitstellen gemeinsamer Funktionalität für alle Methoden beschrieben).
Eine vollständige Auflistung der PROBE-Methode finden Sie unter PROBE-Programm.
Das Testsignal läuft in einer Endlosschleife. Es verwendet nslookup, um zu überprüfen, ob die richtige DNS-Ressource läuft. Wenn DNS läuft, ruht das Testsignal während eines festgesetzten Zeitintervalls (eingestellt von der systemdefinierten Eigenschaft Thorough_probe_interval) und prüft dann erneut. Wenn DNS nicht läuft, versucht das Programm einen lokalen Neustart. Je nach der Anzahl der Neustartversuche kann es auch anfordern, dass RGM den Datendienst auf einen anderen Knoten verschiebt.
Dieses Programm benötigt die Werte der folgenden Eigenschaften:
Thorough_probe_interval – Zum Einstellen des Zeitraums, während dem das Testsignal ruht.
Probe_timeout – Zum Durchsetzen des Zeitüberschreitungswertes für das Testsignal an den nslookup-Befehl, der den Test ausführt.
Network_resources_used – Zum Abrufen der IP-Adresse, unter der DNS läuft.
Retry_count und Retry_interval – Zum Festlegen der Anzahl von Neustartversuchen und des Zeitraums, über den die Versuche gezählt werden.
RT_basedir – Zum Abrufen des Verzeichnisses, in dem das PROBE-Programm und das gettime-Dienstprogramm gespeichert sind
Die Funktion scha_resource_get() ruft die Werte dieser Eigenschaften ab und speichert sie folgendermaßen in Shell-Variablen:
PROBE_INTERVAL=`scha_resource_get -O THOROUGH_PROBE_INTERVAL \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME` probe_timeout_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Probe_timeout` PROBE_TIMEOUT=`echo $probe_timeout_info | awk '{print $2}'` DNS_HOST=`scha_resource_get -O NETWORK_RESOURCES_USED -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME` RETRY_COUNT=`scha_resource_get -O RETRY_COUNT -R $RESOURCE_NAME -G\ $RESOURCEGROUP_NAME` RETRY_INTERVAL=`scha_resource_get -O RETRY_INTERVAL -R $RESOURCE_NAME -G\ $RESOURCEGROUP_NAME` RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME -G\ $RESOURCEGROUP_NAME`
Für systemdefinierte Eigenschaften wie Thorough_probe_interval gibt scha_resource_get() nur den Wert zurück. Für Erweiterungseigenschaften wie Probe_timeout gibt scha_resource_get() den Typ und den Wert zurück. Verwenden Sie den awk-Befehl, um nur den Wert abzurufen.
Das Testsignal selbst besteht aus einer while-Endlosschleife aus nslookup-Befehlen. Vor der while-Schleife wird eine temporäre Datei für die nslookup-Antworten eingerichtet. Die Variablen probefail und retries werden auf 0 initialisiert .
# Temporäre Datei für nslookup-Antworten konfigurieren. DNSPROBEFILE=/tmp/.$RESOURCE_NAME.probe probefail=0 retries=0 |
Die while-Schleife selbst hat folgende Aufgaben:
Festlegen des Ruheintervalls für das Testsignal.
Verwenden von hatimerun zum Auslösen von nslookup durch Übergabe des Probe_timeout-Werts und Identifizieren des Zielhosts.
Festlegen der probefail-Variable, basierend auf dem Erfolg oder Fehlschlag des nslookup-Rückgabecodes.
Wenn probefail auf 1 (Fehlschlag) eingestellt ist, wird überprüft, ob die Antwort auf nslookup vom Beispieldatendienst und nicht von einem anderen DNS-Server kam.
Es folgt der while-Schleifencode.
while : do # Das Intervall, in dem das Testsignal ausgeführt werden muss, wird in der # Eigenschaft THOROUGH_PROBE_INTERVAL angegeben. Daher wird das Ruhen # des Testsignals auf eine Dauer von THOROUGH_PROBE_INTERVAL eingestellt. sleep $PROBE_INTERVAL # nslookup-Befehl für die IP-Adresse des DNS ausführen. hatimerun -t $PROBE_TIMEOUT /usr/sbin/nslookup $DNS_HOST $DNS_HOST \ > $DNSPROBEFILE 2>&1 retcode=$? if [ $retcode -ne 0 ]; then probefail=1 fi # Sicherstellen, dass die Antwort auf nslookup vom HA-DNS- # Server und nicht von einem anderen in der /etc/resolv.conf-Datei # genannten Namensserver stammt. if [ $probefail -eq 0 ]; then # Namen des Servers abrufen,m der auf die nslookup-Abfrage geantwortet hat. SERVER=` awk ' $1=="Server:" { print $2 }' \ $DNSPROBEFILE | awk -F. ' { print $1 } ' ` if [ -z "$SERVER" ]; then probefail=1 else if [ $SERVER != $DNS_HOST ]; then probefail=1 fi fi fi |
Wenn die probefail-Variable ungleich 0 (Erfolg) ist, bedeutet dies, dass die Zeitüberschreitung für den nslookup-Befehl abgelaufen war oder dass die Antwort von einem anderen Server als dem Beispieldienst-DNS kam. In beiden Fällen funktioniert der DNS-Server nicht wie erwartet, und der Fehler-Monitor ruft die Funktion decide_restart_or_failover() auf, um festzulegen, ob der Datendienst lokal neu gestartet wird oder ob RGM aufgefordert wird, den Datendienst auf einen anderen Knoten zu verschieben. Wenn die probefail-Variable 0 ist, wird eine Meldung generiert, die besagt, dass das Testsignal erfolgreich war.
if [ $probefail -ne 0 ]; then decide_restart_or_failover else logger -p ${SYSLOG_FACILITY}.err\ -t [$SYSLOG_TAG]\ "${ARGV0} Testsignal für Ressource HA-DNS erfolgreich" fi |
Die Funktion decide_restart_or_failover() verwendet ein Zeitfenster (Retry_interval) und einen Fehlschlagzähler (Retry_count), um festzulegen, ob DNS lokal neu gestartet oder RGM aufgefordert wird, den Datendienst auf einen anderen Knoten zu verschieben. Sie implementiert den folgenden bedingten Code (siehe die Codeauflistung für decide_restart_or_failover() in PROBE-Programm).
Wenn dies der erste Fehlschlag ist, wird der Datendienst neu gestartet. Es wird eine Fehlermeldung protokolliert und der Zähler in der retries-Variable weitergedreht.
Wenn es sich nicht um den ersten Fehlschlag handelt, aber das Zeitfenster überschritten wurde, wird der Datendienst neu gestartet. Es wird eine Fehlermeldung protokolliert, der Zähler zurückgesetzt und das Fenster verschoben.
Wenn das Zeitfenster noch nicht abgelaufen ist und der Wiederholversuchszähler überschritten wurde, wird ein Failover auf einen anderen Knoten ausgeführt. Wenn das Failover fehlschlägt, wird ein Fehler protokolliert und das Testsignalprogramm mit Status 1 (Fehlschlag) beendet.
Wenn das Zeitfenster noch nicht abgelaufen ist und der Wiederholversuchszähler nicht überschritten wurde, wird der Datendienst neu gestartet. Es wird eine Fehlermeldung protokolliert und der Zähler in der retries-Variable weitergedreht.
Wenn die Anzahl der Neustarts während des Zeitintervalls den Grenzwert erreicht, fordert die Funktion bei RGM das Verschieben des Datendienstes auf einen anderen Knoten an. Wenn die Anzahl der Neustarts den Grenzwert noch nicht erreicht hat, bzw. wenn das Zeitintervall abgelaufen ist und die Zählung von vorn beginnt, versucht die Funktion, DNS auf demselben Knoten neu zu starten. Beachten Sie Folgendes für diese Funktion:
Das gettime-Dienstprogramm wird zum Verfolgen der Zeit zwischen Neustarts verwendet. Dabei handelt es sich um ein C-Programm, das im (RT_basedir-) Verzeichnis residiert.
Die systemdefinierten Ressourceneigenschaften Retry_count und Retry_interval legen die Anzahl der Neustartversuche und das Zeitintervall für die Zählung fest. Der Standardwert für diese Eigenschaften in der RTR-Datei liegt bei 2 Versuchen in einem Zeitraum von 5 Minuten (300 Sekunden). Der Cluster-Verwalter kann diese Werte jedoch ändern.
Die restart_service()-Funktion wird aufgerufen, um zu versuchen, den Datendienst auf demselben Knoten neu zu starten. Weitere Informationen zu dieser Funktion finden Sie im nächsten Abschnitt, Neustarten des Datendienstes.
Die API-Funktion scha_control() bringt die Ressourcengruppe, die den Beispieldatendienst enthält, mit der Option GIVEOVER offline und auf einem anderen Knoten wieder online.
Die restart_service()-Funktion wird von decide_restart_or_failover() aufgerufen, um einen Neustart des Datendienstes auf dem gleichen Knoten zu versuchen. Diese Funktion führt folgende Aufgaben aus.
Sie stellt fest, ob der Datendienst noch unter PMF registriert ist. Wenn der Dienst noch registriert ist, geht die Funktion folgendermaßen vor:
Sie ruft den Stop-Methodennamen und den Stop_timeout-Wert für den Datendienst ab.
Sie verwendet hatimerun, um die Stop-Methode für den Datendienst zu starten, indem sie den Stop_timeout-Wert übergibt.
Wenn der Datendienst erfolgreich gestoppt wurde, ruft sie den Start-Methodennamen und den Start_timeout-Wert für den Datendienst ab.
Sie verwendet hatimerun, um die Start-Methode für den Datendienst zu starten, indem sie den Start_timeout-Wert übergibt.
Wenn der Datendienst nicht mehr unter PMF registriert ist, bedeutet dies, dass er die maximale Anzahl zulässiger Wiederholversuche unter PMF überschritten hat. Daher wird die scha_control()-Funktion mit der GIVEOVER-Option aufgerufen, um für den Datendienst ein Failover auf einen anderen Knoten auszuführen.
function restart_service { # Um den Datendienst neu zu starten, wird zunächst überprüft, ob # der Datendienst selbst noch unter PMF registriert ist. pmfadm -q $PMF_TAG if [[ $? -eq 0 ]]; then # Da das Tag fur den Datendienst noch unter PMF registriert ist, # den Datendienst zunächst stoppen und dann wieder neu starten. # Stop-Methodenname und STOP_TIMEOUT-Wert für diese # Ressource abrufen. STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ STOP_METHOD=`scha_resource_get -O STOP \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ hatimerun -t $STOP_TIMEOUT $RT_BASEDIR/$STOP_METHOD \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \ -T $RESOURCETYPE_NAME if [[ $? -ne 0 ]]; then logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Stop-Methode fehlgeschlagen.” return 1 fi # START-Methodenname und START_TIMEOUT-Wert für diese # Ressource abrufen. START_TIMEOUT=`scha_resource_get -O START_TIMEOUT \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ START_METHOD=`scha_resource_get -O START \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ hatimerun -t $START_TIMEOUT $RT_BASEDIR/$START_METHOD \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \ -T $RESOURCETYPE_NAME if [[ $? -ne 0 ]]; then logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Start-Methode fehlgeschlagen.” return 1 fi else # Das Fehlen des TAG für den Datendienst weist darauf # hin, dass der Datendienst bereits die maximale Anzahl # der unter PMF zulässigen Wiederholversuche überschritten hat. # Daher nicht versuchen, den Datendienst noch einmal neu # zu starten, sondern ein Failover auf einen anderen Knoten im # Cluster versuchen. scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \ -R $RESOURCE_NAME fi return 0 } |
Das PROBE-Programm des Datendienstes wird mit Fehlschlag beendet, wenn sowohl die lokalen Neustartversuche als auch die Failover-Versuche auf einen anderen Knoten fehlgeschlagen sind. Es protokolliert die Meldung “Failover-Versuch fehlgeschlagen”.