Zum Hauptinhalt springen

Cluster- und Cache-Betrieb

Diese Seite beschreibt, wie ein Webdesk mit mehreren Knoten (Cluster, "verteilter Betrieb") konfiguriert und betrieben wird und wie sich die Caches dabei verhalten. Sie richtet sich an Systemadministratoren und Consultants. Vorausgesetzt werden: alle Knoten greifen auf dieselbe Datenbank zu, ein erreichbarer Redis-Server und – bei Cache-Replikation über JMS – ein JMS-Broker. Die Schlüssel werden pro Knoten in der webdesk.properties gesetzt (siehe Seite "Konfigurationsdatei webdesk.properties und Umgebungsvariablen"). Ergänzend beschreiben Liste der Caches den Zweck der Caches, Aktive Jobs die Job-Überwachung inklusive Knotenstatus und Erweiterte Funktionen die Wartungsaktionen.

Überblick: Bausteine des Cluster-Betriebs​

BausteinAufgabeSchalter
Cache-Replikation (EhCache)Gleicht die EhCache-Caches zwischen den Knoten ab und transportiert Dienstaufrufe an die anderen Knoten (Speichern von Jobs und Job-Triggern, Übernahme von Systemparametern, Veröffentlichung des Clusterstatus). Transport wahlweise RMI (Multicast) oder JMS.isDistributed, useJmsReplication
RedisGemeinsamer Speicher und Nachrichtenkanal (Pub/Sub) für die als "repliziert" definierten Anwendungs-Caches (Caffeine + Redis), für den Hibernate-Provider redis-caffeine und für die HTTP-Sessions (Spring Session). Die Redis-Anbindung wird aufgebaut, wenn isDistributed=true oder redis.useAsSessionStore=true gilt.redis.*
Hibernate-Cache (Second-Level-Cache)Cache für Datenbank-Entitäten. Anbieter global umschaltbar.webdesk.hibernate.cache.provider
HTTP-SessionsSitzungen lokal im Speicher, in Redis (Spring Session) oder über den Tomcat-Session-Manager.redis.useAsSessionStore, META-INF/context.xml
JobsZuordnung der Job-Trigger zu einem Knoten.PoOptions.clusterNodes, Trigger-Feld "Ausführen auf Clusternode"

Bei isDistributed=false (Standard) ist jede Abstimmung zwischen Knoten abgeschaltet; die Caches arbeiten dann rein lokal. Ein gesetztes useJmsReplication wird ohne isDistributed=true ignoriert.

Grundkonfiguration eines Knotens​

EigenschaftErklärungmögliche Wert(e)
isDistributedSchaltet den verteilten Betrieb ein: Cache-Replikation, Redis-Anbindung für replizierte Caches, Cluster-Heartbeat und knotenspezifischer Workflow-Engine-Name. Muss auf allen Knoten gleich gesetzt sein.true/false (Standard: false)
useJmsReplicationBei true werden die EhCache-Caches über JMS repliziert, sonst über RMI mit Multicast-Erkennung. Nur wirksam bei isDistributed=true. Muss auf allen Knoten gleich gesetzt sein.true/false (Standard: false, also RMI)
PoOptions.clusterNodeName dieses Knotens; muss pro Knoten eindeutig sein. Ist kein Name gesetzt, zeigt der Clusterstatus LOCAL. Wird isDistributed=true per Umgebungsvariable oder JVM-Parameter gesetzt und weder dort noch in der webdesk.properties ein Knotenname angegeben, verwendet Webdesk beim Start die Umgebungsvariable HOSTNAME als Knotennamen. Ist isDistributed nur in der webdesk.properties gesetzt, findet diese Vorbelegung nicht statt.Text, z.B. node1
PoOptions.clusterNodesListe aller Knotennamen des Clusters. Wird in der Maske "Systemparameter" (Bean PoOptions, Eigenschaft clusterNodes) gepflegt und gilt für alle Knoten. Die Einträge müssen exakt den PoOptions.clusterNode-Namen der Knoten entsprechen: Der Clusterstatus erwartet von jedem Eintrag eine Statusmeldung, der Name des aktuellen Knotens wird immer zusätzlich berücksichtigt. Das Job-Feld "Ausführen auf Clusternode" bietet die Liste nur an, wenn sie mehr als einen Eintrag enthält.Liste von Namen (Standard: ClusterNode1)
WfStartup.engineNameName der Workflow-Engine des Knotens. Wird der Standardname bei isDistributed=true nicht geändert, bildet Webdesk den Namen aus Standardname und Knotenname (webdeskshark_<Knotenname>); im Normalfall muss der Schlüssel daher nicht gesetzt werden.Text (Standard: webdeskshark)
webdesk.cluster.heartbeatIntervalSecondsIntervall in Sekunden, in dem ein Knoten seinen Clusterstatus und seinen Job-Überwachungsstand an die anderen Knoten veröffentlicht (auch sofort beim Start). Läuft nur bei isDistributed=true. 0 schaltet den Heartbeat ab, ein negativer Wert verwendet den Standard.Zahl (Standard: 30)
webdesk.cluster.skipIdleJobMonitoringSnapshotsBei true veröffentlicht ein Knoten ohne Jobs und mit gestopptem Scheduler im Heartbeat keinen Job-Überwachungsstand.true/false (Standard: true)

