Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Steuern des Datendienstes

Ein Datendienst muss eine Start- oder Prenet_start-Methode zum Aktivieren des Anwendungsdämons im Cluster sowie eine Stop- oder Postnet_stop-Methode zum Stoppen des Anwendungsdämons im Cluster bereitstellen. Der Beispieldatendienst implementiert eine Start- und eine Stop-Methode. Im Abschnitt Verwendung von Start- und Stop-Methoden erhalten Sie Informationen darüber, wann Prenet_start und Postnet_stop verwendet werden sollen.

Funktionsweise der Start-Methode

RGM führt die Start-Methode auf einem Cluster-Knoten aus, wenn die Ressourcengruppe, die den Datendienst enthält, auf diesem Knoten online gebracht wird bzw. wenn die Ressourcengruppe bereits online ist und die Ressource aktiviert wird. In der Beispielanwendung aktiviert die Start-Methode den in.named-DNS-Dämon an diesem Knoten.

Dieser Abschnitt beschreibt die Hauptteile der Start-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 Start-Methode finden Sie im Abschnitt Auflistung des Start-Methodencodes.

Die Start-Methode

Bevor Sie versuchen, DNS zu starten, prüft die Start-Methode des Beispieldatendienstes, ob das Konfigurationsverzeichnis und die Konfigurationsdatei (named.conf) zugänglich und verfügbar sind. Die Informationen in der Datei named.conf sind für einen erfolgreichen Betrieb des DNS erforderlich.

Diese Rückmeldemethode verwendet PMF (pmfadm), um den DNS-Dämon (in.named) zu starten. Wenn der DNS abstürzt oder nicht gestartet werden kann, versucht PMF, den DNS-Dämon so häufig wie vorgeschrieben innerhalb eines angegebenen Intervalls zu starten. Die Anzahl der Wiederholversuche und das Intervall werden von den Eigenschaften in der RTR-Datei des Datendienstes angegeben.

Überprüfen der Konfiguration

DNS benötigt für die Ausführung Informationen aus der named.conf-Datei im Konfigurationsverzeichnis. Deshalb führt die Start-Methode einige Tests durch, die prüfen, ob auf das Verzeichnis und die Datei zugegriffen werden kann, bevor der Versuch unternommen wird, den DNS zu starten.

Die Confdir-Erweiterungseigenschaft stellt den Pfad zum Konfigurationsverzeichnis bereit. Die Eigenschaft selbst ist in der RTR-Datei definiert. Der Cluster-Administrator legt den tatsächlichen Ort jedoch bei der Konfiguration des Datendienstes fest.

Beim Beispieldatendienst ruft die Start-Methode den Ort des Konfigurationsverzeichnisses mithilfe der Funktion scha_resource_get() ab.


Hinweis –

Da Confdir eine Erweiterungseigenschaft ist, gibt scha_resource_get() sowohl den Typ als auch den Wert zurück. Mit dem Befehl awk wird lediglich der Wert abgerufen und in eine Shell-Variable, CONFIG_DIR , eingefügt.


# find the value of Confdir set by the cluster administrator at the time of
# adding the resource.
config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME Confdir`

# scha_resource_get returns the "type" as well as the "value" for the
# extension properties. Get only the value of the extension property 
CONFIG_DIR=`echo $config_info | awk '{print $2}'`

Die Start-Methode verwendet den Wert von CONFIG_DIR, um zu prüfen, ob auf das Verzeichnis zugegriffen werden kann. Ist dies nicht der Fall, protokolliert die Start-Methode eine Fehlermeldung und wird mit einem Fehlerstatus beendet. Weitere Informationen finden Sie unter Start-Beendigungsstatus.

# Check if $CONFIG_DIR is accessible.
if [ ! -d $CONFIG_DIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directory $CONFIG_DIR is missing or not mounted"
   exit 1
fi

Vor dem Starten des Anwendungsdämons überprüft diese Methode abschließend, ob die named.conf-Datei vorhanden ist. Ist die Datei nicht vorhanden, protokolliert die Start-Methode eine Fehlermeldung und wird mit einem Fehlerstatus beendet.

# Change to the $CONFIG_DIR directory in case there are relative
# pathnames in the data files.
cd $CONFIG_DIR

# Check that the named.conf file is present in the $CONFIG_DIR directory
if [ ! -s named.conf ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} File $CONFIG_DIR/named.conf is missing or empty"
   exit 1
fi

Starten der Anwendung

Bei dieser Methode wird Process Manager Facility (pmfadm) zum Starten der Anwendung verwendet. Mit dem Befehl pmfadm können Sie die Anzahl der Versuche festlegen, mit denen die Anwendung innerhalb eines bestimmten Zeitrahmens neu gestartet wird. Die RTR-Datei enthält zwei Eigenschaften: Retry_count legt die Anzahl der Versuche fest, die eine Anwendung neu gestartet wird, und Retry_interval den Zeitraum, innerhalb dessen die Versuche unternommen werden.

Die Start-Methode ruft die Werte von Retry_count und Retry_interval mithilfe der Funktion scha_resource_get () ab und speichert ihre Werte in den Shell-Variablen. Die Start -Methode übergibt diese Werte an pmfadm und verwendet dabei die Optionen - n und -t.

# Get the value for retry count from the RTR file.
RETRY_CNT=`scha_resource_get -O Retry_count -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME`
# Get the value for retry interval from the RTR file. This value is in seconds
# and must be converted to minutes for passing to pmfadm. Note that the 
# conversion rounds up; for example, 50 seconds rounds up to 1 minute.
((RETRY_INTRVAL=`scha_resource_get -O Retry_interval -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME` / 60))

# Start the in.named daemon under the control of PMF. Let it crash and restart
# up to $RETRY_COUNT times in a period of $RETRY_INTERVAL; if it crashes
# more often than that, PMF will cease trying to restart it.
# If there is a process already registered under the tag
# <$PMF_TAG>, then PMF sends out an alert message that the
# process is already running.
pmfadm -c $PMF_TAAG -n $RETRY_CNT -t $RETRY_INTRVAL \
    /usr/sbin/in.named -c named.conf

# Log a message indicating that HA-DNS has been started.
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} HA-DNS successfully started"
fi
exit 0

Start-Beendigungsstatus

Eine Start-Methode sollte nicht mit Erfolg beendet werden, bis die zugrunde liegende Anwendung tatsächlich ausgeführt wird und verfügbar ist, insbesondere wenn andere Datendienste davon abhängig sind. Eine Methode, den Erfolg zu prüfen, besteht darin, die Anwendung zu testen, um sicherzustellen, dass sie ausgeführt wird, bevor Sie die Start-Methode beenden. Für eine komplexe Anwendung, wie z.B. eine Datenbank, müssen Sie den Wert für die Start_timeout-Eigenschaft in der RTR-Datei so hoch setzen, dass genügend Zeit zur Verfügung steht, dass die Anwendung nach einem Absturz gestartet und wiederhergestellt werden kann.


Hinweis –

Da die Anwendungsressource (DNS) des Beispieldatendienstes schnell startet, fordert der Beispieldatendienst keine Prüfung, ob sie ausgeführt wird, bevor sie erfolgreich beendet wird.


Wenn diese Methode DNS nicht starten kann und mit einem Fehlerstatus beendet wird, prüft RGM die Failover_mode-Eigenschaft, die die Reaktion auf den Fehlerstatus festlegt. 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 ist die einzige Aufgabe von RGM, den Zustand des Datendienstes einzustellen. Der Cluster-Administrator muss an demselben Knoten einen Neustart initiieren oder einen Failover an einen anderen Knoten durchführen.

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.