Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Kapitel 7 Entwerfen von Ressourcentypen

In diesem Kapitel wird die typische Verwendung der Data Service Development Library (DSDL) beim Entwerfen und Implementieren von Ressourcentypen erläutert. Das Kapitel geht auch darauf ein, wie der Ressourcentyp entworfen werden muss, um die Ressourcenkonfiguration zu validieren sowie die Ressource zu starten, zu stoppen und zu überwachen. Außerdem wird in diesem Kapitel beschrieben, wie die DSDL zur Implementierung der Ressourcentyp-Rückrufmethoden verwendet wird.

Weitere Informationen finden Sie in der Online-Dokumentation zu rt_callbacks(1HA).

Um diese Aufgaben ausführen zu können, benötigen Sie Zugriff auf die Eigenschaftseinstellungen der Ressource. Das DSDL-Dienstprogramm scds_initialize() bietet eine einheitliche Zugriffsmöglichkeit auf diese Ressourceneigenschaften. Diese Funktion ist dafür ausgelegt, zu Beginn jeder Rückmeldemethode aufgerufen zu werden. Diese Dienstprogrammfunktion ruft alle Eigenschaften für eine Ressource aus dem Cluster-Framework ab und stellt sie der Familie der scds_getName()-Funktionen zur Verfügung.

Dieses Kapitel behandelt die folgenden Themen:

Ressourcentyp-Registrierungsdatei

Die RTR-Datei (Resource Type Registration, Ressourcentypregistrierung) gibt die Details zum Ressourcentyp für die Sun Cluster-Software an. Die Details umfassen die folgenden Informationen:

Die mit der DSDL mitgelieferte RTR-Beispieldatei reicht für die meisten Ressourcentypimplementierungen aus. Sie müssen nur einige Basiselemente bearbeiten, z.B. den Ressourcentypnamen sowie den Pfadnamen der Ressourcentyp-Rückrufmethoden. Wenn für die Implementierung des Ressourcentyps eine neue Eigenschaft benötigt wird, können Sie diese in der RTR-Datei der Ressourcentypimplementierung als Erweiterungseigenschaft deklarieren und auf die neue Eigenschaft mit dem scds_get_ext_property()-DSDL-Dienstprogramm zugreifen.

Validate-Methode

Der Zweck der Validate-Rückrufmethode einer Ressourcentypimplementierung besteht darin, zu prüfen, ob die vorgeschlagenen Ressourceneinstellungen (wie von den vorgeschlagenen Eigenschaftseinstellungen in der Ressource angegeben) für den Ressourcentyp akzeptabel sind.

Die Validate-Methode einer Ressourcentypimplementierung wird unter den folgenden beiden Bedingungen vom Resource Group Manager (RGM) aufgerufen:

Diese beiden Szenarien können durch die Befehlszeilenoption -c (create) oder -u (update) unterschieden werden, die an die Validate-Methode der Ressource übergeben wird.

Die Validate-Methode wird an jedem Knoten eines Knotensatzes aufgerufen, wobei der Knotensatz durch den Wert der Ressourcentypeigenschaft Init_nodes definiert ist. Wenn Init_nodes auf RG_PRIMARIES gesetzt ist, wird Validate an jedem Knoten aufgerufen, der als Host der Ressourcengruppe dienen kann, die die Ressource enthält. Wenn Init_nodes auf RT_INSTALLED_NODES gesetzt ist, wird Validate an jedem Knoten aufgerufen, an dem die Ressourcentyp-Software installiert ist, in der Regel alle Knoten im Cluster.

Der Standardwert von Init_nodes lautet RG_PRIMARIES (siehe Online-Dokumentation zu rt_reg(4)). An dem Punkt, an dem die Validate-Methode aufgerufen wird, hat der RGM die Ressource noch nicht aufgerufen (im Falle eines Erstellungsrückrufs) oder die aktualisierten Werte der Eigenschaften noch nicht angewendet, die aktualisiert werden (im Falle eines Aktualisierungsrückrufs).


Hinweis –