Hinweis: Die Schlüssel isDistributed, useJmsReplication, PoOptions.clusterNode, WfStartup.engineName, webdesk.cacheReplication.RMI.peerProvider.properties und webdesk.cacheReplication.JMS.peerProvider.properties können auch als JVM-Parameter oder Umgebungsvariable gesetzt werden. Der Name der Umgebungsvariable lautet WD_ plus Schlüssel in Großbuchstaben, Punkte werden zu Unterstrichen (z.B. WD_ISDISTRIBUTED, WD_POOPTIONS_CLUSTERNODE). Leere Umgebungsvariablen werden ignoriert.

Cache-Replikation: RMI oder JMS​

Der Transport gilt global für alle replizierten EhCache-Caches und wird über useJmsReplication gewählt. Zusätzlich nutzt Webdesk die Replikation, um Dienstaufrufe an die anderen Knoten zu senden. Das betrifft das Speichern von Jobs und Job-Triggern, die Übernahme von Systemparametern (Neu-Injektion der Bean-Eigenschaften) und die Veröffentlichung des Clusterstatus. Ist die Replikation gestört, erreichen diese Änderungen die anderen Knoten nicht.

EigenschaftErklärungmögliche Wert(e)
webdesk.cacheReplication.RMI.peerProvider.propertiesPeer-Erkennung bei RMI. Standard ist die automatische Erkennung über Multicast. timeToLive legt die Reichweite fest: 0 gleicher Host, 1 gleiches Subnetz, 32 gleicher Standort, 64 gleiche Region, 128 gleicher Kontinent, 255 unbeschränkt. Die Knoten müssen sich also in derselben Multicast-Gruppe befinden und Multicast muss im Netzwerk erlaubt sein.Standard: peerDiscovery=automatic,multicastGroupAddress=230.0.0.1,multicastGroupPort=4446,timeToLive=1
webdesk.cacheReplication.peerListener.propertiesEinstellungen des RMI-Listeners (nur bei RMI).Standard: socketTimeoutMillis=120000
webdesk.cacheReplication.JMS.peerProvider.propertiesVerbindung zum JMS-Broker (nur bei JMS): Adresse des Brokers sowie Benutzer und Passwort eines gültigen Broker-Zugangs. Webdesk startet keinen eigenen Broker. Die Namen von Topic und Queue sind fest vorgegeben und nicht änderbar. Der Beispielwert in der Vorlage enthält Standard-Zugangsdaten, die durch die echten Zugangsdaten zu ersetzen sind.Vorlage: providerURL=tcp://localhost:61616/,userName=<user>,password=<password>
webdesk.cacheReplication.excludedCachesKomma-getrennte Liste von Cache-Namen, die nicht repliziert werden sollen. Gilt für die in ehcache.xml-Dateien definierten Caches und, im Hibernate-Modus ehcache2, für Hibernate-Regionen.Liste von Cache-Namen (Standard: leer)
webdesk.cacheReplication.listener.replicatePuts, .replicateUpdates, .replicateUpdatesViaCopy, .replicateRemovals, .replicateAsynchronouslyWas und wie repliziert wird.true/false (Standard: jeweils true)
webdesk.cacheReplication.maxElementsInMemory, .timeToIdleSeconds, .timeToLiveSeconds, .eternal, .overflowToDiskVorgabewerte für EhCache-Caches ohne eigene Definition.Standard: 100 / 300 / 300 / false / true

