Einen angepassten Advisor erstellen

Ein angepasster Advisor ist ein als Klassendatei bereitgestellter kurzer Java-Code, der vom Load-Balancer-Basiscode aufgerufen wird, um die Last eines Servers zu bestimmen. Der Basiscode stellt alle erforderlichen Verwaltungsdienste bereit, z. B. das Starten und Stoppen einer Instanz des angepassten Advisors, das Bereitstellen von Status und Berichten, das Aufzeichnen von Protokolldaten in einer Protokolldatei sowie das Berichten der Advisorergebnisse an die Managerkomponente.

Wenn der Load-Balancer-Basiscode einen angepassten Advisor aufruft, geschieht Folgendes.

  1. Der Load-Balancer-Basiscode öffnet eine Verbindung zur Servermaschine.
  2. Wenn der Socket geöffnet wird, ruft der Basiscode die Funktion "GetLoad" des angegebenen Advisors auf.
  3. Die Funktion "GetLoad" des Advisors führt die Schritte aus, die der Benutzer für die Auswertung des Serverstatus definiert hat. Sie wartet unter anderem auch auf eine Antwort des Servers. Die Funktion wird nach dem Empfang der Antwort beendet.
  4. Anschließend schließt der Load-Balancer-Basiscode den Socket zum Server und übergibt die Lastinformationen an den Manager. Abhängig davon, ob der angepasste Advisor im normalen Modus oder im Ersetzungsmodus ausgeführt wird, führt der Basiscode manchmal nach Beendigung der Funktion "GetLoad" zusätzliche Berechnungen durch.

Normaler Modus und Ersetzungsmodus

Angepasste Advisor können so gestaltet werden, dass sie entweder im normalen Modus oder im Ersetzungsmodus mit Load Balancer interagieren.

Die Auswahl der Betriebsart wird in der Datei des angepassten Advisors als Parameter der Konstruktormethode angegeben. (Jeder Advisor wird basierend auf seinem Design nur in einem dieser Modi ausgeführt.)

Im normalen Modus tauscht der angepasste Advisor Daten mit dem Server aus. Der Basiscode des Advisors misst die Zeit für den Austausch und berechnet den Lastwert. Der Basiscode übergibt dann diesen Lastwert an den Manager. Der angepasste Advisor gibt den Wert null für Erfolg oder einen negativen Wert für einen Fehler zurück.

Zur Angabe des normalen Modus müssen Sie das Flag "replace" im Konstruktor auf false setzen.

Im Ersetzungsmodus führt der Basiscode keine Zeitmessungen aus. Der angepasste Advisorcode führt alle angegebenen, für den Advisor spezifischen Anforderungen aus und gibt dann einen tatsächlichen Lastwert zurück. Der Basiscode akzeptiert den Lastwert und meldet diesen unverändert an den Manager. Um bestmögliche Ergebnisse zu erzielen, sollten Sie die Lastwerte zwischen 10 und 1000 normalisieren, wobei 10 einen schnellen Server und 1000 einen langsamen Server angibt.

Zur Angabe des Ersetzungsmodus müssen Sie das Flag "replace" im Konstruktor auf true setzen.

Namenskonventionen für Advisor

Die Dateinamen für angepasste Advisor müssen das Format ADV_Name.java haben, wobei Name für den Namen Ihres Advisors steht. Der vollständige Name muss mit dem Präfix ADV_ in Großbuchstaben beginnen. Alle nachfolgenden Zeichen müssen Kleinbuchstaben sein. Durch Verwendung von Kleinbuchstaben wird sichergestellt, dass im Befehl zur Ausführung des Advisors die Groß-/Kleinschreibung nicht beachtet werden muss.

Aufgrund von Java-Konventionen muss der Name der in der Datei definierten Klasse mit dem Namen der Datei übereinstimmen.

Kompilierung

Sie müssen angepasste Advisor in der Programmiersprache Java schreiben und mit einem Java-Compiler kompilieren, der dieselbe Version wie der Load-Balancer-Code hat. Zum Überprüfen der auf Ihrem System vorhandenen Java-Version führen Sie den folgenden Befehl im Verzeichnis Installationspfad/java/bin aus:

java -fullversion

Wenn das aktuelle Verzeichnis nicht zu Ihrem Pfad gehört, müssen Sie angeben, dass Java aus dem aktuellen Verzeichnis ausgeführt werden soll, um sicherzustellen, dass Sie die richtigen Versionsinformationen erhalten. In diesem Fall führen Sie den folgenden Befehl im Verzeichnis Installationspfad/java/bin aus:

./java -fullversion

Während der Kompilierung wird auf die folgenden Dateien Bezug genommen:

Die Umgebungsvariable "classpath" muss während der Kompilierung auf beide Dateien (angepasste Advisordatei und Basisklassendatei) verweisen. Ein Kompilierbefehl kann das folgende Format haben. Beispielkompilierbefehl für UNIX-Windows-Systeme:

 Installationspfad/java/bin/javac -classpath /opt/ibm/edge/lb/servers/lib/ibmlb.jar ADV_name.java

Für diesen Befehl gilt Folgendes:

Die Ausgabe der Kompilierung ist eine Klassendatei, z. B. ADV_name.class. Kopieren Sie vor dem Starten des Advisors die Klassendatei in das Verzeichnis Installationspfad/servers/lib/CustomAdvisors/.

Anmerkung:
Angepasste Advisor können unter einem Betriebssystem kompiliert und unter einem anderen Betriebssystem ausgeführt werden. Sie können Ihren Advisor beispielsweise auf einem Windows-System kompilieren, die generierte Klassendatei im Binärformat auf eine Linux-Maschine kopieren und den angepassten Advisor dort ausführen. Bei den Betriebssystemen AIX, HP-UX, Linux und Solaris ist die Syntax ähnlich.

Angepassten Advisor ausführen

Bevor Sie den angepassten Advisor ausführen, müssen Sie die Klassendatei in das Unterverzeichnis lib/CustomAdvisors/ auf der Load-Balancer-Maschine kopieren. Für einen angepassten Advisor mit dem Namen myping lautet der Dateipfad beispielsweise wie folgt: Installationspfad/servers/lib/CustomAdvisors/ADV_myping.class.

Konfigurieren Sie Load Balancer, starten Sie die Managerfunktion, und setzen Sie den Befehl zum Starten des angepassten Advisors ab. Der angepassten Advisor wird mit dem Advisornamen ohne das Präfix ADV_ und mit der Dateierweiterung angegeben:

dscontrol advisor start myping Portnummer

Die im Befehl angegebene Portnummer steht für den Port, an dem der Advisor eine Verbindung zum Zielserver öffnet.

Erforderliche Routinen

Wie alle Advisor erweitert auch ein angepasster Advisor die Funktionalität der Advisorbasisklasse ADV_Base. Der Advisorbasiscode führt die meisten Funktionen des Advisors aus. So meldet er beispielsweise Lastwerte an den Manager, die im Wertigkeitsalgorithmus des Managers verwendet werden. Darüber hinaus stellt der Advisorbasiscode Socketverbindungen her, schließt Sockets und stellt Sende- und Empfangsmethoden für den Advisor bereit. Der Advisor wird nur zum Senden von Daten an den Port bzw. zum Empfangen von Daten vom Port des überprüften Servers verwendet. Die im Advisorbasiscode bereitgestellten TCP-Methoden sind zeitlich gesteuert, um die Last zu berechnen. Mit einem Flag der Methode constructor des Advisorbasiscodes kann bei Bedarf die vorhandene Last mit der neuen, vom Advisor zurückgegebenen Last überschrieben werden.

Anmerkung:
Der Advisorbasiscode stellt in angegebenen Intervallen die Last ausgehend von einem im Konstruktor festgelegten Wert für den Wertigkeitsalgorithmus bereit. Wenn der Advisor seine Verarbeitung noch nicht abgeschlossen hat und keinen gültigen Lastwert zurückgeben kann, verwendet der Advisorbasiscode den zuvor berichteten Lastwert.

Advisor haben die folgenden Basisklassenmethoden:

Ausführliche Informationen zu diesen erforderlichen Routinen folgen weiter hinten in diesem Abschnitt.

Suchreihenfolge

Angepasste Advisor werden aufgerufen, nachdem native oder Standardadvisor gesucht wurden. Wenn Load Balancer einen angegebenen Advisor nicht in der Liste der Standardadvisor findet, verwendet er die Liste der angepassten Advisor. Zusätzliche Informationen zur Verwendung der Advisor finden Sie in der Veröffentlichung WebSphere Application Server Load Balancer Administratorhandbuch.

Namen und Dateipfade

Die Namen und Pfade von angepassten Advisor müssen folgende Voraussetzungen erfüllen.

Methoden und Funktionsaufrufe angepasster Advisor