Wenn Sie lokale Dateisysteme verwenden, die vom Ressourcentyp HAStoragePlus verwaltet werden, verwenden Sie die scds_hasp_check()-Funktion, um den Zustand dieses Ressourcentyps zu prüfen. Diese Informationen werden aus dem Zustand (online oder anderweitig) aller SUNW.HAStoragePlus-Ressourcen abgerufen, von denen die Ressource abhängt, und zwar unter Verwendung der für die Ressource definierten Systemeigenschaften Resource_dependencies oder Resource_dependencies_weak. In der Online-Dokumentation unter scds_hasp_check(3HA) finden Sie eine vollständige Liste mit Statuscodes, die von der scds_hasp_check ()-Funktion zurückgegeben werden.


Die DSDL-Funktion scds_initialize() geht mit diesen Situationen wie folgt um:

Angenommen, die Funktion, mit der die Validierung der Ressourceneigenschaften implementiert wird, heißt svc_validate() und verwendet die scds_get_Name()-Familie der Funktionen, um die zu validierende Eigenschaft zu prüfen. Angenommen, eine annehmbare Ressourceneinstellung wird von dieser Funktion durch einen Rückgabecode von 0 dargestellt, dann kann die Validate -Methode des Ressourcentyps vom folgenden Codefragment dargestellt werden:

int
main(int argc, char *argv[])
{
   scds_handle_t handle;
   int rc;

   if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) {
   return (1);   /* Initialization Error */
   }
   rc = svc_validate(handle);
   scds_close(&handle);
   return (rc);
}

Die Validierungsfunktion sollte auch den Grund für das Fehlschlagen der Ressourcenvalidierung protokollieren. Indem Sie jedoch dieses Detail auslassen (Kapitel 8, Beispielressourcentyp-Implementierung mit DSDL enthält eine realistischere Behandlung einer Validierungsfunktion), können Sie eine einfachere svc_validate()-Beispielfunktion wie folgt implementieren:

int
svc_validate(scds_handle_t handle)
{
   scha_str_array_t *confdirs;
   struct stat    statbuf;
   confdirs = scds_get_confdir_list(handle);
   if (stat(confdirs->str_array[0], &statbuf) == -1) {
   return (1);   /* Invalid resource property setting */
   }
   return (0);   /* Acceptable setting */
}

Deshalb müssen Sie sich nur mit der Implementierung der svc_validate()-Funktion beschäftigen.

Start-Methode

Die Start-Rückmeldemethode einer Ressourcentypimplementierung wird von RGM auf einem bestimmten Cluster-Knoten aufgerufen, um die Ressource zu starten. Der Ressourcengruppenname, der Ressourcenname und der Ressourcentypname werden an die Befehlszeile übergeben. Die Start-Methode führt die Aktionen aus, die zum Starten einer Datendienstressource im Cluster-Knoten benötigt werden. In der Regel beinhaltet dies das Abrufen der Ressourceneigenschaften, das Auffinden einer bestimmten ausführbaren Datei, Konfigurationsdateien oder beides sowie das Starten der Anwendung mit den richtigen Befehlszeilenargumenten.

Bei Einsatz der DSDL wird die Ressourcenkonfiguration bereits von dem scds_initialize()-Dienstprogramm abgerufen. Die Startaktion für die Anwendung kann in einer svc_start()-Funktion enthalten sein. Eine weitere Funktion, svc_wait(), kann aufgerufen werden, um zu überprüfen, dass die Anwendung tatsächlich startet. Der vereinfachte Code für die Start-Methode lautet wie folgt:

int
main(int argc, char *argv[])
{
   scds_handle_t handle;

   if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) {
   return (1);   /* Initialization Error */
   }
   if (svc_validate(handle) != 0) {
   return (1);   /* Invalid settings */
   }
   if (svc_start(handle) != 0) {
   return (1);   /* Start failed */
   }
   return (svc_wait(handle));
}

Diese Start-Methodenimplementierung ruft svc_validate()auf, um die Ressourcenkonfiguration zu validieren. Schlägt sie fehl, passen entweder die Ressourcen- und Anwendungskonfiguration nicht oder es besteht derzeit in Bezug auf das System ein Problem an diesem Cluster-Knoten. Ein Cluster-Dateisystem, das z.B. von der Ressource benötigt wird, steht eventuell derzeit nicht an diesem Cluster-Knoten zur Verfügung. In diesem Fall ist es müßig, die Ressource an diesem Cluster-Knoten zu starten. Stattdessen sollte RGM versuchen, die Ressource auf einem anderen Knoten zu starten.