Achtung: webdesk.cacheReplication.listener.replicatePuts=false global zu setzen ist nicht zulässig. Der Versand von Dienstaufrufen zwischen den Knoten beruht darauf, dass das Ablegen eines Eintrags im internen Kommunikations-Cache repliziert wird; mit replicatePuts=false würden Job-Änderungen, Systemparameter und Clusterstatus nicht mehr bei den anderen Knoten ankommen.

Achtung: Der ältere Schlüssel webdesk.cacheReplication.peerProvider.properties (ohne RMI) wird nicht mehr ausgewertet. Mit ihm gesetzte Multicast-Adressen oder -Ports gelten nicht; es greift der Standard (230.0.0.1, Port 4446).

Die Vorgabewerte für Caches können zusätzlich durch eine Datei defaultCacheConfiguration.properties im Klassenpfad (WEB-INF/classes) übersteuert werden; sie hat Vorrang vor der webdesk.properties. Dass overflowToDisk standardmäßig aktiv ist, kann bei großen Caches zu höheren Antwortzeiten führen, weil Einträge dann von der Platte gelesen werden; Caches mit eigener Bean-Definition können dies mit der Bean-Eigenschaft overflowToDisk abschalten (Beispiel: PtmPermissionCacheBean.overflowToDisk=false in der webdesk.properties). Die Überschreibung per <Bean>.<Eigenschaft> wirkt nur auf Spring-Cache-Beans, nicht auf die Regionen der ehcache.xml-Dateien für den Hibernate-Cache.

Redis​

Redis wird für Sessions (Spring Session), für replizierte Anwendungs-Caches (Caffeine als lokale Ebene, Redis als gemeinsame Ebene, Ungültigkeitsmeldungen über den Pub/Sub-Kanal webdesk:cache-sync) und für den Hibernate-Provider redis-caffeine (Kanal webdesk:hibernate-cache-coherence) verwendet. Die Verbindung wird aufgebaut, sobald isDistributed=true oder redis.useAsSessionStore=true gilt. Ist weder redis.connection.url noch redis.clusterNodes gesetzt, verbindet sich Webdesk mit localhost Port 6379.

EigenschaftErklärungmögliche Wert(e)
redis.useAsSessionStoreBei true werden die HTTP-Sessions über Spring Session in Redis gehalten.true/false (Standard: false)
redis.connection.urlAdresse eines einzelnen Redis-Servers. Übernommen werden Host, Port und Datenbank-Nummer; ein in der URL enthaltenes Passwort wird nur verwendet, wenn redis.connection.password leer ist.z.B. redis://redis-host:6379/0 (Standard: leer, dann localhost:6379)
redis.clusterNodesKomma-getrennte Liste der Knoten eines Redis-Clusters. Ist der Wert gesetzt, hat er Vorrang vor redis.connection.url; die Zeitüberschreitung für Redis-Befehle beträgt dann 2 Sekunden.z.B. host1:6379,host2:6379 (Standard: leer)
redis.connection.passwordPasswort für Redis. Nicht in Dokumentation, Tickets oder Logs weitergeben.<your-redis-password> (Standard: leer)
redis.credentials.encrptedBei true ist redis.connection.password mit dem Webdesk-Verfahren verschlüsselt abgelegt. Der Schlüsselname ist im Produkt so geschrieben ("encrpted") und muss genau so verwendet werden.true/false (Standard: false)
redis.session.cookie.jvmRouteRoute-Suffix des Session-Cookies JSESSIONID für Load Balancer, die über dieses Suffix routen (z.B. Apache mit mod_jk, Worker-Name wie worker2). Ist der Wert leer, liest Webdesk das Attribut jvmRoute des Engine-Elements aus der conf/server.xml des Tomcat. Der Wert ist nicht automatisch gleich PoOptions.clusterNode. Findet sich keine Route, wird im Log gewarnt und das Cookie ohne Suffix geschrieben.Text (Standard: leer)

