Mehre Instanzen von JBOSS (Railo) auf einem Rechner mit Loadbalancing installieren
Ich bin gerade auf der Fähre von Griechenland nach Italien. 21 Stunden Reisedauer ist doch genau die richtige Zeitspanne um Railo mal in einer Loadbalancer Konfiguration auszuprobieren.
Ich habe eine Anwendung die einfach geradezu ressourcenfressend ist. 2 GB Arbeitsspeicher ist schnell aufgebraucht. Es wird ständig über http Postingtargets kommuniziert, so dass extrem lange Page Request Zeiten auftreten können. Wenn der Server aussreichend Arbeitsspeicher sowie aussreichend Prozessorzeit zur Verfügung hat muss man nicht zwingend gleich ein extra Stück Hardware kaufen.
Eine einfache Möglichkeit besteht darin eine erneute JBOSS Server Instanz zu installieren und einen vertikalen Cluster über Loadbalancing mit Sticky Sessions einzurichten.
Der Webserver verteilt einfach eingehende Anfragen an die einzelnen Clusterknoten. Mit Sticky Sessions bleibt der Anwender dann auf dem zugeteilten JBOSS Server „kleben“.
Beispiel mit einem vertikalen Cluster und 2 Knoten:
Benutzer 1 -> Server 1; Benutzer 2 -> Server 2; Benutzer 3 -> Server 1; Benutzer 4 -> Server 2, usw.
In meinem Fall ist Server1 und Server 2 auf der gleichen Hardware untergebracht. Selbstverständlich würde das auch auf zwei getrennten Maschinen funktionieren.
Voraussetzungen:
Ihr habt einen lauffähigen Apache Webserver konfiguriert, der bereits mit einem JBOSS Server verbunden ist. Wenn Ihr das noch nicht habt, dann schaut in einem früheren Blog Eintrag von mir nach, da habe ich das ebenfalls beschrieben.
Konfiguration
1. Netzwerk
Die Konfiguration ist spielend einfach, wenn man einen ganz wichtigen Punkt beachtet.
Jede JBOSS Instanz sollte eine eigene IP Adresse besitzen. Wenn euch auf eurem Server nur eine IP-Adresse zur Verfügung steht, dann besorgt euch unbedingt eine weitere oder soviele wie Ihr benötigt (vielleicht möchtet Ihr ja gleich eine 4 Wege Cluster bauen ;) ) .
Ich habe versucht JBOSS so zu konfigurieren, dass dieser mit einer IP-Adresse klar kommt was auch funktioniert hat, jedoch ist das dermaßen aufwendig, das ich nur davon abraten kann.
Wie immer verwende ich einen Windows 2003 Enterprise Server. In den Netzwerkadaptereigenschaften füge ich unter den TCPIP-Einstellungen die zusätzlich benötigte Netzwerkadresse ein.
Mein Server reagiert jetzt auf die IP-Adressen 192.168.1.1 und 192.168.1.2
2. JBOSS Server Konfiguration
Nehmt nun eure JBOSS Server Konfiguration, die sich im Verzeichnis servers unterhalb des JBOSS Installationspfad befindet und kopiert bzw. dupliziert die gewünschte Konfguration.
Mein erster Server liegt im Ordner C:\JBOSS\servers\default\. diesen habe ich kopiert in den Ordner C:\JBOSS\servers\default2\.
So jetzt müssen wir in der neu angelegten Serverkonfiguration noch eine Änderung vornehmen. Geht in das Verzeichnis C:\JBOSS\servers\default2\ jboss-web.deployer\.
Und öffnet die Datei server.xml. Sucht nach dem Eintrag
<Engine name=”jboss.web” defaultHost=”localhost” jvmRoute=”node1″>
Und ändert die jvmRoute=“node1“ auf node2 ab.
Dieser Schritt ist äußerst wichtig, wenn Loadbalancing mit Sticky Sessions implementiert wird. Der Inhalt dieses Eintrags wird per Cookie an den Client gesendet. Wenn der Connector Loadbalancing aktiviert hat wird der Inhalt dieses Cookies verwendet um den Benutzer wieder an den korrekten Server weiterzuleiten.
3. JBOSS Server Startskript
Wir müssen uns jetzt darum kümmern, dass die Server auch die richtigen IP-Adressen verwenden. Geht dazu in das binVerzeichnis eurer JBOSS Installation. Bei mir ist das c:\JBOSS\bin\. Dort legt Ihr eine Datei startnode1.bat an. In diese schreibt Ihr folgendes Kommando. Run.bat –c default –b 192.168.1.1. Nun legt Ihr eine zweite Datei mit dem namen startnode2.bat an. In diese wird folgendes Kommando geschrieben. Run.bat –c default2 –b 192.168.1.2. ersetzt bitte die IP-Adressen und die Servernamen von JBOSS so dass diese bei euch passen. Führt doch die beiden Batch-Skripte gleich aus, dann starten die Server mit identischer Konfiguration durch und warten auf Anfragen von Apache.
4. Apache Connector einrichten
Ich schließe hier an meinen vorhergehenden Blog Eintrag an (JBOSS mit Apache verbinden).
Geht in das Apache conf Verzeichnis (hier C:\APACHE\conf\. Öffnet die Datei worker.properties. Die müsste etwa so aussehen:
worker.list=node1
worker.node1.port=8009
worker.node1.host=192.168.1.1
worker.node1.type=ajp13
worker.node1.lbfactor=1
Fügt einfach einen weiteren Block für einen Worker hinzu und verändert die Workerlist in der ersten Zeile auf den Wert loadbalancer
worker.list=loadbalancer
worker.node1.port=8009
worker.node1.host=192.168.1.1
worker.node1.type=ajp13
worker.node1.lbfactor=1
worker.node2.port=8009
worker.node2.host=192.168.1.2
worker.node2..type=ajp13
worker.node2.lbfactor=1
Jetzt brauchen wir noch einen Konfigurationsblock der den Loadbalancer definiert.
# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
Mit dieser Konfiguration haben wir einen Loadbalancer konfiguriert, der über 2 Knoten ein gewichtetes Round-Roubin mit Sticky Sessions vornimmt.
Die lbfactor Anweisung in den workern definiert die Gewichtung für den einzelnen Knoten.
Ist der Wert von Sticky_session in der loadbalancer Konfiguration auf 0 gesetzt, werden die eingehenden Anfragen konsequent auf beide Knoten verteilt.
5. Anwendungen mappen
Wir haben Netzeinstellungen vorgenommen, in JBOSS Änderungen an der Konfiguration durchgeführt, im mod_jk den Loadbalancer definiert. Es fehlt nur noch das Mapping der Anwendungen auf den Loadbalancer. Das wollen wir jetzt tun. Geht in den Apache Konfigurationsordner C:\APACHE\conf und öffnet die Datei uriworkermap.properties.
Ändert für die Anwendungen die Ihr auf dem Loadbalancer betreiben wollt das entsprechende Mapping:
# Mount your applications
/=loadbalancer
/*=loadbalancer
/railo=loadbalancer
/railo/*=loadbalancer
/yourapp2=node1
/yourapp2/*=node1
War doch ein wenig umfangreicher als ich ursprünglich gedacht habe. Ich glaub ich versuche die Tage gleich noch einen Railo Fail Over Cluster unter JBOSS zum Laufen zu bringen. Ich hoffe das interessiert den einen oder andern von euch.