Beachten Sie jedoch, dass in der oben dargestellten Anweisung davon ausgegangen wird, dass svc_validate () sparsam vorgeht und nur die Ressourcen am Cluster-Knoten prüft, die von der Anwendung absolut benötigt werden. Andernfalls kann die Ressource eventuell nicht an allen Cluster-Knoten gestartet werden und in einen START_FAILED-Zustand gelangen. Eine Erläuterung dieses Zustands finden Sie in der Online-Dokumentation zu scswitch(1M) sowie im Sun Cluster Data Services Planning and Administration Guide for Solaris OS.

Die svc_start()-Funktion muss 0 für ein erfolgreiches Starten der Ressource auf dem Knoten zurückgeben. Wenn die Startfunktion auf ein Problem trifft, muss ein Wert ungleich Null ausgegeben werden. Bei Fehlschlagen dieser Funktion versucht RGM, die Ressource auf einem anderen Cluster-Knoten zu starten.

Um die Vorteile von DSDL so viel wie möglich zu nutzen, kann die svc_start()-Funktion das scds_pmf_start()-Dienstprogramm zum Starten der Anwendung unter der PMF (Process Monitor Facility) aufrufen. Dieses Dienstprogramm verwendet auch die Fehler-Rückrufaktion von PMF zur Ermittlung von Prozessfehlern. Eine Beschreibung des Aktionsarguments - a finden Sie in der Online-Dokumentation unter pmfadm(1M).

Stop-Methode

Die Stop-Rückmeldemethode einer Ressourcentypimplementierung wird von RGM auf einem Cluster-Knoten aufgerufen, um die Anwendung zu stoppen. Die Rückrufsemantik für die Stop-Methode setzt folgende Faktoren voraus:

Das DSDL-Dienstprogramm scds_pmf_stop() sollte für die meisten Anwendungen ausreichen, da es zuerst versucht, die Anwendung mit SIGTERM sanft zu stoppen. Diese Funktion liefert dann SIGKILL an den Prozess. Bei dieser Funktion wird davon ausgegangen, dass die Anwendung unter PMF mit scds_pmf_start() gestartet wurde. Weitere Informationen über dieses Dienstprogramm finden Sie unter PMF-Funktionen.

Wenn die anwendungsspezifische Funktion, die die Anwendung stoppt, tsvc_stop() heißt, implementieren Sie die Stop-Methode wie folgt:

if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR)
{
   return (1);   /* Initialisierungsfehler */
}
return (svc_stop(handle));

Ob die Implementierung der vorangegangenen svc_stop()-Funktion die scds_pmf_stop()-Funktion enthält, ist irrelevant. Ihre Entscheidung, die scds_pmf_stop()-Funktion einzuschließen, richtet sich danach, ob die Anwendung unter PMF über die Start-Methode gestartet wurde.

Die svc_validate()-Methode wird in der Implementierung der Stop-Methode nicht verwendet, da die Stop-Methode selbst bei einem Systemfehler die Anwendung an diesem Knoten anhalten sollte.

Monitor_start-Methode

RGM ruft die Monitor_start-Methode zum Starten eines Fehler-Monitors für die Ressource auf. Fehler-Monitore überwachen den Zustand der von der Ressource verwalteten Anwendung. Ressourcentypimplementierungen implementieren in der Regel einen Fehler-Monitor als separaten Dämon, der im Hintergrund ausgeführt wird. Die Rückrufmethode Monitor_start wird zum Starten dieses Dämons mit den richtigen Argumenten verwendet.

Da der Monitor-Dämon selbst fehleranfällig ist (er könnte z.B. beendet werden und die Anwendung wäre dann unüberwacht), sollten Sie zum Starten des Monitor-Dämons PMF verwenden. Das DSDL-Dienstprogramm scds_pmf_start() verfügt über eine integrierte Unterstützung zum Starten von Fehler-Monitoren. Dieses Dienstprogramm verwendet den Pfadnamen, der relativ zum Verzeichnis RT_basedir ist, für die Speicherung der Ressourcentyp-Rückrufmethodenimplementierungen des Monitor-Dämonprogramms. Dieses Dienstprogramm verwendet die Erweiterungseigenschaften Monitor_retry_interval und Monitor_retry_count, die von der DSDL verwaltet werden, um uneingeschränkte Neustarts des Dämons zu verhindern.