Die redis.*-Schlüssel können auch als JVM-Parameter oder Umgebungsvariable gesetzt werden (z.B. WD_REDIS_USEASSESSIONSTORE, WD_REDIS_CONNECTION_URL); diese haben Vorrang vor der webdesk.properties.

Hibernate-Cache (Second-Level-Cache)​

Der Anbieter des Hibernate-Caches wird mit webdesk.hibernate.cache.provider in der webdesk.properties gewählt. Die Wahl gilt global und unabhängig von isDistributed. Die Variante redis-caffeine steht seit Webdesk 4.64 optional zur Verfügung.

WertWirkung
ehcache2 (Standard, auch bei leerem Wert)EhCache-basierter Cache; bei isDistributed=true über RMI oder JMS repliziert. Die Regionen sind in den ehcache.xml-Dateien der Module definiert.
redis-caffeineRedis als maßgeblicher gemeinsamer Speicher, ergänzt um einen lokalen Caffeine-Nahbereichs-Cache. Benötigt eine Redis-Anbindung, also isDistributed=true oder redis.useAsSessionStore=true; sonst scheitert der Start mit der Meldung, dass die Redis-Verbindung nicht verfügbar ist.
disabledSchaltet Second-Level-Cache und Query-Cache ab.

Ein anderer Wert verhindert den Start mit einer Fehlermeldung, die die erlaubten Werte nennt.

Regeln für den Betrieb​

  • Alle Knoten einer Umgebung müssen denselben Wert verwenden.
  • Eine Änderung des Werts erfordert einen Neustart der gesamten Umgebung; ein Mischbetrieb verschiedener Anbieter ist zu vermeiden.
  • Der Redis-Server muss für redis-caffeine die Eviction-Richtlinie maxmemory-policy noeviction (oder ein gleichwertiges, dokumentiertes Verhalten bei verwaltetem Redis) haben. Webdesk prüft dies beim Start per CONFIG GET maxmemory-policy und bricht den Start bei anderen Richtlinien (z.B. allkeys-lru, volatile-lru) oder bei verweigertem CONFIG GET ab. Auch mit noeviction sollte der Speicherverbrauch von Redis überwacht werden, da ein voller Redis zum Ausfall führt.
  • Lokale EhCache2-Cache-Dateien (Disk-Stand) dürfen beim Wechsel des Anbieters nicht weiterverwendet werden.

Umstellung auf redis-caffeine​

  1. Wert für webdesk.hibernate.cache.provider für die gesamte Umgebung festlegen und ein Wartungsfenster planen, damit kein Mischbetrieb entsteht.
  2. Prüfen, dass Redis mit maxmemory-policy noeviction arbeitet.
  3. Die Redis-Schlüssel des Hibernate-Caches (Präfix wd:hibernate:l2:) vor dem Start löschen, da frühere Einträge nicht kompatibel sind. Beispiel für einen einzelnen Redis-Server (bei Redis Cluster pro Primärknoten ausführen):
    redis-cli --scan --pattern 'wd:hibernate:l2:*' | xargs -r redis-cli del
  4. Den Wert in der webdesk.properties aller Knoten setzen und die Knoten starten.
  5. Im Log prüfen, dass keine dauerhafte Flut von Decodier-Warnungen zu Hibernate-Cache-Schlüsseln auftritt.

Rückstellung oder Wechsel auf ehcache2 / disabled​

  1. Alle Knoten stoppen.
  2. Bei bisherigem Modus redis-caffeine die Schlüssel wd:hibernate:l2:* löschen.
  3. Den Wert in der webdesk.properties aller Knoten auf den Zielwert setzen.
  4. Alle Knoten in einem Zug wieder starten.

Feineinstellung des Nahbereichs-Caches (redis-caffeine)​

