Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Stop-Methode

Die Stop-Methode wird auf einem Cluster-Knoten aufgerufen, wenn die Ressourcengruppe mit der HA-DNS-Ressource auf diesem Knoten offline genommen wird bzw. wenn die Ressourcengruppe online bleibt, jedoch die Ressource deaktiviert wird. Diese Methode stoppt den in.named (DNS)-Dämon auf dem Knoten.

Dieser Abschnitt beschreibt die Hauptteile der Stop-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 Stop-Methode ist in Stop-Methode enthalten.

Überblick über Stop

Zwei Punkte müssen beim Stoppen des Datendienstes vor allem beachtet werden. Als Erstes muss für ein ordnungsgemäßes Herunterfahren gesorgt werden. Das Senden eines SIGTERM-Signals über pmfadm ist die beste Möglichkeit, ein ordnungsgemäßes Herunterfahren zu erzielen.

Als Zweites muss sichergestellt werden, dass der Datendienst wirklich gestoppt wird, um zu vermeiden, dass er in den Stop_failed-Zustand versetzt wird. Die beste Möglichkeit hierzu ist das Senden eines SIGKILL-Signals über pmfadm.

Die Stop-Methode im Beispieldatendienst berücksichtigt diese beiden Punkte. Sie sendet zunächst ein SIGTERM-Signal. Wenn dieses Signal den Datendienst nicht stoppen kann, sendet die Methode ein SIGKILL-Signal.

Bevor versucht wird, DNS zu stoppen, überprüft die Stop-Methode, ob der Prozess tatsächlich läuft. Wenn der Prozess ausgeführt wird, verwendet Stop PMF (pmfadm), um ihn zu stoppen.

Diese Stop-Methode ist garantiert idempotent. Auch wenn RGM eine Stop-Methode nicht zum zweiten Mal aufrufen sollte, ohne zuvor den Datendienst über einen Aufruf der entsprechenden Start-Methode gestartet zu haben, kann eine Stop-Methode für eine Ressource aufgerufen werden, obwohl diese nie gestartet wurde oder von selbst ausfiel. Diese Stop-Methode wird also mit Erfolg beendet, selbst wenn DNS nicht läuft.

Stoppen der Anwendung

Die Stop-Methode bietet zwei Möglichkeiten zum Stoppen des Datendienstes: eine geordnete oder weiche Art, bei der ein SIGTERM-Signal über pmfadm verwendet wird, und eine plötzliche oder harte Art, bei der ein SIGKILL-Signal eingesetzt wird. Die Stop-Methode ruft den Stop_timeout-Wert ab (den Zeitraum, in dem die Stop-Methode einen Wert zurückgeben muss). Stop weist dann 80% dieser Zeit dem weichen Stoppvorgang und 15% dem harten Stoppvorgang zu (5% werden zurückgehalten), wie im folgenden Beispiel gezeigt.

STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT -R $RESOURCE_NAME
\

-G $RESOURCEGROUP_NAMÈ
((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100))

((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100))

Die Stop-Methode verwendet pmfadm -q, um zu überprüfen, ob der DNS-Dämon läuft. Ist das der Fall, sendet Stop zunächst mit pmfadm -s ein TERM-Signal zum Beenden des DNS-Prozesses. Wenn dieses Signal den Prozess nach Ablauf von 80% des Zeitüberschreitungswertes nicht beenden konnte, sendet Stop ein SIGKILL-Signal. Wenn auch dieses Signal den Prozess nicht innerhalb von 15% des Zeitüberschreitungswertes beenden kann, protokolliert die Methode eine Fehlermeldung und wird mit Fehlerstatus beendet.

Wenn pmfadm den Prozess beendet, protokolliert die Methode eine Meldung, die besagt, dass der Prozess gestoppt wurde, und wird mit Erfolg beendet.

Wenn der DNS-Prozess nicht läuft, protokolliert die Methode eine diesbezügliche Meldung und wird dennoch mit Erfolg beendet. Das folgende Codebeispiel zeigt, wie Stop den pmfadm-Befehl zum Stoppen des DNS-Prozesses einsetzt.

# See if in.named is running, and if so, kill it. 
if pmfadm -q $PMF_TAG; then 
   # Send a SIGTERM signal to the data service and wait for 80% of
the
   # total timeout value.
   pmfadm -s $RESOURCE_NAME.named -w $SMOOTH_TIMEOUT TERM
   if [ $? -ne 0 ]; then 
      logger -p ${SYSLOG_FACILITY}.err \
          -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
          “${ARGV0} Failed to stop HA-DNS with SIGTERM; Retry with \
           SIGKILL”
      
      # Since the data service did not stop with a SIGTERM signal, use 
      # SIGKILL now and wait for another 15% of the total timeout value.
      pmfadm -s $PMF_TAG -w $HARD_TIMEOUT KILL
      if [ $? -ne 0 ]; then
          logger -p ${SYSLOG_FACILITY}.err \
          -t [$SYSLOG_TAG]
          “${ARGV0} Failed to stop HA-DNS; Exiting UNSUCCESFUL”
          
          exit 1
      fi   
fi
else 
   # The data service is not running as of now. Log a message and 
   # exit success.
   logger -p ${SYSLOG_FACILITY}.err \
           -t [$SYSLOG_TAG] \
           “HA-DNS is not started”

   # Even if HA-DNS is not running, exit success to avoid putting
   # the data service resource in STOP_FAILED State.

   exit 0

fi

# Could successfully stop DNS. Log a message and exit success.
logger -p ${SYSLOG_FACILITY}.err \
    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME]
\
    “HA-DNS successfully stopped”
exit 0

Stop-Beendigungsstatus

Eine Stop-Methode darf erst dann mit Erfolg beendet werden, wenn die zugrundeliegende Anwendung auch tatsächlich gestoppt wurde, vor allem wenn andere Datendienste von ihr abhängen. Andernfalls können Daten beschädigt werden.

Vergewissern Sie sich für komplexe Anwendungen wie zum Beispiel Datenbanken, dass der Wert für die Stop_timeout-Eigenschaft in der RTR-Datei ausreichend hoch eingestellt wird, damit die Anwendung beim Stoppvorgang genügend Zeit zum Bereinigen hat.

Wenn diese Methode DNS nicht stoppen kann und mit Fehlerstatus beendet wird, prüft RGM die Failover_mode-Eigenschaft, die festlegt, welche Reaktion nun erfolgt. Der Beispieldatendienst stellt die Failover_mode-Eigenschaft nicht explizit ein. Daher hat sie den Standardwert NONE, es sei denn, der Cluster-Verwalter hat diesen übersteuert und einen anderen Wert angegeben. In diesem Fall ist die einzige Aufgabe von RGM, den Zustand des Datendienstes auf Stop_failed einzustellen. Ein Bedienereingriff ist erforderlich, um das Stoppen der Anwendung zu erzwingen und den Stop_failed-Zustand aufzuheben.