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.

Apache für Railo unter JBOSS einrichten

Modul Kommunikation

Wie Railo unter JBOSS installiert wird habe ich bereits beschrieben.
Für viele ist interessant wie JBOSS mit dem Apache verbunden wird.

Einige Module müssen miteinander kommunizieren. Schematisich sieht
das so aus wie im nebenstehenden Bild dargestellt.  Was dafür alles
zu tun ist beschreibe ich hier.

Voraussetzungen:

1. Umgebung
Ihr benötigt eine lauffähige Railo (ich verwende 3.0.0.6) Installation unter JBOSS,
und einen installierten Apache Webserver.

2. benötigte Software
Den Apache Webserver gibts zum Download unter: http://httpd.apache.org
Den Connector MOD_JK gibts unter: http://tomcat.apache.org/download-connectors.cgi

3. Installation / Configuration
Ich habe die Installation unter Windows duchgeführt.
Meine JBOSS (Railo) Installation liegt im Ordner c:\JBOSS\ und mein
Apache Webserver liegt unter C:\APACHE;

Ladet euch den MOD_JK Connector runter (wählt die passende Version -
für mich ist die richtige Version mod_jk-1.2.26-httpd-2.0.59.so)
und kopiert die Datei in das C:\APACHE\modules Verzeichnis.
Benennt die Datei um in mod_jk.so

Mehr Software wird nicht benötigt. Jetzt gehts an die Konfiguration:

3.1 Konfiguration Apache

Öffnet die Apache Config Datei httpd.conf im Ordner c:\APACHE\conf\
Sucht den Block in denen die loadModules Anweisungen stehen und fügt folgende Zeile hinzu:

# JBOSS Connector
LoadModule jk_module modules/mod_jk.so

Geht an das Ende der httpd.conf Datei und fügt folgenden Eintrag hinzu:

# Include mod_jk configuration file
Include conf/mod_jk.conf

Speichert die Datei ab.
3.2 Konfiguration Connector

Geht wieder in das Verzeichnis c:\APACHE\CONF und legt dort eine Datei mit dem
Namen mod_jk.conf an. Öffnet diese und kopiert folgenden Inhalt hinein.

# Where to find workers.properties
JkWorkersFile conf/worker.properties

# Where to put jk logs
JkLogFile logs/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel info

# Select the log format
JkLogStampFormat “[%a %b %d %H:%M:%S %Y]“

# JkOptions indicates to send SSK KEY SIZE
# Note: Changed from +ForwardURICompat.
# See
http://tomcat.apache.org/security-jk.html
JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories

# JkRequestLogFormat
JkRequestLogFormat “%w %V %T”

# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties

# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
# Note: Replaced JkShmFile logs/jk.shm due to SELinux issues. Refer to
#
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=225452
JkShmFile run/jk.shm

Der Inhalt gibt folgende Anweisungen:
- Da der MOD_JK als Software Loadbalancer arbeiten kann wird über die JSWOrkersFile conf/properties Anweisung ein Verweis auf die Konfigurations
Datei der Worker gegeben
- Die Anweisung JKLogFile konfiguriert wohin die Logfiles des Connectors gespeichert werden sollen
- JKLogLevel spezifiert die Logdetailierung
- JKLogStampFormat steuert die Benennung des Logfiles
- JKRequestLogFormat steuert den Inhaltlichen Aufbau des Logfiles
- Über JKMountFile wird das Mapping für die JBOSS Anwendungen definiert.
Speichert die Datei ab.
3.3 Konfiguration Worker

Erstellt im C:\APACHE\CONF Verzeichnis eine neue Datei mit dem Namen worker.properties
Öffnet die Datei und kopiert folgenden Inhalt hinein:

worker.list=node1

# Define Node1# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=localhost
worker.node1.type=ajp13
worker.node1.lbfactor=1