Veränderbare Entitäten werden standardmäßig lokal zwischengespeichert; Redis bleibt maßgeblich. Wird ein Ereignis verpasst, kann ein Knoten einen Wert höchstens bis zum Ablauf von valueTtlMillis veraltet liefern. Die folgenden Schlüssel sind optional; die Standardwerte sind für den Normalbetrieb ausgelegt. Wo diese Schlüssel in einer Installation abgelegt werden, sollte mit dem Webdesk-Support abgestimmt werden.

EigenschaftErklärungmögliche Wert(e)
wd.cache.hibernate.nearCache.valueTtlMillisGültigkeit eines lokal gelesenen Werts in Millisekunden.Zahl (Standard: 3000)
wd.cache.hibernate.nearCache.coherenceStateTtlMillisDauer in Millisekunden, für die der lokal beobachtete Kohärenzzustand vorgehalten wird.Zahl (Standard: 120000)
wd.cache.hibernate.nearCache.maxEntriesMaximale Anzahl lokaler Einträge.Zahl (Standard: 20000)
wd.cache.hibernate.nearCache.reconnectionStrategyVerhalten nach einem Verbindungsabbruch zu Redis: lokale Werte werden verworfen. Die Werte LOAD und NONE werden abgelehnt.CLEAR (Standard)
wd.cache.hibernate.nearCache.excludedMutableRegionsKomma-getrennte Liste von Regionen, die nie lokal gelesen werden dürfen (für besonders konsistenzkritische Regionen).Liste (Standard: leer)
wd.cache.hibernate.nearCache.queryRegionsKomma-getrennte Liste von Query-Regionen, für die lokales Lesen erlaubt wird.Liste (Standard: leer)
wd.cache.hibernate.region.entryTtlMillisLebensdauer eines Eintrags in Redis in Millisekunden.Zahl (Standard: 3600000)
wd.cache.hibernate.readWrite.softLockTtlMillisLebensdauer der Soft-Locks in Redis in Millisekunden.Zahl (Standard: 60000)

Die Kennzahlen webdesk.hibernate.l2.redis.publish.failures, webdesk.hibernate.l2.redis.event.apply.failures und webdesk.hibernate.l2.redis.subscription.disconnects sollten im Normalbetrieb bei 0 bleiben, webdesk.hibernate.l2.redis.near.cache.disabled sollte 0 sein.

HTTP-Sessions im Cluster​

Welche Session-Art aktiv ist, zeigt die Maske "Clusterstatus" im Feld "Session-Mode" (siehe unten). Es gibt zwei voneinander unabhängige Einstellungen:

  • Spring Session mit Redis: aktiv bei redis.useAsSessionStore=true (Standard: false). Das Session-Cookie bleibt JSESSIONID, optional mit Route-Suffix (redis.session.cookie.jvmRoute). Bei einem Knotenausfall findet der verbleibende Knoten die Session auch dann, wenn das Cookie noch das Suffix des ausgefallenen Knotens trägt. Bestimmte Session-Attribute werden bewusst nicht in Redis abgelegt, sondern bleiben auf dem Knoten, der sie angelegt hat (u.a. die Zustände von Cocoon-Formularen und Flowscripts, die Vaadin-Anwendung HR Expert, der angemeldete und der gewechselte Benutzer, der Skin). Der Load Balancer sollte Anfragen einer Session daher möglichst auf demselben Knoten halten.
  • Tomcat-Session-Manager (memcached-session-manager mit Redis): wird ausschließlich über ein <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" .../>-Element in der META-INF/context.xml des Webdesk eingeschaltet. In der im WAR ausgelieferten context.xml ist dieses Element auskommentiert. Das Docker-Image des Webdesk bringt dagegen eine eigene context.xml mit, die in die Web-Anwendung kopiert wird und das Element aktiv enthält (mit memcachedNodes="redis://redis"); die Bibliotheken des Session-Managers sind im Image vorhanden. Die Maske "Clusterstatus" meldet "memcached-session-manager / Redis", sobald das Element in der context.xml gefunden wird, auch wenn zusätzlich redis.useAsSessionStore=true gesetzt ist.

