Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Funktionsweise der 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 an diesem Knoten.

Dieser Abschnitt beschreibt die Hauptteile der Stop-Methode für die Beispielanwendung. In diesem Abschnitt werden keine Funktionen beschrieben, die allen Rückmeldemethoden gemeinsam sind, wie die parse_args()-Funktion. In diesem Abschnitt wird ebenfalls nicht beschrieben, wie die syslog()-Funktion verwendet wird. Die gemeinsamen Funktionen werden im Abschnitt Bereitstellen gemeinsamer Funktionalität für alle Methoden beschrieben.

Eine vollständige Auflistung der Stop-Methode finden Sie im Abschnitt Auflistung des Stop-Methodencodes.

Die Stop-Methode

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 durch pmfadm ist die beste Methode für ein ordnungsgemäßes Herunterfahren.

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 Methode, den Datendienst in diesen Zustand zu versetzen, besteht darin, ein SIGKILL-Signal über pmfadm zu senden.

Die Stop-Methode dieses Beispieldienstes berücksichtigt beide Möglichkeiten. Zuerst sendet sie ein SIGTERM-Signal. Wenn der Datendienst nicht mit diesem Signal angehalten werden 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. Ist dies der Fall, verwendet Stop PMF (pmfadm), um den Prozess zu stoppen.

Diese Stop-Methode ist garantiert idempotent. Obwohl RGM eine Stop-Methode nicht zweimal aufrufen sollte, ohne zuerst den Datendienst über einen Aufruf seiner Start-Methode zu starten, könnte RGM eine Stop-Methode für eine Ressource selbst dann aufrufen, wenn die Ressource gar nicht gestartet oder abgebrochen wurde. 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: einen ordentlichen oder "sanften" Ansatz, bei dem ein SIGTERM-Signal über pmfadm gesendet wird und einen abrupten oder "harten" Ansatz, bei dem ein SIGKILL-Signal verwendet wird. Die Stop-Methode ruft den Stop_timeout-Wert ab (die Zeit, in der die Stop-Methode einen Wert zurückgeben muss). Stop weist dann 80% dieser Zeit dem sanften 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_NAME'
((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. Wird der DNS-Dämon ausgeführt, verwendet Stop zuerst pmfadm -s, um ein TERM-Signal zum Beenden des DNS-Prozesses zu senden. Falls dieses Signal den Prozess nach 80 Prozent des Zeitüberschreitungswertes nicht beendet, sendet Stop ein SIGKILL-Signal. Wenn dieses Signal den Prozess ebenfalls innerhalb von 15 Prozent des Zeitüberschreitungswertes beendet, protokolliert die Methode eine Fehlermeldung und wird mit einem 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. Im folgenden Code-Beispiel wird dargestellt, wie Stop mit pmfadm den DNS-Prozess stoppt.

# 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 UNSUCCESSFUL”
         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 sollte so lange nicht mit Erfolg beendet werden, bis die zugrunde liegende Anwendung tatsächlich gestoppt wurde, insbesondere wenn andere Datendienste davon abhängig sind. 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 legt die Failover_mode-Eigenschaft nicht ausdrücklich fest, sodass diese Eigenschaft den Standardwert NONE aufweist (es sei denn, der Cluster-Administrator überschreibt den Standardwert und legt einen anderen Wert fest). In diesem Fall unternimmt RGM nur die Aktion, den Status des Datendienstes auf Stop_failed zu setzen. Der Cluster-Administrator muss die Anwendung erzwungenermaßen stoppen und den Status Stop_failed bereinigen.