Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Bearbeiten von Eigenschaftsaktualisierungen

Der Beispieldatendienst implementiert die Methoden Validate und Update, um die Eigenschaftsaktualisierung durch einen Cluster-Verwalter bearbeiten zu können.

Validate-Methode

RGM ruft die Validate-Methode auf, wenn eine Ressource erstellt wird und wenn die Eigenschaften einer Ressource bzw. deren Gruppe durch einen Verwaltungsbefehl aktualisiert werden. RGM ruft Validate auf, bevor die Erstellung bzw. Aktualisierung angewendet wird. Ein Fehlerbeendigungscode der Methode auf einem Knoten führt zum Abbruch der Erstellung bzw. Aktualisierung.

RGM ruft Validate nur dann auf, wenn Ressourcen- bzw. Gruppeneigenschaften über eine Verwaltungsaktion geändert werden, und nicht, wenn RGM Eigenschaften einstellt oder wenn ein Monitor die Ressourceneigenschaften Status und Status_msg einstellt.


Hinweis –

Die Monitor_check-Methode ruft auch ausdrücklich immer dann die Validate-Methode auf, wenn die PROBE-Methode versucht, ein Failover für den Datendienst auf einen neuen Knoten auszuführen.


Überblick über Validate

RGM ruft Validate mit zusätzlichen Argumenten zu denjenigen auf, die von anderen Methoden übergeben wurden, einschließlich der aktualisierten Eigenschaften und Werte. Daher muss diese Methode im Beispieldatendienst eine andere parse_args()-Funktion implementieren, um die zusätzlichen Argumente zu bearbeiten.

Die Validate-Methode im Beispieldatendienst überprüft eine einzige Eigenschaft, die Confdir-Erweiterungseigenschaft. Diese Eigenschaft zeigt auf das DNS-Konfigurationsverzeichnis, das für einen erfolgreichen DNS-Betrieb entscheidend ist.


Hinweis –

Da das Konfigurationsverzeichnis nicht geändert werden kann, während DNS läuft, wird die Confdir-Eigenschaft in der RTR-Datei als TUNABLE = AT_CREATION deklariert. Daher wird die Validate-Methode nie aufgerufen, um die Confdir-Eigenschaft nach einer Aktualisierung zu überprüfen, sondern nur bei Erstellung der Datendienstressource.


Wenn Confdir eine der Eigenschaften ist, die RGM an Validate übergibt, ruft die parse_args()-Funktion deren Wert ab und speichert ihn. Validate überprüft daraufhin, ob auf das Verzeichnis, auf das der neue Wert von Confdir zeigt, zugegriffen werden kann, und ob die named.conf-Datei in diesem Verzeichnis vorhanden ist und Daten enthält.

Wenn die parse_args()-Funktion den Wert von Confdir nicht aus den von RGM übergebenen Befehlszeilenargumenten abrufen kann, versucht Validate dennoch, die Confdir-Eigenschaft zu validieren. Validate verwendet scha_resource_get(), um den Wert von Confdir aus der statischen Konfiguration abzurufen. Dann führt die Funktion die gleichen Prüfungen aus, um zu überprüfen, ob auf das Konfigurationsverzeichnis zugegriffen werden kann und keine leere named.conf-Datei enthält.

Wenn Validate mit Fehlschlag beendet wird, schlägt die Aktualisierung bzw. Erstellung aller Eigenschaften fehl, nicht nur diejenige von Confdir.

Analysefunktion der Validate-Methode

RGM übergibt an die Validate-Methode einen anderen Satz Parameter als an die anderen Rückmeldemethoden. Daher benötigt Validate eine andere Funktion für die Argumentenanalyse als die anderen Methoden. In der Online-Dokumentation unter rt_callbacks(1HA) finden Sie weitere Informationen zu den an Validate und die anderen Rückmeldemethoden übergebenen Parametern. Im Folgenden wird die Validate parse_args()-Funktion gezeigt.