Achtung: Vor der Inbetriebnahme muss pro Umgebung geklärt und im "Session-Mode" überprüft werden, welcher Mechanismus tatsächlich aktiv ist. Vor allem bei Docker-Betrieb ist die mitgelieferte context.xml zu beachten.

Für Formulare gibt es zusätzlich die Systemparameter enableFormStateClusterFailover (Standard: false) und useSessionToStoreFormState (Standard: true) der Bean PoOptions. Bei aktiviertem Failover wird der zuletzt gespeicherte Zustand bestimmter Formulare nach einem Knotenwechsel wiederhergestellt; mit useSessionToStoreFormState=true wird der Zustand in der Session (und damit in Redis) abgelegt, sonst in einem replizierten EhCache-Bereich.

Jobs im Cluster​

  • Ob und mit wie vielen Threads auf einem Knoten Jobs ausgeführt werden, legen PoJobServiceTarget.active und noOfSchedulerThreads fest (siehe Systemparameter Portal & Organisation).
  • Arbeitet Webdesk als Cluster (isDistributed=true, mehr als ein Eintrag in PoOptions.clusterNodes und der eigene Knotenname ist enthalten), erscheint im Job-Editor bei den Triggern das Feld "Ausführen auf Clusternode". Ein Trigger wird nur auf dem Knoten eingeplant, dessen Name dort ausgewählt ist. Ein Trigger ohne Knotenzuordnung wird in dieser Konstellation auf keinem Knoten eingeplant (ausgenommen das einmalige Starten über "Job starten").
  • Die Überwachung der Jobs aller Knoten beschreibt Aktive Jobs.

Was nicht automatisch zwischen den Knoten abgeglichen wird​

BereichVerhalten und Maßnahme
MetaForm-CacheIst von der Replikation ausgenommen. Nach Änderungen an Formulardefinitionen, die nicht auf allen Knoten übernommen wurden, in der Maske "Erw. Funktionen" die Aktion "MetaForm-Cache auf allen Cluster-Knoten ungültig machen" ausführen. Sie leert den MetaForm-Cache auf dem aktuellen und auf den übrigen Knoten.
Weitere nicht replizierte CachesEinige Caches sind bewusst lokal: unter anderem die Workflow-Prozessdefinitions-Caches (webdesk_processdefinitions, webdesk_processdefinitions2hide, webdesk_wfprocessdefinitiondao_methodcache), die CMIS-Sitzungen der Dokumentenverwaltung und der Cache at.workflow.webdesk.po.STATIC_NON_CLUSTERED. Änderungen daran wirken auf jedem Knoten nur lokal; siehe Erweiterte Funktionen (Workflow-Cache aktualisieren) und Job refresh Cache.
Lucene-SuchindexDer Volltextindex liegt im lokalen Dateisystem jedes Knotens und wird beim Start des Knotens aktualisiert (Schlüssel webdesk.luceneIndexing, Standard: true). Die Aktionen "Lucene-Suchindex aktualisieren" und "Lucene-Suchindex bereinigen" in "Erw. Funktionen" wirken nur auf dem Knoten, auf dem sie ausgeführt werden. Der Unterordner des Index ist standardmäßig zufällig; mit dem JVM-Parameter webdesk.lucene.index.subdir kann er festgelegt werden.
Menüs, Berechtigungen und weitere Caches per Hand leerenDie Aktionen zum Leeren in der Maske "Liste der Caches" und in "Erw. Funktionen" werden auf dem Knoten ausgeführt, auf dem sie aufgerufen werden. Eine gezielte Weitergabe an die anderen Knoten ist nur bei der MetaForm-Aktion vorgesehen; bei sonstigen Caches hängt die Wirkung auf andere Knoten davon ab, ob der Cache repliziert wird (Spalte "Distributed").
Session-AttributeSiehe Abschnitt "HTTP-Sessions im Cluster".

Maske "Liste der Caches" (po_showCaches)​