Dieses Dienstprogramm verwendet dieselbe Befehlszeilensyntax wie für alle Rückrufmethoden definiert (das heißt, -R Ressource -G Ressourcengruppe -T Ressourcentyp) für den Monitor-Dämon, obwohl der Monitor-Dämon nie direkt von RGM aufgerufen wird. Schließlich ermöglicht dieses Dienstprogramm auch die Monitor-Dämonimplementierung selbst, damit das scds_initialize()-Dienstprogramm seine eigene Umgebung einrichten kann. Die Hauptarbeit besteht im Entwerfen des Monitor-Dämons selbst.

Monitor_stop-Methode

RGM ruft die Monitor_stop-Methode zum Stoppen des Fehler-Monitor-Dämons auf, der mit der Monitor_start-Methode gestartet wurde. Ein Fehlschlag dieser Rückmeldemethode wird genauso wie ein Fehlschlag der Stop-Methode behandelt. Daher muss die Monitor_stop-Methode ebenso wie die Stop-Methode idempotent und robust sein.

Wenn Sie das Dienstprogramm scds_pmf_start() zum Starten des Fehler-Monitor-Dämons verwenden, müssen Sie ihn mit scds_pmf_stop() stoppen.

Monitor_check-Methode

RGM führt die Monitor_check-Rückrufmethode für eine Ressource an einem Knoten für die angegebene Ressource aus, um festzustellen, ob der Cluster-Knoten die Ressource verwalten kann. Mit anderen Worten: RGM führt diese Methode aus, um zu ermitteln, ob die von der Ressource verwaltete Anwendung an dem Knoten erfolgreich ausgeführt werden kann.

In der Regel muss durch diese Situation sichergestellt werden, dass alle von der Anwendung erforderlichen Systemressourcen tatsächlich am Cluster-Knoten zur Verfügung stehen. Wie im Abschnitt Validate-Methode beschrieben, soll die zu implementierende svc_validate()-Funktion genau dies feststellen.

Je nach der von der Ressourcentypimplementierung verwalteten Anwendung kann die Monitor_check-Methode für die Ausführung zusätzlicher Aufgaben geschrieben werden. Die Monitor_check-Methode muss so implementiert werden, dass sie nicht mit anderen gleichzeitig ausgeführten Methoden in Konflikt steht. Wenn Sie mit der DSDL arbeiten, sollte die Monitor_check-Methode die svc_validate()-Funktion aufrufen, die die anwendungsspezifische Validierung von Ressourceneigenschaften implementiert.

Update-Methode

RGM ruft die Update-Methode einer Ressourcentypimplementierung auf, um alle Änderungen anzuwenden, die vom Systemverwalter an der Konfiguration einer aktiven Ressource vorgenommen wurden. Die Update-Methode wird nur auf denjenigen Knoten aufgerufen, auf denen die Ressource aktuell online ist (falls zutreffend).

Die an der Ressourcenkonfiguration vorgenommenen Änderungen sind für die Ressourcentypimplementierung annehmbar, weil RGM die Validate-Methode des Ressourcentyps ausführt, bevor die Update -Methode ausgeführt wird. Die Validate-Methode wird aufgerufen, bevor die Ressource oder die Ressourcengruppeneigenschaften geändert werden, und die Validate-Methode kann für die vorgeschlagenen Änderungen ein Veto einlegen. Die Update-Methode wird aufgerufen, nachdem die Änderungen angewendet wurden, damit die aktive (sich online befindende) Ressource auf die neuen Einstellungen aufmerksam gemacht wird.

Sie müssen die Eigenschaften, die Sie dynamisch aktualisieren möchten, sorgfältig ermitteln, und diese mit der Einstellung TUNABLE = ANYTIME in der RTR-Datei markieren. In der Regel können Sie festlegen, dass Sie jede beliebige Eigenschaft einer vom Fehler-Monitor-Dämon verwendeten Ressourcentypimplementierung dynamisch aktualisieren möchten. Die Implementierung der Update-Methode muss mindestens den Monitor-Dämon neu starten.

