Failover-Konzept
Funktionsprinzip
Beim Failover-Konzept geht es darum, die Ausfallsicherheit des Node Controllers zu gewährleisten.
Es existiert immer genau ein aktiver Node Controller in einem Cluster/Verbund. Die Anzahl von Working Nodes ist unbegrenzt und kann jederzeit verändert werden.
Jeder Working Node (per Lizenz und Konfiguration) kann prinzipiell sowohl im Working-Modus, als auch im Controller-Modus sein. Die Modi können im laufenden Betrieb wechseln. Node Controller (per Lizenz und Konfiguration) können nur im Controller-Modus sein. Ein Wechsel des Node-Betriebsmodus kann selbständig aufgrund eines erkannten Failovers erfolgen, oder vom Benutzer explizit initiiert werden (im Control Center oder per HTTP).
Immer der letzte Node Controller, der online geht, wird zum aktiven Node Controller. Alte Node Controller beenden sich, außer sie waren per Lizenz und Konfiguration vorher ein Working Node. In diesem Fall wechselt die Instanz zum Working Node und fährt nicht herunter.
Es muss einmalig (beim Start) ein gültiger Betriebszustand mit Node Controller und Working Node(s) erreicht sein, weil Working Nodes ihr Setup beim Start vom Node Controller erhalten.
Wird die Verbindung eines beliebigen Working Nodes zum Node Controller unterbrochen, wird der Failover ausgelöst. Hinweis: Siehe Heartbeat interval beim Parameter addNode und Parameter externalURL.
Einrichtung des Load-Balancing-Services
Um die Failover-Funktionalität zu verwenden, müssen Sie den Load-Balancing-Service aktivieren. Dazu sind Anpassungen in den folgenden Konfigurationsdateien notwendig.
Anpassung der Konfigurationsdatei ./etc/factory.xml auf allen Nodes des Clusters
Auf allen Nodes (Node Controller und Working Nodes) muss der LoadBalanceService (siehe unten) in der Konfigurationsdatei ./etc/factory.xml aktiviert werden. Wichtiger Hinweis: Der Eintrag muss vor dem StartupService (siehe unten) eingefügt werden, da sonst nicht auf das Failover zugegriffen werden kann.
<?
xml
version
=
"1.0"
encoding
=
"ISO-8859-1"
?>
<!DOCTYPE Configure PUBLIC
"-//Lobster//DTD Configure 1.0//EN"
"
http://www.lobster.de/dtd/configure_1_1.dtd
">
<
Configure
class
=
"com.ebd.hub.services.ServiceFactory"
>
<!-- set a unique id for this factory - needed for cluster and load balance -->
<
Set
name
=
"id"
>factoryID</
Set
>
.
.
.
<!-- service for lb/ha cluster -->
<
Call
name
=
"addService"
>
<
Arg
>com.ebd.hub.services.ha.LoadBalanceService</
Arg
>
<
Arg
>etc/loadbalance.xml</
Arg
>
</
Call
>
.
.
.
<!-- service to start applications... -->
<
Call
name
=
"addService"
>
<
Arg
>com.ebd.hub.services.startup.StartupService</
Arg
>
<
Arg
>etc/startup.xml</
Arg
>
</
Call
>
Parameter |
Beschreibung |
id |
Wird für die Identifizierung und das Laden der Konfiguration benötigt. Wichtiger Hinweis: Muss einzigartig in einem Cluster sein. |
Anpassung der Konfigurationsdatei ./etc/loadbalance.xml auf allen Nodes des Clusters
Auf allen Nodes (Node Controller und Working Nodes) muss die Datei ./etc/loadbalance.xml (bzw. die Datei, die in der Konfigurationsdatei ./etc/factory.xml für den LoadBalanceService angegeben wurde) vorhanden sein und angepasst werden.
Auf allen Nodes wird die gleiche Datei verwendet, d. h. Sie müssen diese nur einmal erstellen/anpassen und können diese dann einfach auf alle bestehenden Nodes kopieren.
<?
xml
version
=
"1.0"
encoding
=
"ISO-8859-1"
?>
<!DOCTYPE Configure PUBLIC "-//Lobster//DTD Configure 1.0//EN"
"
http://www.lobster.de/dtd/configure_1_1.dtd
">
<
Configure
class
=
"com.ebd.hub.services.ha.LoadBalanceService"
>
<!-- If loadbalance should be enabled -->
<
Set
name
=
"enableLoadbalance"
>true</
Set
>
<!-- If failover should be enabled -->
<
Set
name
=
"enableFailover"
>true</
Set
>
<
Set
type
=
"int"
name
=
"controllerRequestSize"
>10</
Set
>
<
Set
type
=
"long"
name
=
"controllerThreshold"
>5000</
Set
>
<!-- Should nodes try to reconnect after lost connection, interval in seconds -->
<
Set
name
=
"reconnectInterval"
>1</
Set
>
<!-- Should a failover be done by shutting down the node controller -->
<
Set
name
=
"failoverAtShutdown"
>false</
Set
>
<!-- Configure when emails should be send -->
<
Set
name
=
"emailByLogoff"
>false</
Set
>
<
Set
name
=
"emailByLogin"
>false</
Set
>
<
Set
name
=
"emailByLostConnection"
>false</
Set
>
<!-- Add more recipients to inform via email -->
<!-- <
Call
name
=
"addEmail"
><
Arg
></
Arg
></
Call
> -->
<!-- Use external proxy service instead of externalUrl -->
<!-- <
Call
name
=
"setProxySettings"
>
<
Arg
>localhost</
Arg
>
<
Arg
type
=
"long"
>500</
Arg
>
<
Arg
type
=
"long"
>100</
Arg
>
<
Arg
type
=
"int"
>9006</
Arg
>
</
Call
> -->
<!-- Behaviour like old externalUrl -->
<
Call
name
=
"setExternalUrl"
>
<
Arg
>
https://www.google.de
</
Arg
>
<!-- Timeout for Http-Request -->
<
Arg
type
=
"int"
>1000</
Arg
>
</
Call
>
<!-- Own node information -->
<
Call
name
=
"addNode"
>
<!-- Nodename (has to be unique in cluster) -->
<
Arg
>FactoryID</
Arg
>
<!-- Hostname (DNS, IPv4, IPv6) -->
<
Arg
>ip-address</
Arg
>
<!-- Retries before removing node from cluster -->
<
Arg
type
=
"int"
>3</
Arg
>
<!-- Timeout for a read in ms -->
<
Arg
type
=
"long"
>300</
Arg
>
<!-- Heartbeat intervall to nodes in ms -->
<
Arg
type
=
"long"
>100</
Arg
>
<!-- Port for failover handling -->
<
Arg
type
=
"int"
>2320</
Arg
>
<!-- Preferred role in cluster (MASTER, SLAVE) -->
<
Arg
>MASTER</
Arg
>
<!-- Message port for load balancing -->
<
Arg
type
=
"int"
>8020</
Arg
>
</
Call
>
<!-- Own node information -->
<
Call
name
=
"addNode"
>
<!-- Nodename (has to be unique in cluster) -->
<
Arg
>FactoryID2</
Arg
>
<!-- Hostname (DNS, IPv4, IPv6) -->
<
Arg
>ip-address</
Arg
>
<!-- Retries before removing node from cluster -->
<
Arg
type
=
"int"
>3</
Arg
>
<!-- Timeout for a read in ms -->
<
Arg
type
=
"long"
>300</
Arg
>
<!-- Heartbeat intervall to nodes in ms -->
<
Arg
type
=
"long"
>100</
Arg
>
<!-- Port for failover handling -->
<
Arg
type
=
"int"
>2320</
Arg
>
<!-- Preferred role in cluster (MASTER, SLAVE) -->
<
Arg
>SLAVE</
Arg
>
<!-- Message port for load balancing -->
<
Arg
type
=
"int"
>8020</
Arg
>
</
Call
>
</
Configure
>
Parameter |
Beschreibung |
enableLoadbalance |
Aktiviert das Load Balancing (und damit die Verteilung von Jobs). |
enableFailover |
Aktiviert das Failover (also die Übernahme der Rolle des Node Controller durch einen Working Node bei Verlust des aktuellen Node Controllers). |
controllerRequestSize |
Bevor eine Verteilung überhaupt stattfindet, kann man optional eine Anzahl von Jobs hinterlegen, die über den Node Controller abgearbeitet werden. Bei 0 wird sofort an verfügbare Working Nodes abdelegiert, mit z. B. 10 wird erst ab dem 11. aktiven, gleichzeitig laufenden Job abdelegiert. Siehe auch controllerThreshold. |
controllerThreshold |
Man kann controllerRequestSize noch weiter einschränken, indem man die durchschnittliche Laufzeit (der Statistik) hinzunimmt und z. B. mit 5000 nur Jobs mit einer Laufzeit kleiner 5000 ms in Betracht zieht. Hinweis: Dies kann zur Laufzeit im Control Center geändert werden! |
reconnectInterval |
Sollte eine Verbindung (Channel) zwischen zwei Nodes verloren gehen, versucht der Service, im angegeben Intervall (in Sekunden) diese wiederherzustellen (Self-healing). Hinweis: Alle Nodes (Node Controller und Working Nodes) sind mit allen anderen Nodes verbunden. Dabei gibt es zwischen zwei Nodes jeweils zwei Channels. Ein einzelner ausgefallener Channel führt dabei noch nicht zu einem Failover. Hinweis: Wir empfehlen das reconnectInterval auf die nächsthöhere Sekunde relativ zum Timeout zu setzen. |
failoverAtShutdown |
Legt fest, ob ein Failover ausgelöst werden soll, wenn ein Node Controller regulär heruntergefahren wird. |
emailByLogoff |
Legt fest, ob eine E-Mail versendet wird, wenn sich ein Node aus einem anderen Node ausloggt. Achtung: Führt zu einem erhöhtem E-Mail-Verkehr. Loggt sich ein Node aus einem bestehenden Verbund von drei Nodes aus, werden drei E-Mails versendet. |
emailByLogin |
Legt fest, ob eine E-Mail versendet wird, wenn sich ein Node in einen anderen Node einloggt. Achtung: Führt zu einem erhöhtem E-Mail-Verkehr. Loggt sich ein Node in einen bestehenden Verbund von drei Nodes ein, werden drei E-Mails versendet. |
emailByLostConnection |
Legt fest, ob eine E-Mail versendet wird, wenn die Verbindung zu einem Node abbricht. Achtung: Führt zu einem erhöhtem E-Mail-Verkehr. Bricht die Verbindung zu einem Node in einem Verbund ab, werden drei E-Mails versendet. |
addEmail |
Es können weitere E-Mail-Adressen hinzugefügt werden, die bei emailByLogoff, emailByLogin und emailByLostConnection benachrichtigt werden. Die Standard-E-Mail-Adresse wird aus der Konfigurationsdatei ./etc/startup.xml entnommen. |
setExternalUrl |
Wenn diese Einstellung gesetzt ist, wird beim Verlust des Node Controllers eine Prüfung auf die angegebene URL durchgeführt. Ist diese zu erreichen, nimmt der Working Node bei der Bestimmung des neuen Node Controllers teil ( Raft-Consensus-Algorithmus ). Wenn nicht, fährt sich der Working Node herunter. Des weiteren wird geprüft, ob andere Working Nodes erreichbar sind. Sollten diese erreichbar sein und noch den aktuellen Node Controller anpingen können, fährt sich der Working Node herunter. Hinweis: Siehe auch Parameter setProxySettings . |
setProxySettings |
Wird ein externer Proxy konfiguriert, dann wird die externe URL nicht verwendet. Mit einem externen Proxy kann ein Split Brain verhindert werden, er ist aber auch einen Single Point of Failure. Bitte wenden Sie sich an support@lobster.de für weitere Informationen oder eine Einrichtung. Hinweis: Wird keiner der Parameter setExternalUrl und setProxySettings verwendet, wird lediglich eine Erreichbarkeitsprüfung zwischen den Nodes durchgeführt und mit einem Failover oder einem Herunterfahren reagiert. |
addNode |
Für jeden im Cluster enthaltenen Node (Node Controller und Working Nodes) muss ein Eintrag erstellt werden. Argumente:
Nodename Hier muss der Wert des Parameters id in der Konfigurationsdatei ./etc/factory.xml des Nodes verwendet werden. Hostname URL oder IP des Nodes. Retries Anzahl der Heartbeat-Ping-Versuche, bevor der Failover ausgelöst wird. Timeout Die Wartezeit nach einem Heartbeat-Ping in Millisekunden. Heartbeat interval Das Heartbeat-Ping-Intervall in Millisekunden. Siehe auch Timeout und Retries. Failover port Der Port für den Failover-Mechanismus. Default: 2320 Preferred role Verwenden Sie den Wert MASTER für einen Node Controller und SLAVE für einen Working Node. In einem Cluster darf es nur einen Master geben. Die Anzahl der Slaves ist unbeschränkt. Message port for loadbalancing Der Port für den Load-Balancing-Mechanismus. Default: 8020 |