Die Maske zeigt alle Caches des Knotens, auf dem die Anfrage landet. Mit dem Textfeld "Zeige nur Caches deren Namen folgenden Text beinhalten" kann die Liste gefiltert werden. Je Cache werden angezeigt: "Name", "Einträge", "Effizienz" (Trefferquote in Prozent), "Cache Typ", "Distributed" sowie die Konfiguration (maximale Einträge, Time-to-idle, Time-to-live, eternal). Mit der Option "Anzeige Speicherverbrauch" werden zusätzlich die Spalten "Speicher, in KB" und "Max. Speicher, in KB" sowie die Summen berechnet.

Spalte "Distributed"Bedeutung
LocalEhCache-Cache ohne Replikations-Listener: wird nicht zwischen Knoten abgeglichen.
ReplicatedEhCache-Cache mit RMI-/JMS-Replikation oder Caffeine+Redis-Cache mit Abgleich über Redis.
Caffeine (Local)Caffeine-Cache ohne Abgleich über Redis.
Terracotta-clustered / UnknownEhCache-Cache mit Terracotta-Anbindung bzw. nicht erkannter Cache-Typ.

Ist der verteilte Betrieb aktiv, zeigt die Maske zusätzlich den Text "Diese Instanz ist Teil eines Clusters und hat den Namen" mit dem Knotennamen und die Schaltfläche "Anzeige Replikationsmitglieder". Sie listet die der Replikation bekannten Partner (bei RMI URL und GUID, bei JMS den Namen); sind keine Partner bekannt, erscheint "No Caching Peers available". Mit "Leeren aller Caches" bzw. dem Symbol "Cache leeren" je Zeile werden Caches des aktuellen Knotens geleert (nach dem Leeren aller Caches ist der Workflow-Cache zu aktualisieren, siehe Liste der Caches).

Maske "Clusterstatus" (po_showClusterStatus)​

Beim Öffnen veröffentlicht der Knoten seinen eigenen Status und wartet bis zu 2,5 Sekunden darauf, dass die Meldungen der konfigurierten Knoten eintreffen. Erscheinen danach konfigurierte Knoten weiterhin als fehlend, zeigt die Maske den Hinweis "Die Cluster-Replikation ist noch im Aufbau." mit den Namen der "Konfigurierte Knoten noch nicht sichtbar". Im Normalbetrieb senden alle Knoten ihren Status im Heartbeat (Standard: alle 30 Sekunden).

Die Kopfzeile zeigt "Clusterübersicht" (antwortende Knoten / konfigurierte Knoten), die Anzahl "Veraltet" und "Fehlt" sowie die Topologie:

  • "Cluster-Modus": "Verteilt" oder "Einzelserver".
  • "Cache-Replikations-Topologie": "RMI", "JMS" oder "Keine".
  • "Session-Mode": "Spring Session / Redis", "memcached-session-manager / Redis", "Lokal im Speicher" oder "Unbekannt".

Die Tabelle listet je Knoten "Cluster-Knoten", "Status", "Job-Service" (gestartet oder gestoppt), "Threads", "Aktualisiert am", "Aktive Sessions", "Aktive Jobs", "Laufende Jobs", Speicher (frei, belegt, maximal) sowie "Version", "Revision" und "Branch". Abweichende Versionen zwischen den Knoten sind in den Spalten "Version", "Revision" und "Branch" sofort erkennbar. Die Werte in der Spalte "Status":

StatusBedeutung
CURRENTDer Knoten, dessen Maske gerade angezeigt wird.
RESPONDINGKonfigurierter Knoten, dessen letzte Statusmeldung nicht älter als 180 Sekunden ist.
STALEDie letzte Statusmeldung ist älter als 180 Sekunden (mögliche Ursachen: Knoten ausgefallen, Heartbeat abgeschaltet oder Replikation unterbrochen).
MISSINGDer Knoten steht in PoOptions.clusterNodes, es liegt aber keine Statusmeldung vor: Der Knoten hat noch nie gemeldet (nicht gestartet, anderer Name, Replikation funktioniert nicht) oder seine letzte Meldung ist verfallen (Statusmeldungen werden nach 300 Sekunden aus dem Cache entfernt, ein ausgefallener Knoten wechselt also von STALE nach MISSING).
OBSERVED_ONLYDer Knoten sendet Status, steht aber nicht in PoOptions.clusterNodes (z.B. Schreibweise des Namens oder fehlender Eintrag).