#########################################################################
# Validate-Argumente 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 Ressourcengruppen-
                  # eigenschaften zu, so dass diese Option nicht besteht
                  ;;
         c)
                  # Gibt an, dass die Validate-Methode bei Erstellen der Ressource
                  # aufgerufen wird, so dass dieses Flag nicht besteht.
                  ;;
         u)
                  # Gibt die Aktualisierung einer Eigenschaft an, wenn die Ressource
                  # bereits vorhanden ist. Wenn die Confdir-Eigenschaft aktualisiert wird,
                  # sollte Confdir in den Befehlszeilenargumenten stehen. Andernfalls
                  # muss die Methode ausdrücklich mit scha_resource_get danach
                  # suchen.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Erweiterungseigenschaftsliste. Eigenschafts- und Wertepaare mit
                  # "=" als Trennzeichen voneinander trennen.
                  PROPERTY=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # Wenn die Confdir-Erweiterungseigenschaft an der Befehls-
                  # zeile gefunden wird, 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
}

Genau wie die parse_args()-Funktion für andere Methoden verfügt diese Funktion über ein Flag (R) zum Erfassen des Ressourcennamens, (G) zum Erfassen des Ressourcengruppennamens und (T) zum Erfassen des Ressourcentyps, die von RGM übergeben werden.

Das r-Flag (für systemdefinierte Eigenschaften), g-Flag (für Ressourcengruppeneigenschaften) und das c-Flag (das angibt, dass die Validierung bei Ressourcenerstellung stattfindet) werden ignoriert, da diese Methode aufgerufen wird, um eine Erweiterungseigenschaft bei Aktualisierung der Ressource zu validieren.

Das u-Flag stellt den Wert der UPDATE_PROPERTY-Shell-Variablen auf 1 (TRUE) ein. Das x-Flag erfasst die Namen und Werte der aktualisierten Eigenschaften. Wenn Confdir eine der aktualisierten Eigenschaften ist, wird ihr Wert in der CONFDIR-Shell-Variablen abgelegt, und die Variable CONFDIR_FOUND wird auf 1 (TRUE) eingestellt.

Validieren von Confdir

In der MAIN-Funktion setzt Validate zunächst die CONFDIR-Variable auf die leere Zeichenkette sowie UPDATE_PROPERTY und CONFDIR_FOUND auf 0.


CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Anschließend ruft Validate die parse_args()-Funktion auf, um die von RGM übergebenen Argumente zu analysieren.


parse_args “$@”

Dann prüft Validate, ob Validate als Ergebnis der Aktualisierung von Eigenschaften aufgerufen wird und ob die Confdir-Erweiterungseigenschaft an der Befehlszeile stand. Dann überprüft Validate, ob die Confdir-Eigenschaft einen Wert hat. Andernfalls wird mit Fehlerstatus und einer Fehlermeldung beendet.


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 Fehlschlag,
# und mit Status 1 beenden
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Validate-Method für Ressource "$RESOURCE_NAME " fehlgeschlagen"
         exit 1
fi


Hinweis –

Der obige Code prüft vor allem, ob Validate als Ergebnis einer Aktualisierung aufgerufen wird ($UPDATE_PROPERTY == 1) und ob die Eigenschaft nicht an der Befehlszeile gefunden wurde (CONFDIR_FOUND == 0); in diesem Fall wird der vorhandene Wert von Confdir mithilfe von scha_resource_get() abgerufen. Wenn Confdir an der Befehlszeile gefunden wurde (CONFDIR_FOUND == 1), stammt der Wert für CONFDIR von der parse_args()-Funktion, nicht von scha_resource_get().


Die Validate-Methode verwendet dann den Wert von CONFDIR, um zu überprüfen, ob auf das Verzeichnis zugegriffen werden kann. Wenn kein Zugriff möglich ist, protokolliert Validate eine Fehlermeldung und wird mit Fehlerstatus beendet.


