Die Nachfolgende Beschreibung zeigt wie ein Apache2 Webserver als Loadbalancer fuer zwei oder mehr Tomcats zu konfigurieren ist. Die Beschreibung bezieht sich wieder auf einen Linux Debian 4.1.X Server mit 2.6.X Kernel, auf dem ein apache2 Webserver, Tomcat 6.0.16 und Java 5.0 installiert und betriebsbereit ist.
Die folgende Graphik veranschaulicht die Systemarchitektur die aufgebaut werden soll.

Wie der Apache2 Webserver mit dem Tomcat ueber das mod_jk Modul verbunden wird, habe ich bereits in einem vorhergehenden Blogeintrag beschrieben. Darauf werde ich hier nicht mehr eingehen.
apache2 + tomcat 6 + mod_jk
Ein Loadbalancer macht nur Sinn wenn mehr als ein Tomcat die gleiche Applikation ausliefert. Der Loadbalancer kann die Last auch zwischen 2 Tomcats verteilen die auf unterschiedlichen Maschinen laufen. Wie zwei oder mehr Tomcats auf der selben Maschine eingerichtet werden, zeigt der folgende Blogeintrag:
N Tomcats auf einer Maschine
Wenn Sie die zwei oberen Blogeintraege gelesen und verstanden haben, dann ist es nur noch ein kleiner Schritt zum Loadbalancer. Als erstes muss die /etc/apache2/workers.properties angepasst werden. Hier ist ein Bespiel:
# Tomcat an Java configuration # workers.tomcat_home=/opt/tomcat/ workers.java_home=/opt/java/ ps=/ worker.list=loadbalancer worker.mainworker.type=ajp13 worker.mainworker.port=8009 worker.mainworker.cachesize=20 worker.mainworker.lbfactor=1 worker.mainworker.host=localhost worker.tomcat2.type=ajp13 worker.tomcat2.port=8010 worker.tomcat2.cachesize=20 worker.tomcat2.lbfactor=1 worker.tomcat2.host=localhost worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=mainworker,tomcat2 worker.loadbalancer.method=Session
Die worker.list verweist auf den worker “loadbalancer”, welcher vom Typ “lb” (loadbalancing) ist und auf die zwei worker “mainworker” und “tomcat2” verweist. Der lbfactor gibt an wieviel Last ein worker uebernehmen soll. Wenn der mainworker einen lbfactor von 5 haette und der “tomcat2” nur einen von 1, dann wuerde der “mainworker” fuenf mal soviele Anfragen zugewiesen bekommen wie der “tomcat2”.
Eine vollstaendige Dokumentation des workers ist hier zu finden:
http://tomcat.apache.org/connectors-doc/reference/workers.html
Die worker Namen “mainworker” und “tomcat2” muessen natuerlich in den jeweiligen <tomcat>/conf/server.xml Dateien zu finden sein. Der eine Tomcat muss dafuer folgende Zeile in seiner server.xml enthalten:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2" >
und der andere dementsprechend die Zeile:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="mainworker" >
Zum Schluss muss noch in der Datei /etc/apache2/sites-enabled/000-default der JkMount-Eintrag auf die gewuenschte Applikation angepasst werden:
JkMount /testApp loadbalancer
Wenn alles korrekt konfiguriert ist kann die Applikation durch folgende URL augerufen werden:
http://localhost/testApp/
Der Apache Webserver wird die Anfrage an eines der zwei Tomcats weiterleiten. Wenn der eine Tomcat runtergefahren wird, ist die Applikation immer noch auf dem zweiten Tomcat verfuegbar. Der Webserver leitet dann alle Anfragen automatisch an den einzig noch verbliebenen Tomcat, so das der Benutzer davon nichts mitkriegt.
Auf diese Art und Weise koennen Applikation ausfallsicherer gemacht werden.
One thought on “Loadbalancing mit Apache2 + Tomcat 6 + mod_jk”