Typische Symptome und Prüfungen​

SymptomPrüfung
Der Eintrag "ClusterNode1" oder ein Knoten steht dauerhaft auf MISSING, obwohl alle Knoten laufenPoOptions.clusterNodes enthält noch den Standardwert oder Namen, die von PoOptions.clusterNode abweichen. Namen auf allen Knoten und in der Liste abgleichen.
Andere Knoten sind nicht sichtbar (MISSING/STALE), Topologie zeigt "Keine"isDistributed=true auf allen Knoten und Neustart? Bei RMI: gleiche Multicast-Gruppe und Port, Multicast im Netz erlaubt, timeToLive passend. Bei JMS: Broker erreichbar, Zugangsdaten gültig, auf allen Knoten useJmsReplication=true. In der Maske "Liste der Caches" die Replikationsmitglieder prüfen.
Änderung an einem Job oder Systemparameter wirkt nur auf einem KnotenDie Weitergabe läuft über die Cache-Replikation. Clusterstatus und Replikationsmitglieder prüfen; replicatePuts darf nicht auf false stehen.
Ein Job läuft auf keinem KnotenTrigger ohne Eintrag im Feld "Ausführen auf Clusternode" werden im Cluster nicht eingeplant; Knotenstatus in Aktive Jobs prüfen.
Formulare oder Masken zeigen auf einem Knoten alte FelderMetaForm-Cache per Aktion auf allen Knoten ungültig machen.
Start bricht mit "Unsafe Redis maxmemory-policy ..." abRedis auf maxmemory-policy noeviction stellen (nur bei redis-caffeine).
Start bricht ab: "Unsupported value ... webdesk.hibernate.cache.provider"Erlaubt sind ehcache2, redis-caffeine, disabled.
Nach dem Wechsel zu einem anderen Knoten erscheint die Anmeldeseite"Session-Mode" im Clusterstatus prüfen. Bei Spring Session: gleiche Redis-Verbindung auf allen Knoten, redis.session.cookie.jvmRoute passend zur Route des Load Balancers (Warnung im Log, wenn keine Route gefunden wird).
Veraltete Daten nach Änderungen auf einem anderen Knoten (redis-caffeine)Kennzahlen zu Publish-, Apply- und Verbindungsfehlern prüfen; gegebenenfalls Region in excludedMutableRegions aufnehmen.

Checkliste für die Inbetriebnahme​

  1. Pro Knoten einen eindeutigen PoOptions.clusterNode festlegen (WfStartup.engineName bleibt im Normalfall auf dem Standard), isDistributed=true und – falls gewünscht – useJmsReplication=true mit Broker-Zugang setzen.
  2. Netzwerk prüfen: bei RMI Multicast (Standard 230.0.0.1:4446) zwischen den Knoten, bei JMS Zugriff auf den Broker, außerdem Zugriff aller Knoten auf Redis.
  3. Redis-Verbindung (redis.connection.url oder redis.clusterNodes) auf allen Knoten setzen; Passwort nur aus einer geschützten Quelle.
  4. Entscheiden, welche Session-Art verwendet wird (redis.useAsSessionStore oder Tomcat-Session-Manager) und Route des Load Balancers abstimmen (redis.session.cookie.jvmRoute).
  5. Hibernate-Anbieter einheitlich festlegen (webdesk.hibernate.cache.provider); bei redis-caffeine Redis-Richtlinie noeviction und das Löschen der Schlüssel wd:hibernate:l2:* berücksichtigen.
  6. Knoten starten; in der Maske "Systemparameter" die Liste PoOptions.clusterNodes mit allen Knotennamen füllen.
  7. In der Maske "Clusterstatus" prüfen: alle Knoten RESPONDING bzw. CURRENT, Topologie wie geplant, einheitliche Versionen.
  8. Jobs: für jeden Trigger den Knoten im Feld "Ausführen auf Clusternode" festlegen und in "Aktive Jobs" kontrollieren.