# Prüfen, ob Zugriff auf $CONFDIR möglich ist.
if [ ! -d $CONFDIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Verzeichnis $CONFDIR fehlt oder ist nicht eingehängt."
   exit 1
fi

Vor dem Validieren der Aktualisierung der Confdir-Eigenschaft führt Validate eine letzte Prüfung durch, um festzustellen, ob die named.conf-Datei vorhanden ist. Andernfalls protokolliert die Methode eine Fehlermeldung und wird mit Fehlerstatus beendet.


# Prüfen, od 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

Wenn diese letzte Prüfung erfolgreich war, protokolliert Validate eine Erfolgsmeldung und wird mit Erfolgsstatus beendet.


# Meldung protokollieren, die angibt, dass die Validate-Methode erfolgreich war.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Validate-Methode für Ressource "$RESOURCE_NAME \
   " erfolgreich beendet"

exit 0

Validate-Beendigungsstatus

Wenn Validate mit Erfolg (0) endet, wird Confdir mit dem neuen Wert erstellt. Wenn Validate mit Fehlschlag (1) endet, werden weder Confdir noch irgendeine andere Eigenschaft erstellt, und eine Meldung mit Angabe der Gründe wird an den Cluster-Verwalter gesendet.

Update-Methode

RGM ruft die Update-Methode auf, um eine laufende Ressource darüber zu benachrichtigen, dass ihre Eigenschaften geändert wurden. RGM ruft Update auf, nachdem eine Verwaltungsaktion die Eigenschaften einer Ressource bzw. deren Gruppe erfolgreich eingestellt hat. Diese Methode wird auf den Knoten aufgerufen, auf denen die Ressource online ist.

Überblick über Update

Die Update-Methode aktualisiert keine Eigenschaften — das ist Aufgabe von RGM. Stattdessen benachrichtigt sie laufende Prozesse davon, dass eine Aktualisierung stattgefunden hat. Der einzige im Beispieldatendienst von einer Eigenschaftsaktualisierung betroffene Prozess ist der Fehler-Monitor. Daher wird dieser Prozess von der Update-Methode gestoppt und neu gestartet.

Die Update-Methode muss überprüfen, ob der Fehler-Monitor läuft und dann dessen Beenden mithilfe von pmfadm erzwingen. Die Methode ruft den Pfad des Testsignalprogramms ab, das den Fehler-Monitor implementiert, und startet ihn dann mithilfe von pmfadm neu.

Stoppen des Monitors mit Update

Die Update-Methode verwendet pmfadm -q, um zu überprüfen, ob der Monitor läuft. Wenn dies der Fall ist, erzwingt sie das Beenden mit pmfadm -s TERM. Wenn der Monitor erfolgreich beendet wurde, wird eine entsprechende Meldung an den Verwaltungsbenutzer gesendet. Wenn der Monitor nicht gestoppt werden kann, wird Update mit Fehlerstatus beendet und sendet eine Fehlermeldung an den Verwaltungsbenutzer.


if pmfadm -q $RESOURCE_NAME.monitor; then

# Beenden des bereits laufenden Monitors erzwingen
pmfadm -s $PMF_TAG 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}.err \
              -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                 "Monitor für HA-DNS erfolgreich gestoppt"
    fi

Neustarten des Monitors

Um den Monitor neu zu starten, muss die Update-Methode das Skript finden, mit dem das Testsignalprogramm implementiert wird. Das Testsignalprogramm residiert im Basisverzeichnis des Datendienstes, auf das die Rt_basedir-Eigenschaft zeigt. Update ruft den Wert von Rt_basedir ab und speichert ihn in der RT_BASEDIR-Variablen, wie im Folgenden gezeigt.


RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

Dann verwendet Update den Wert von RT_BASEDIR mit pmfadm, um das dns_probe-Programm neu zu starten. Wenn dieser Vorgang erfolgreich ist, wird Update mit Erfolg beendet und sendet eine entsprechende Meldung an den Verwaltungsbenutzer. Wenn pmfadm das Testsignalprogramm nicht starten kann,wird Update mit Fehlerstatus beendet und protokolliert eine Fehlermeldung.

Update-Beendigungsstatus

Ein Fehlschlagen der Update-Methode versetzt die Ressource in einen Zustand “Aktualisierung fehlgeschlagen”. Dieser Zustand hat keine Auswirkung auf die RGM-Verwaltung der Ressource, gibt jedoch den Fehlschlag der Aktualisierungsaktion über die syslog-Funktion an Verwaltungstools an.