Konstruktor (bereitgestellt vom Advisorbasiscode)

public <Name_des_Advisors> (
        String sName;
        String sVersion;
        int iDefaultPort;
        int iInterval;
        String sDefaultLogFileName;
        boolean replace
)
sName
Der Name des angepassten Advisors.
sVersion
Die Version des angepassten Advisors.
iDefaultPort
Die Nummer des Ports, über den die Verbindung zum Server hergestellt wird, wenn keine Portnummer im Aufruf angegeben ist.
iInterval
Das Intervall, in dem der Advisor die Server abfragt.
sDefaultLogFileName
Dieser Parameter ist erforderlich, wird aber nicht verwendet. Der einzige gültige Wert ist eine Nullzeichenfolge "".
replace
Gibt an, ob dieser Advisor im Ersetzungsmodus arbeitet. Die gültigen Werte sind im Folgenden beschrieben:

ADV_AdvisorInitialize()

void ADV_AdvisorInitialize()

Diese Methode führt alle Initialisierungsoperationen durch, die für den angepassten Advisor erforderlich sind. Sie wird nach dem Start des Advisorbasismoduls aufgerufen.

In vielen Fällen, z. B. bei den Standardadvisor, wird diese Methode nicht verwendet, und ihr Code besteht aus einer einzigen Rückkehranweisung (return). Diese Methode kann verwendet werden, um die Methode "suppressBaseOpeningSocket" aufzurufen, die nur in dieser Methode gültig ist.

getLoad()

int getLoad(
        int iConnectTime;
        ADV_Thread *caller
)
iConnectTime
Gibt an, wie lange (in Millisekunden) der Aufbau der Verbindung gedauert hat. Diese Lastmessung wird vom Advisorbasiscode durchgeführt und an den angepassten Advisorcode übergeben, der die Messung bei der Rückgabe des Lastwerts verwenden oder ignorieren kann. Wenn die Verbindung scheitert, wird der Wert auf -1 gesetzt.
caller
Die Instanz der Advisorbasisklasse, in der Advisorbasismethoden bereitgestellt werden.

Funktionsaufrufe, die angepasste Advisor zur Verfügung stehen

In den angepassten Advisor können die in den folgenden Abschnitten beschriebenen Methoden bzw. Funktionen aufgerufen werden. Diese Methoden werden vom Advisorbasiscode unterstützt.

Einige dieser Funktionsaufrufe können direkt ausgeführt werden, z. B. function_name(), aber andere erfordern das Präfix caller. Caller stellt die Basisadvisorinstanz dar, die den ausgeführten angepassten Advisor unterstützt.

ADVLOG()

Die Funktion ADVLOG ermöglicht einem angepassten Advisor, eine Textnachricht an die Basisprotokolldatei des Advisors zu schreiben. Das Format ist wie folgt:

void  ADVLOG  (int logLevel, String Nachricht)
logLevel
Die Statusstufe, auf der die Nachricht in die Protokolldatei geschrieben wird. Die Advisorprotokolldatei ist in Stufen organisiert: die dringendsten Nachrichten erhalten die Statusstufe 0 und die weniger dringenden Nachrichten erhalten höhere Nummern. Die Statusstufe 5 steht für den ausführlichsten Nachrichtentyp. Diese Stufen werden verwendet, um die Typen von Nachrichten zu steuern, die der Benutzer in Echtzeit empfängt. (Die Ausführlichkeit wird mit dem Befehl dscontrol festgelegt.) Schwer wiegende Fehler sollten immer auf der Stufe 0 protokolliert werden.
Nachricht
Die Nachricht, die in die Protokolldatei geschrieben werden soll. Der Wert für diesen Parameter ist eine Java-Standardzeichenfolge.

getAdvisorName()

Die Funktion getAdvisorName gibt eine Java-Zeichenfolge mit dem Suffix des Namens Ihres angepassten Advisors zurück. Für einen Advisor mit dem Namen ADV_cdload.java gibt diese Funktion beispielsweise den Wert cdload zurück.

Diese Funktion verwendet keine Parameter.

Beachten Sie, dass dieser Wert während einer Instanziierung eines Advisors nicht geändert werden kann.

getAdviseOnPort()

Die Funktion getAdviseOnPort gibt die Nummer des Ports zurück, an dem der aufrufende angepasste Advisor ausgeführt wird. Der Rückgabewert ist ein Java-Integer (int), und die Funktion verwendet keine Parameter.

