Dieser Anhang enthält den vollständigen Code für jede Methode im Beispieldatendienst. Daneben listet er den Inhalt der Ressourcentyp-Registrierungsdatei auf.
Der Anhang enthält die folgenden Codeauflistungen.
Die RTR-Datei (Resource Type Registration, Ressourcentypregistrierung) enthält die Deklarationen der Ressourcen- und Ressourcentypeigenschaften, welche die anfängliche Konfiguration des Datendienstes zu dem Zeitpunkt definieren, an dem der Cluster-Verwalter den Datendienst registriert.
# # Copyright (c) 1998-2004 Sun Microsystems, Inc. # Alle Rechte vorbehalten. # # Registrierungsinformationen für DNS (Domain Name Service) # #pragma ident “@(#)SUNW.sample 1.1 00/05/24 SMI” RESOURCE_TYPE = “Beispiel”; VENDOR_ID = SUNW; RT_DESCRIPTION = “DNS (Domain Name Service) auf Sun Cluster”; RT_VERSION =”1.0”; API_VERSION = 2; FAILOVER = TRUE; RT_BASEDIR=/opt/SUNWsample/bin; PKGLIST = SUNWsample; START = dns_svc_start; STOP = dns_svc_stop; VALIDATE = dns_validate; UPDATE = dns_update; MONITOR_START = dns_monitor_start; MONITOR_STOP = dns_monitor_stop; MONITOR_CHECK = dns_monitor_check; # Eine Liste der Ressourceneigenschaftsdeklarationen in Klammern folgt auf die # Ressourcentypdeklarationen. Die Eigenschaftsnamensdeklaration muss das # erste Attribut nach der geöffneten geschweiften Klammer für jeden Eintrag sein. # # Die <Methoden>_timeout-Eigenschaften stellen den Wert in Sekunden ein, # nach dem RGM annimmt, dass der Aufruf der Methode fehlgeschlagen ist. # Der MIN-Wert für alle Methoden-Zeitüberschreitungen ist auf 60 Sekunden # eingestellt. Dies verhindert, dass die Verwalter kürzere Zeitüberschreitungen # einstellen, mit denen die Switchover-/Failover-Leistung nicht verbessert wird # und die zu unerwünschten RGM-Aktionen führen können (falsche Failover, # Knotenneustart oder Verschieben der Ressourcengruppe in den ERROR_STOP_FAILED-Zustand, was # einen Bedienereingriff erforderlich macht). Wenn zu kurze Methoden-Zeitüberschreitungen # eingestellt werden, führt dies zu einem *Absinken* der allgemeinen # Verfügbarkeit des Datendienstes. { PROPERTY = Start_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Stop_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Validate_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Update_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Monitor_Start_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Monitor_Stop_timeout; MIN=60; DEFAULT=300; } { PROPERTY = Thorough_Probe_Interval; MIN=1; MAX=3600; DEFAULT=60; TUNABLE = ANYTIME; } # Die Anzahl der auszuführenden Wiederholungen innerhalb eines bestimmten # Zeitraums, bevor angenommen wird, dass die Anwendung auf diesem Knoten nicht # erfolgreich gestartet werden kann. { PROPERTY = Retry_Count; MIN=0; MAX=10; DEFAULT=2; TUNABLE = ANYTIME; } # Stellen Sie Retry_Interval als ein Vielfaches von 60 ein, da es von # Sekunden in Minuten konvertiert wird und aufrundet. Ein Wert von 50 (Sekunden) # wird z. B. zu einer Minute konvertiert. Verwenden Sie diese Eigenschaft, um die # Anzahl der Wiederholungen einzustellen (Retry_Count). { PROPERTY = Retry_Interval; MIN=60; MAX=3600; DEFAULT=300; TUNABLE = ANYTIME; } { PROPERTY = Network_resources_used; TUNABLE = AT_CREATION; DEFAULT = ““; } # # Erweiterungseigenschaften # # Der Cluster-Verwalter muss den Wert dieser Eigenschaft so einstellen, dass # er auf das Verzeichnis mit den von der Anwendung verwendeten Konfigurationsdateien # zeigt. Geben Sie für diese Anwendung, DNS, den Pfad der DNS-Konfigurationsdatei # auf PXFS an (in der Regel named.conf). { PROPERTY = Confdir; EXTENSION; STRING; TUNABLE = AT_CREATION; DESCRIPTION = “Konfigurationsverzeichnispfad”; } # Zeitüberschreitungswert in Sekunden, bevor das Testsignal als fehlgeschlagen # deklariert wird. { PROPERTY = Probe_timeout; EXTENSION; INT; DEFAULT = 30; TUNABLE = ANYTIME; DESCRIPTION = “Zeitüberschreitungswert für das Testsignal (Sekunden)”; } |
RGM ruft die Start-Methode auf einem Cluster-Knoten auf, wenn die Ressourcengruppe, welche die Datendienstressource enthält, auf diesem Knoten online gebracht wird bzw. wenn die Ressource aktiviert wird. In der Beispielanwendung aktiviert die Start-Methode den in.named (DNS)-Dämon auf diesem Knoten.
#!/bin/ksh # # Start-Methode für HA-DNS. # # Diese Methode startet den Datendienst unter der Steuerung von PMF. # Vor dem Starten des in.named-Prozesses für DNS werden einige Kontrollprüfungen # ausgeführt. Die PMF-Markierung für den Datendienst ist $RESOURCE_NAME.named. # PMF versucht eine angegebene Anzahl von Malen (Retry_count), den Dienst zu starten. # Wenn die Anzahl der Versuche diesen Wert innerhalb eines bestimmten Zeitintervalls # (Retry_interval) überschreitet, berichtet PMF, dass der Start des Dienstes # fehlgeschlagen ist. Sowohl Retry_count als auch Retry_interval sind Eigenschaften # der in der RTR-Datei eingestellten Ressource. #pragma ident “@(#)dns_svc_start 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 } ############################################################################### # 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 # Wert der Confdir-Eigenschaft der Ressource abrufen, um DNS zu starten. # Unter Verwendung des eingegebenen Ressourcennamens und der Ressourcengruppe # wird der Wert von Confdir gesucht. Dieser Wert wird vom Cluster-Verwalter # eingestellt, wenn er die Ressource hinzufügt. config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Confdir` # scha_resource_get gibt sowohl den “Typ” als auch den # “Wert” der Erweiterungseigenschaften # zurück. Nur den Wert der Erweiterungseigenschaft abrufen. CONFIG_DIR=`echo $config_info | awk `{print $2}'` # Prüfen, ob der Zugriff auf $CONFIG_DIR möglich ist. if [ ! -d $CONFIG_DIR ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Verzeichnis $CONFIG_DIR fehlt oder nicht eingehängt” exit 1 fi # Zum Verzeichnis $CONFIG_DIR wechseln, falls die Datendateien relative # Pfadnamen enthalten. cd $CONFIG_DIR # Prüfen, ob die named.conf-Datei im Verzeichnis $CONFIG_DIR vorhanden ist. if [ ! -s named.conf ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Datei $CONFIG_DIR/named.conf fehlt oder ist leer” exit 1 fi # Wert für Retry_count aus der RTR-Datei abrufen. RETRY_CNT=`scha_resource_get -O Retry_Count -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # Wert für Retry_interval aus der RTR-Datei abrufen. Dieser Wert in # Sekunden wird für die Weitergabe an pmfadm in Minuten konvertiert. # Beachten Sie, dass bei dieser Konvertierung gerundet wird, so # dass z. B. 50 Sekunden auf eine Minute gerundet werden. ((RETRY_INTRVAL = `scha_resource_get -O Retry_Interval -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ 60)) # in.named-Dämon unter Steuerung von PMF starten. Bis zu # $RETRY_COUNT Male in einem Zeitraum von $RETRY_INTERVAL abstürzen lassen # und neu starten; wenn er öfter abstürzt, versucht PMF keinen # Neustart mehr. Wenn bereits ein Prozess unter der Markierung # <$PMF_TAG> registriert ist, dann sendet PMF eine Warnmeldung, # dass der Prozess bereits läuft. echo “Wiederholungsintervall ist “$RETRY_INTRVAL pmfadm -c $PMF_TAG.named -n $RETRY_CNT -t $RETRY_INTRVAL \ /usr/sbin/in.named -c named.conf # Meldung protokollieren, die angibt, dass HA-DNS gestartet wurde. if [ $? -eq 0 ]; then logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG]\ “${ARGV0} HA-DNS wurde erfolgreich gestartet” fi exit 0 |
Die Stop-Methode wird auf einem Cluster-Knoten aufgerufen, wenn die Ressourcengruppe, welche die HA-DNS-Ressource enthält, auf diesem Knoten offline gebracht bzw. wenn die Ressource deaktiviert wird. Diese Methode stoppt den in.named (DNS)-Dämon auf dem Knoten.
#!/bin/ksh # # Stopp-Methode für HA-DNS # # Stoppt den Datendienst mithilfe von PMF. Wenn der Dienst nicht läuft, wird die # Methode mit Status 0 beendet, da die Rückgabe eines anderen Wertes die # Ressource in STOP_FAILED-Zustand versetzt. #pragma ident “@(#)dns_svc_stop 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 } ############################################################################### # MAIN # ############################################################################## export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH # syslog-Funktion aufrufen, 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 # Stop_timeout-Wert aus der RTR-Datei abrufen. STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT -R $RESOURCE_NAME -G \ $RESOURCEGROUP_NAMÈ # Versuchen, den Datendienst unter Verwendung eines SIGTERM # -Signals über PMF ordnungsgemäß zu stoppen. Bis zu 80% des Stop_timeout-Werts # warten, um zu sehen, ob SIGTERM den Datendienst erfolgreich stoppen kann. Andernfalls # SIGKILL senden, um den Datendienst zu stoppen. Bis zu 15% des Stop_timeout-Wertes # warten, um zu sehen, ob SIGKILL erfolgreich ist. Andernfalls ist ein Fehlschlag # aufgetreten, und die Methode wird in einem Nicht-Null-Status beendet. # Die restlichen 5% von Stop_timeout werden für andere Zwecke verwendet. ((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100)) ((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100)) # Überprüfen, ob in.named läuft. Falls ja, Abbruch erzwingen. if pmfadm -q $PMF_TAG.named; then # SIGTERM-Signal an den Datendienst senden und bis zu 80% des # gesamten Zeitüberschreitungswertes warten. pmfadm -s $PMF_TAG.named -w $SMOOTH_TIMEOUT TERM if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.info -t [SYSLOG_TAG] \ “${ARGV0} HA-DNS konnte nicht mit SIGTERM gestoppt werden; Wiederholen mit \ SIGKILL” # Da der Datendienst mit einem SIGTERM-Signal nicht gestoppt wurde, # jetzt SIGKILL verwenden und nochmals 15% des gesamten # Zeitüberschreitungswertes warten. pmfadm -s $PMF_TAG.named -w $HARD_TIMEOUT KILL if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [SYSLOG_TAG] \ “${ARGV0} HA-DNS konnte nicht gestoppt werden; Beenden OHNE ERFOLG” exit 1 fi fi else # Der Datendienst läuft nun nicht mehr. Meldung protokollieren und # mit Erfolg beenden. logger -p ${SYSLOG_FACILITY}.info -t [SYSLOG_TAG] \ “HA-DNS ist nicht gestartet” # Auch wenn HA-DNS nicht läuft, wird mit Erfolg beendet, damit der Datendienst # nicht in einen STOP_FAILED-Zustand versetzt wird. exit 0 fi # DNS erfolgreich gestoppt. Meldung protokollieren und mit Erfolg beenden. logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ “HA-DNS erfolgreich gestoppt” exit 0 |
Das gettime-Dienstprogramm ist ein C-Programm, das vom PROBE-Programm zur Verfolgung der verstrichenen Zeit zwischen den Neustarts des Testsignals verwendet wird. Sie müssen dieses Programm kompilieren und im gleichen Verzeichnis wie die Rückmeldemethoden ablegen, also in dem Verzeichnis, auf das die RT_basedir -Eigenschaft zeigt.
# # Dieses Dienstprogramm, das von der Testsignal-Methode des Datendienstes verwendet wird, # verfolgt die verstrichene Zeit in Sekunden ab einem bekannten Referenzpunkt (Epoch-Punkt). # Es muss kompiliert und in demselben Verzeichnis wie die Rückmeldemethoden # des Datendienstes abgelegt werden (RT_basedir). #pragma ident “@(#)gettime.c 1.1 00/05/24 SMI” #include <stdio.h> #include <sys/types.h> #include <time.h> main() { printf(“%d\n”, time(0)); exit(0); } |
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 |
Diese Methode startet das PROBE-Programm für den Datendienst.
#!/bin/ksh # # Monitor-Start-Methode für HA-DNS. # # Diese Methode startet den Monitor (Testsignal) für den Datendienst unter # Steuerung durch PMF. Der Monitor ist ein Prozess, der den Datendienst in # regelmäßigen Intervallen testet und im Fall von Problemen auf demselben # Knoten neu startet oder ein Failover auf einen anderen Knoten im Cluster ausführt. # Das PMF-Tag für den Monitor ist $RESOURCE_NAME.monitor. #pragma ident “@(#)dns_monitor_start 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 } ############################################################################### # 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.monitor SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # Feststellen, wo die Testsignal-Methode residiert, indem der Wert der # RT_BASEDIR-Eigenschaft des Datendienstes abgerufen wird. RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # Das Testsignal für den Datendienst unter PMF starten. Option für # uneingeschränkte Wiederholungen für das Starten des Testsignals verwenden. # Den Ressourcennamen, Gruppe und Typ an die Testsignal-Methode übergeben. pmfadm -c $PMF_TAG.monitor -n -1 -t -1 \ $RT_BASEDIR/dns_probe -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME -T $RESOURCETYPE_NAME # Meldung protokollieren, die angibt, dass der Monitor für HA-DNS # gestartet wurde. if [ $? -eq 0 ]; then logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ “${ARGV0} Monitor für HA-DNS wurde erfolgreich gestartet” fi exit 0 |
Diese Methode stoppt das PROBE-Programm für den Datendienst.
#!/bin/ksh # Monitor-Stopp-Methode für HA-DNS # Stoppt den laufenden Monitor mithilfe von PMF. #pragma ident “@(#)dns_monitor_stop 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 } ############################################################################### # 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.monitor SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # Prüfen, ob der Monitor läuft und gegebenenfalls Beenden erzwingen. if pmfadm -q $PMF_TAG.monitor; then pmfadm -s $PMF_TAG.monitor KILL if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Monitor für Ressource “ \ $RESOURCE_NAME konnte nicht gestoppt werden exit 1 else # Monitor konnte erfolgreich gestoppt werden. Meldung protokollieren. logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG]\ “${ARGV0} Monitor für Ressource “ $RESOURCE_NAME \ “ erfolgreich gestoppt” fi fi exit 0 |
Diese Methode überprüft das Vorhandensein des Verzeichnisses, auf das die Confdir-Eigenschaft zeigt. RGM ruft jedesmal Monitor_check auf, wenn die PROBE-Methode ein Failover des Datendienstes auf einen neuen Knoten ausführt, und prüft auch Knoten, die potenzielle Master sind.
#!/bin/ksh # Monitor-Prüfmethode für DNS. # # RGM ruft diese Methode immer dann auf, wenn der Fehler-Monitor für den # Datendienst ein Failover auf einen neuen Knoten ausführt. Monitor_check ruft # die Validate-Methode auf, um zu prüfen, ob das Konfigurationsverzeichnis # und die -dateien auf dem neuen Knoten verfügbar sind. #pragma ident “@(#)dns_monitor_check 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 } ############################################################################### # 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 # Vollständigen Pfad für die Validate-Methode aus der # RT_BASEDIR-Eigenschaft des Ressourcentyps abrufen. RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # Namen der Validate-Methode für diese Ressource abrufen. VALIDATE_METHOD=`scha_resource_get -O VALIDATE -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # Wert für die Confdir-Eigenschaft zum Starten des Datendienstes abrufen. # Den eingegebenen Ressourcennamen und die Ressourcengruppe zum Abrufen des # Confdir-Wertes verwenden, der bei Hinzufügen der Ressource eingestellt wurde. config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Confdir` # scha_resource_get gibt sowohl den Typ als auch den Wert von # Erweiterungseigenschaften zurück. awk verwenden, um nur den Wert der # Erweiterungseigenschaft abzurufen. CONFIG_DIR=`echo $config_info | awk `{print $2}'` # Validate-Methode aufrufen, damit für den Datendienst ein erfolgreiches Failover # auf den neuen Knoten ausgeführt werden kann. $RT_BASEDIR/$VALIDATE_METHOD -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \ -T $RESOURCETYPE_NAME -x Confdir=$CONFIG_DIR # Meldung protokollieren, die angibt, dass die Monitor-Prüfung erfolgreich war. if [ $? -eq 0 ]; then logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ “${ARGV0} Monitor-Prüfung für DNS erfolgreich.” exit 0 else logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Monitor-Prüfung für DNS nicht erfolgreich.” exit 1 fi |
Diese Methode überprüft das Vorhandensein des Verzeichnisses, auf das die Confdir-Eigenschaft zeigt. RGM ruft diese Methode auf, wenn der Datendienst erstellt wird und wenn der Cluster-Verwalter Datendiensteigenschaften aktualisiert. Die Monitor_check-Methode ruft diese Methode immer dann auf, wenn der Fehler-Monitor ein Failover des Datendienstes auf einen neuen Knoten ausführt.
#!/bin/ksh # # Validate-Methode für HA-DNS. # Diese Methode validiert die Confdir-Eigenschaft der Ressource. Die Validate- # Methode wird in zwei Szenarios aufgerufen: Beim Erstellen der Ressource und beim # Aktualisieren einer Ressourceneigenschaft. Beim Erstellen der Ressource # wird diese Methode mit dem -c-Flag aufgerufen, und alle systemdefinierten # und Erweiterungseigenschaften werden als Befehlszeilenargumente übergeben. # Beim Aktualisieren einer Ressourceneigenschaft wird die Validate-Methode mit # dem -u-Flag aufgerufen, und nur das Eigenschafts-/Wertepaar der zu aktualisierenden # Eigenschaft wird als Befehlszeilenargument übergeben. # # Bsp.: Wenn die Ressource erstellt wird, lauten die Befehlsargumente # # dns_validate -c -R <..> -G <...> -T <..> -r <sysdef-prop=value>... # -x <extension-prop=value>.... -g <resourcegroup-prop=value>.... # # Wenn die Ressourceneigenschaft aktualisiert wird # # dns_validate -u -R <..> -G <...> -T <..> -r <sys-prop_being_updated=value> # ODER # dns_validate -u -R <..> -G <...> -T <..> -x <extn-prop_being_updated=value> #pragma ident “@(#)dns_validate 1.1 00/05/24 SMI” ############################################################################### # Programmargumente analysieren. # function parse_args # [args ...] { typeset opt while getopts `cur:x:g:R:T:G:' 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 ;; r) #Die Methode greift auf keine systemdefinierten Eigenschaften #zu, so dass diese Option nicht besteht. ;; g) # Die Methode greift auf keine Ressourcengruppeneigenschaften # zu, so dass diese Option nicht besteht. ;; c) # Gibt an, dass die Validate-Methode aufgerufen wird, während # die Ressource erstellt wird, so dass dieses Flag nicht als # Option besteht. ;; u) # Gibt die Aktualisierung einer Eigenschaft an, wenn die # Ressource bereits vorhanden ist. Wenn die Confdir-Eigenschaft # aktualisiert wird, muss Confdir in den Befehlszeilenargumenten # stehen. Andernfalls muss die Methode eigens unter Verwendung von # scha_resource_get danach suchen. UPDATE_PROPERTY=1 ;; x) # Erweiterungseigenschaftsliste. Eigenschafts- und Wertepaare # werden mit “=” als Trennzeichen voneinander getrennt. PROPERTY=`echo $OPTARG | awk -F= `{print $1}'` VAL=`echo $OPTARG | awk -F= `{print $2}'` # Wenn die Confdir-Erweiterungseigenschaft in der Befehlszeile # steht, deren Wert festhalten. if [ $PROPERTY == “Confdir” ]; then CONFDIR=$VAL CONFDIR_FOUND=1 fi ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG] \ “FEHLER: Option $OPTARG unbekannt” exit 1 ;; esac done } ############################################################################### # 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` # Den Wert von CONFDIR auf Null einstellen. Später ruft diese Methode # den Wert der Confdir-Eigenschaft von der Befehlszeile aus oder mithilfe # von scha_resource_get ab. CONFDIR=”” UPDATE_PROPERTY=0 CONFDIR_FOUND=0 # Argumente analysieren, die für diese Methode übergeben wurden. parse_args “$@” # Wenn die Validate-Methode wegen Aktualisierung von Eigenschaften # aufgerufen wird, versuchen, den Wert der Confdir-Erweiterungseigenschaft von der # Befehlszeile aus abzurufen. Andernfalls den Wert von Confdir mithilfe von # scha_resource_get abrufen. if ( (( $UPDATE_PROPERTY == 1 )) && (( CONFDIR_FOUND == 0 )) ); then config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Confdir` CONFDIR=`echo $config_info | awk `{print $2}'` fi # Überprüfen, ob die Confdir-Eigenschaft einen Wert hat. Andernfalls tritt ein # Fehlschlag ein, und es wird mit Status 1 beendet. if [[ -z $CONFDIR ]]; then logger -p ${SYSLOG_FACILITY}.err \ “${ARGV0} Validate-Methode für Ressource “$RESOURCE_NAME “ fehlgeschlagen” exit 1 fi # Jetzt den aktuellen Confdir-Eigenschaftswert validieren. # Überprüfen, ob der Zugriff auf $CONFDIR möglich ist. if [ ! -d $CONFDIR ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG]\ “${ARGV0} Verzeichnis $CONFDIR fehlt oder nicht eingehängt” exit 1 fi # Überprüfen, ob die named.conf-Datei im Confdir-Verzeichnis vorhanden ist. if [ ! -s $CONFDIR/named.conf ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Datei $CONFDIR/named.conf fehlt oder ist leer” exit 1 fi # Meldung protokollieren, die angibt, dass die Validate-Methode erfolgreich war. logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ “${ARGV0} Validate-Methode für Ressource “$RESOURCE_NAME \ “ erfolgreich beendet” exit 0 |
RGM ruft die Update-Methode auf, um eine laufende Ressource von der Änderung ihrer Eigenschaften zu benachrichtigen.
#!/bin/ksh # # Update-Methode für HA-DNS. # # Die Aktualisierungen der Eigenschaften an sich nimmt RGM vor. Aktualisierungen # betreffen nur den Fehler-Monitor, so dass diese Methode den Fehler-Monitor neu # starten muss. #pragma ident “@(#)dns_update 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 } ############################################################################### # 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.monitor SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # Feststellen, wo die Testsignal-Methode residiert, indem der Wert der # RT_BASEDIR-Eigenschaft der Ressource abgerufen wird. RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAMÈ # Wenn die Update-Methode aufgerufen wird, aktualisiert RGM den Wert der # Eigenschaft, die aktualisiert wird. Diese Methode muss prüfen, ob der # Fehler-Monitor (Testsignal) läuft. Falls ja, muss das Beenden erzwungen # und neu gestartet werden. if pmfadm -q $PMF_TAG.monitor; then # Beenden des bereits laufenden Monitors erzwingen pmfadm -s $PMF_TAG.monitor TERM if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \ “${ARGV0} Monitor konnte nicht gestoppt werden” exit 1 else # DNS konnte erfolgreich gestoppt werden. Meldung protokollieren. logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \ “Monitor für HA-DNS erfolgreich gestoppt” fi # Monitor neu starten. pmfadm -c $PMF_TAG.monitor -n -1 -t -1 $RT_BASEDIR/dns_probe \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME -T $RESOURCETYPE_NAME if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG]\ “${ARGV0} Monitor für HA-DNS konnte nicht neu gestartet werden “ exit 1 else logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG]\ “Monitor für HA-DNS erfolgreich neu gestartet” fi fi exit 0 |