Mögliche Eigenschaften, die Sie verwenden können, sind:

Diese Eigenschaften wirken sich darauf aus, wie ein Fehler-Monitor-Dämon den Zustand des Dienstes prüft, wie häufig der Dämon Prüfungen durchführt, das Protokollintervall, das vom Dämon zur Fehlerverfolgung verwendet wird und die Neustartschwellenwerte, die von PMF festgelegt werden. Zum Implementieren dieser Eigenschaften wird in der DSDL das Dienstprogramm scds_pmf_restart () bereitgestellt.

Wenn Sie eine Ressourceneigenschaft dynamisch aktualisieren möchten, die Änderung dieser Eigenschaft sich jedoch auf die ausgeführte Anwendung auswirken könnte, müssen Sie die richtigen Aktionen implementieren. Sie müssen sicherstellen, dass die Updates dieser Eigenschaft auf alle ausgeführten Anwendungsinstanzen ordnungsgemäß angewendet werden. Derzeit können Sie die DSDL nicht für die dynamische Aktualisierung einer Ressourceneigenschaft verwenden. Sie können die geänderten Eigenschaften nicht an Update in der Befehlszeile übergeben (wie dies mit Validate möglich ist).

Beschreibungen der Init-, Fini- und Boot-Methoden

Diese Methoden sind einmalige Aktionen, wie durch die Resource Management-API-Spezifikationen definiert. Die Beispielimplementierung für die DSDL zeigt die Verwendung dieser Methoden nicht. Jedoch stehen alle Optionen in der DSDL diesen Methoden ebenfalls zur Verfügung, falls Sie diese benötigen. In der Regel dienen die Init- und die Boot-Methode dem gleichen Zweck für eine Ressourcentypimplementierung, um eine einmalige Aktion zu implementieren. Die Fini-Methode führt in der Regel eine Aktion aus, die die Aktion der Init- oder Boot-Methoden rückgängig macht.

Entwerfen des Fehler-Monitor-Dämons

Die Ressourcentypimplementierungen, die die DSDL verwenden, weisen in der Regel einen Fehler-Monitor-Dämon auf, der folgende Aufgaben übernimmt:

Die DSDL-Dienstprogramme sind so entworfen, dass die Hauptschleife des Fehler-Monitor-Dämons am Ende dieses Abschnitts als Pseudo-Code dargestellt werden kann.

Berücksichtigen Sie die folgenden Faktoren bei der Implementierung eines Fehler-Monitors mit der DSDL:

In den meisten Fällen können Sie die anwendungsspezifische Zustandsprüfung in einem separaten eigenständigen Dienstprogramm (z.B. svc_probe()) implementieren. Sie können sie mit der folgenden generischen Hauptschleife integrieren.

for (;;) {
   /* sleep for a duration of thorough_probe_interval between
   *  successive probes.
   */
   (void) scds_fm_sleep(scds_handle,
   scds_get_rs_thorough_probe_interval(scds_handle));
   /* Now probe all ipaddress we use. Loop over
   * 1. All net resources we use.
   * 2. All ipaddresses in a given resource.
   * For each of the ipaddress that is probed,
   * compute the failure history. 
   */
   probe_result = 0;
   /* Iterate through the all resources to get each
   * IP address to use for calling svc_probe()
   */
   for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
   /* Grab the hostname and port on which the
   * health has to be monitored.
   */
   hostname = netaddr->netaddrs[ip].hostname;
   port = netaddr->netaddrs[ip].port_proto.port;
   /*
   * HA-XFS supports only one port and
   * hence obtaint the port value from the
   * first entry in the array of ports.
   */
   ht1 = gethrtime();
   /* Latch probe start time */
   probe_result = svc_probe(scds_handle, hostname, port, timeout);
   /*
   * Update service probe history,
   * take action if necessary.
   * Latch probe end time.
   */
   ht2 = gethrtime();
   /* Convert to milliseconds */
   dt = (ulong_t)((ht2 - ht1) / 1e6);
   /*
   * Compute failure history and take
   * action if needed
   */
   (void) scds_fm_action(scds_handle,
   probe_result, (long)dt);
   }       /* Each net resource */
   }       /* Keep probing forever */