Beachten Sie, dass dieser Wert während einer Instanziierung eines Advisors nicht geändert werden kann.

caller.getCurrentServerId()

Die Funktion "getCurrentServerId" gibt eine Java-Zeichenfolge zurück, die eine eindeutige Darstellung für den aktuellen Server ist.

Dieser Wert ändert sich gewöhnlich bei jedem Aufruf des angepassten Advisors, weil der Advisorbasiscode nacheinander alle Servermaschinen abfragt.

Diese Funktion verwendet keine Parameter.

caller.getCurrentClusterId()

Der Funktionsaufruf "getCurrentClusterId" gibt eine Java-Zeichenfolge zurück, die eine eindeutige Darstellung für den aktuellen Cluster ist.

Dieser Wert ändert sich gewöhnlich bei jedem Aufruf des angepassten Advisors, weil der Advisorbasiscode nacheinander alle Cluster abfragt.

Diese Funktion verwendet keine Parameter.

caller.getSocket()

Der Funktionsaufruf "getSocket" gibt einen Java-Socket zurück, der den Socket darstellt, der für den aktuellen Server zur Kommunikation geöffnet wurde.

Diese Funktion verwendet keine Parameter.

getInterval()

Die Funktion "getInterval" gibt das Advisorintervall zurück, d. h. die Anzahl der Sekunden zwischen Advisorzyklen. Dieser Wert entspricht dem im Konstruktor des angepassten Advisors festgelegten Standardwert, sofern dieser Wert nicht zur Ausführungszeit mit dem Befehl dscontrol geändert wurde.

Der Rückgabewert ist ein Java-Integer (int). Diese Funktion verwendet keine Parameter.

caller.getLatestLoad()

Die Funktion "getLatestLoad" ermöglicht es einem angepassten Advisor, den aktuellen Lastwert für ein bestimmtes Serverobjekt abzurufen. Die Lastwerte werden vom Advisorbasiscode und vom Managerdämon in internen Tabellen verwaltet.

int caller.getLatestLoad (String Cluster-ID, int Port, String Server-ID)

Die drei Argumente zusammen definieren ein einziges Serverobjekt.

Cluster-ID
Die Clusterkennung des Serverobjekts, für das der aktuelle Lastwert abgerufen werden soll. Dieses Argument muss eine Java-Zeichenfolge sein.
Port
Die Portnummer des Serverobjekts, für das der aktuelle Lastwert abgerufen werden soll.
Server-ID
Die Serverkennung des Serverobjekts, für das der aktuelle Lastwert abgerufen werden soll. Dieses Argument muss eine Java-Zeichenfolge sein.

Der Rückgabewert ist eine ganze Zahl.

Dieser Funktionsaufruf ist hilfreich, wenn Sie das Verhalten eines Protokolls oder Ports vom Verhalten eines anderen abhängig machen möchten. Sie können diesen Funktionsaufruf beispielsweise in einem angepassten Advisor verwenden, der einen bestimmten Anwendungsserver inaktiviert, wenn der Telnet-Server auf der betreffenden Maschine inaktiviert wird.

caller.receive()

Die Funktion "receive" ruft Informationen von der Socketverbindung ab.

caller.receive(StringBuffer *response)

Der Parameter response ist ein Zeichenfolgepuffer, in dem die abgerufenen Daten abgelegt werden. Außerdem gibt die Funktion einen ganzzahligen Wert mit folgender Bedeutung zurück:

caller.send()

Die Funktion "send" verwendet die eingerichtete Socketverbindung, um ein Datenpaket über den angegebenen Port an den Server zu senden.

caller.send(String Befehl)

Der Parameter Befehl ist eine Zeichenfolge mit den an den Server zu sendenden Daten. Die Funktion gibt einen ganzzahligen Wert mit folgender Bedeutung zurück:

suppressBaseOpeningSocket()

Mit dem Funktionsaufruf "suppressBaseOpeningSocket" kann ein angepasster Advisor angeben, ob der Basisadvisorcode einen TCP-Socket zum Server öffnen soll. Wenn Ihr Advisor keine direkte Kommunikation mit dem Server verwendet, um den Status zu bestimmen, muss dieser Socket unter Umständen nicht geöffnet werden.

Dieser Funktionsaufruf kann nur ein einziges Mal abgesetzt werden, und er muss von der Routine ADV_AdvisorInitialize abgesetzt werden.

Diese Funktion verwendet keine Parameter.