Da ich aktuell nur eine JBOSS Instanz installiert habe steht bei mir nur ein Worker.
In dieser Datei könnte ich mehrere Worker definieren und auch ein Loadbalancing konfigurieren.
Der Worker versucht mit JBOSS über AJP auf dem Port 8009 zu kommunizieren.

Speichert die Datei ab.
3.4 Konfiguration Application Mapping

Erstellt im C:\APACHE\CONF Verzeichnis eine neue Datei mit dem Namen uriworkermap.properties
Öffnet die Datei und kopiert folgenden Inhalt hinein

# Mount your applications
/jmx-console=node1
/jmx-console/*=node1
/web-console=node1
/web-console/*=node1
/railo=node1
/railo/*=node1

WICHTIG: Überprüft die application.xml Datei im META-INF Verzeichnis von RAILO
(bei mir: C:\JBOSS\server\default\deploy\railo.ear\META-INF\application.xml ob
dort im <context-root>/railo</context-root>
steht.

Speichert die Datei. Der Apache ist jetzt fertig konfiguriert. Jetzt müssen wir nur noch
ein paar Anpassungen an JBOSS durchführen.
3.5 Konfiguration JBOSS (bei mir 4.2.2GA)

Geht in euer JBOSS Server Deployment Verzeichnis. Bei mir ist das C:\JBOSS\server\default\deploy\
Im Deploy Ordner gibt es ein Unterverzeichnis jboss-web.deployer in dem der JBOSS integrierte Webserver installiert ist.
Diesen müssen wir jetzt deaktivieren, bzw. auf AJP einstellen.
Geht also ins Verzeichnis C:\JBOSS\server\default\deploy\jboss-web.deployer\ und öffnet dort die Datei server.xml.
Kommentiert folgende Zeilen aus:

<!– Das ist der Default Webserver Port (HTTP) auf den JBOSS reagiert
<Connector port=”8080″ address=”${jboss.bind.address}”
maxThreads=”250″ maxHttpHeaderSize=”8192″
emptySessionPath=”true” protocol=”HTTP/1.1″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” /> –>

als nächstes den HTTPS Port (falls der aktiviert ist)

<!–
<Connector port=”8443″ protocol=”HTTP/1.1″ SSLEnabled=”true”
maxThreads=”150″ scheme=”https” secure=”true”
clientAuth=”false” keystoreFile=”${jboss.server.home.dir}/conf/ssl.keystore”
keystorePass=”mypassword” keyAlias=”testkey1″
sslProtocol=”TLS”  />
–>

Sucht nun nach nachfolgenden Zeilen und stellt sicher, dass diese nicht auskommentiert sind.
Das ist der AJP Connector Port den wir auch im Apache eingestellt haben

<Connector port=”8009″ address=”${jboss.bind.address}” protocol=”AJP/1.3″
emptySessionPath=”true” enableLookups=”false” redirectPort=”8443″ />

<Engine name=”jboss.web” defaultHost=”node1″>
Speichern - fertig, fast –> JBOSS neu starten. Apache neu starten.

Jetzt sollte der Apache als Webserver eingerichtet sein.

Passwort vergessen :(

Irgendwie habe ich das Passwort für meinen Railo 3 Community Edition vergessen. Die spannende Frage war für mich, wie kann ich das wieder zurücksetzen. Ein wenig googlen und die Lösung ist da.

Im Railo Install Folder nach der Datei railo-server.xml suchen. Diese öffnen und nach einemEintrag
<railo-configuration password=”xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx” version=”2.0″>
suchen.

Um das Passwort zurückzusetzen muss einfach das komplette Attribut password=”….” entfernt werden.
<railo-configuration version=”2.0″>

Die Datei speichern und den Railo Admin starten. Es wird zum Eingeben eines neuen Passworts aufgefordert.

Einfacher gehts nicht ;)

Installation Railo 3.0 in JBoss 4.2.2

In einer Demonstration muss ich heute Railo in Verbindung mit JBoss vorführen. Da ich gerade keinen anderen Rechner als mein Notebook frei zur Verfügung habe installiere ich also die komplette Konfiguration auf Windows XP.

Ich besorge mir als erstes alle benötigten Softwarekomponenten:

1.  JBoss 4.2.2 - Download unter: http://www.jboss.org/jbossas/downloads/
2.  Java 1.6 Update X JRE oder JDK - Download unter: http://java.sun.com/javase/downloads/?intcmp=1281
3.  Railo 3.0 WAR  - Download unter: http://www.railo-technologies.com/en/index.cfm?treeID=361

Alle Komponenten aus dem Netz gezogen? Dann kanns losgehen:

1. Installation Java 1.6 JRE oder JDK
Wichtig ist, dass die Umgebungsvariable JAVA_HOME auf das Installationsverzeichnis der 1.6 verweist. Die Umgebungsvariablen könnt Ihr einstellen unter: Rechtsklick Arbeitsplatz -> Eigenschaften -> Lasche Erweitert -> Umgebungsvariablen. Bei mir steht dann folgender Eintrag drin.  JAVA_HOME = C:\Program Files\Java\jdk1.6.0_07\jre (Ich habe die JDK installiert)

2. Installation JBoss
Die Installation von JBoss ist total einfach. Einfach das Zip File nehmen und in einen beliebigen Ordner entpacken. ( Ich habe das Zip-File nach c:\JBoss_4.2.2 enpackt.)

3. Installation Railo
Geht in das Installationsverzeichnis von JBoss. Dort sind im Verzeichnis server drei Konfigurationen zu finden: all, minimal, default. Ich nutze für mich die default Konfiguration von JBoss, deshalb gehe ich in diesen Ordner. Darunter ist ein Verzeichnis deploy zu finden. Unter dem Ordner deploy, lege ich ein Verzeichnis mit dem Namen railo.ear an.

In diesem Verzeichnis lege ich das Railo Webarchiv (war-file) ab und bennene es in railo.zip um, welches ich anschließend in ein Verzeichnis railo.war ebenfalls im Ordner railo.ear entpacke. Das ZIP File benötigen wir jetzt nicht mehr und können es löschen.

Jetzt fehlt nur noch der Verzeichnis META-INF unterhalb des Ordners railo.ear. Legt dieses an und geht anschließend in dieses Verzeichnis. Legt dort eine Datei mit dem Namen application.xml an.
Editiert diese Datei und kopiert folgenden Inhalt rein.

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE application PUBLIC “-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN” “http://java.sun.com/j2ee/dtds/application_1_2.dtd“>
<application id=”RailoInstance1″>
 <display-name>Railo3</display-name>
 <description>Railo3</description>
 <module id=”Module1″>
 <web>
  <web-uri>railo.war</web-uri>
  <context-root>/railo</context-root>
 </web>
 </module>
</application>

Speichert die Datei. Railo ist jetzt fertig in JBoss konfiguriert.

Das ganze hat jetzt folgende Ordnerstruktur:
JBOSS_4.2.2
JBOSS_4.2.2–server
JBOSS_4.2.2–server–default
JBOSS_4.2.2–server–default–deploy
JBOSS_4.2.2–server–default–deploy–railo.ear
JBOSS_4.2.2–server–default–deploy–railo.ear–META-INF
JBOSS_4.2.2–server–default–deploy–railo.ear–META-INF–application.xml
JBOSS_4.2.2–server–default–deploy–railo.ear–railo.war
JBOSS_4.2.2–server–default–deploy–railo.ear–railo.war–Files from WAR (WEB-INF…)

4. Start von JBoss
Geht in den Order JBOSS 4.2.2/bin und führt die Datei run.bat aus. JBoss startet jetzt und sollte dann folgende Meldung anzeigen:

11:01:16,203 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBos
s_4_2_2_GA date=200710221139)] Started in 38s:16ms

5. Test der Installation
Wenn alles richtig funktioniert hat müsste Railo unter http://localhost:8080/railo ansprechbar sein.