Das PROBE-Programm prüft die Verfügbarkeit des Datendienstes mithilfe von nslookup( 1M)-Befehlen. Die Rückmeldemethode Monitor_start startet dieses Programm, und die Rückmeldemethode Monitor_start stoppt es.
#!/bin/ksh #pragma ident “@(#)dns_probe 1.1 00/04/19 SMI” # #Testsignal-Methode für HA-DNS. # # Dieses Programm prüft die Verfügbarkeit des Datendienstes mithilfe von # nslookup, das den DNS-Server auffordert, selbst nach dem DNS-Server zu suchen. Wenn # der Server nicht antwortet bzw. die Abfrage von einem anderen Server beantwortet wird, # schließt der Test, dass ein Problem mit dem Datendienst aufgetreten ist, # und führt ein Failover auf einen anderen Knoten im Cluster durch. Die Testsignale # werden in bestimmten Intervallen gesendet, eingestellt durch THOROUGH_PROBE_INTERVAL # in der RTR-Datei. #pragma ident “@(#)dns_probe 1.1 00/05/24 SMI” ############################################################################### # Programmargumente analysieren. function parse_args # [args ...] { typeset opt while getopts `R:G:T:' opt do case “$opt” in R) # Name der DNS-Ressource. RESOURCE_NAME=$OPTARG ;; G) # Name der Ressourcengruppe, in der die Ressource # konfiguriert ist. RESOURCEGROUP_NAME=$OPTARG ;; T) # Name des Ressourcentyps. RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ “FEHLER: Option $OPTARG unbekannt” exit 1 ;; esac done } ############################################################################### # restart_service () # # Diese Funktion versucht, den Datendienst durch Aufruf der Stopp-Methode, # gefolgt von der Start-Methode des Datendienstes neu zu starten. Wenn der # Datendienst bereits beendet wurde und keine Markierung für den Datendienst # unter PMF registriert wurde, führt diese Funktion ein Failover für den Dienst # auf einen anderen Knoten im Cluster aus. # function restart_service { # Zum Neustarten des Datendienstes zunächst überprüfen, # ob der Datendienst selbst noch unter PMF registriert ist. pmfadm -q $PMF_TAG if [[ $? -eq 0 ]]; then # Da das TAG für den Datendienst noch unter PMF registriert # ist, zuerst den Datendienst stoppen und dann wieder neu starten.. # Stopp-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} Stopp-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 # unter PMF zulässigen Wiederholungen überschritten hat. # Es wird also nicht versucht, den Datendienst noch einmal # neu zu starten, sondern ein Failover auf # einen anderen Knoten im Cluster auszuführen. scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \ -R $RESOURCE_NAME fi return 0 } ############################################################################### # decide_restart_or_failover () # # Diese Funktion legt fest, welche Aktion bei Fehlschlagen eines Testsignals # auszuführen ist: lokaler Neustart des Datendienstes oder Failover auf einen # anderen Knoten im Cluster. # function decide_restart_or_failover { # Prüfen, ob dies der erste Neustartversuch ist. if [ $retries -eq 0 ]; then # Dies ist der erste Fehlschlag. Zeit für diesen # ersten Versuch festhalten. start_time=`$RT_BASEDIR/gettimè retries=`expr $retries + 1` # Da es sich um den ersten Fehlschlag handelt, versuchen, # den Datendienst neu zu starten. restart_service if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Datendienst konnte nicht neu gestartet werden.” exit 1 fi else # Dies ist nicht der erste Fehlschlag current_time=`$RT_BASEDIR/gettimè time_diff=`expr $current_time - $start_timè if [ $time_diff -ge $RETRY_INTERVAL ]; then # Dieser Fehlschlag ist aufgetreten, nachdem das Zeitfenster # verstrichen war. Daher den Wiederholungszähler zurücksetzen, # das Intervall verschieben und eine Wiederholung ausführen. retries=1 start_time=$current_time # Da der letzte Fehlschlag vor mehr als Retry_interval # auftrat, versuchen, den Datendienst neu zu starten. restart_service if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG “${ARGV0} HA-DNS konnte nicht neu gestartet werden.” exit 1 fi elif [ $retries -ge $RETRY_COUNT ]; then # Noch innerhalb des Zeitintervalls, und der # Wiederholungszähler ist abgelaufen, also Failover. retries=0 scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \ -R $RESOURCE_NAME if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Failover-Versuch fehlgeschlagen.” exit 1 fi else # Noch innerhalb des Zeitintervalls, und der # Wiederholungszähler ist nicht abgelaufen. # Also wird eine weitere Wiederholung ausgeführt. retries=`expr $retries + 1` restart_service if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} HA-DNS konnte nicht neu gestartet werden.” exit 1 fi fi fi } ############################################################################### # MAIN ############################################################################### export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # syslog-Funktion abrufen, mit der Meldungen protokolliert werden. SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` # Argumente analysieren, die an diese Methode übergeben wurden parse_args “$@” PMF_TAG=$RESOURCE_NAME.named SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # Das Intervall, in dem die Testsignale gesendet werden, ist in der systemdefinierten # Eigenschaft THOROUGH_PROBE_INTERVAL eingestellt. Den Wert dieser Eigenschaft mit # scha_resource_get abrufen PROBE_INTERVAL=`scha_resource_get -O THOROUGH_PROBE_INTERVAL \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ # Zeitüberschreitungswert abrufen, der für das Testsignal zulässig ist. # Dieser ist in der Erweiterungseigenschaft PROBE_TIMEOUT in der RTR-Datei eingestellt. # Die Standard-Zeitüberschreitung für nslookup ist 1,5 Minuten. 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}'` # Den Server, auf dem DNS läuft, durch Abrufen des Werts der # Ressourceneigenschaft NETWORK_RESOURCES_USED identifizieren. DNS_HOST=`scha_resource_get -O NETWORK_RESOURCES_USED -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # Wiederholungszählerwert aus der systemdefinierten Eigenschaft Retry_count abrufen RETRY_COUNT=`scha_resource_get -O RETRY_COUNT -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # Wiederholungsintervallwert aus der systemdefinierten Eigenschaft # Retry_interval abrufen RETRY_INTERVAL=`scha_resource_get -O RETRY_INTERVAL -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # Vollständigen Pfad für das Gettime-Dienstprogramm aus der # RT_basedir-Eigenschaft des Ressourcentyps abrufen. RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \ -G \$RESOURCEGROUP_NAMÈ # Der Test läuft in einer Endlosschleife und versucht nslookup-Befehle. # Eine temporäre Datei für die nslookup-Antworten konfigurieren. DNSPROBEFILE=/tmp/.$RESOURCE_NAME.probe probefail=0 retries=0 while : do # Das Intervall, in dem das Testsignal ausgeführt muss, ist in der # Eigenschaft THOROUGH_PROBE_INTERVAL angegeben. Daher das Testsignal für # eine Dauer von <THOROUGH_PROBE_INTERVAL> ruhen lassen sleep $PROBE_INTERVAL # Test ausführen, womit die IP-Adresse abgefragt wird, auf der # DNS läuft. 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 den nslookup-Befehl vom HA-DNS # -Server und nicht von einem anderen in der /etc/resolv.conf-Datei aufgelisteten # Server kommt. if [ $probefail -eq 0 ]; then # Namen des Servers abrufen, der auf die nslookup-Abfrage antwortet. 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 nicht auf 0 eingestellt ist, ist entweder die # Zeit für den nslookup-Befehl abgelaufen, oder die Antwort auf die Abfrage # kam von einem anderen Server (angegeben in der /etc/resolv.conf-Datei). In beiden # Fällen antwortet der DNS-Server nicht, und die Methode ruft # decide_restart_or_failover auf, wodurch ausgewertet wird, ob der Datendienst neu # gestartet oder ein Failover auf einen anderen Knoten ausgeführt wird. if [ $probefail -ne 0 ]; then decide_restart_or_failover else logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG]\ “${ARGV0} Testsignal für HA-DNS-Ressource erfolgreich” fi done |