JAVA,  System Administration

Load balancing con Apache 2.x e Tomcat 4.x

Per ottimizzare l’utilizzo della memoria da parte di Tomcat, nei casi in cui deve gestire applicazioni di un certo peso, è possibile configurare più servlet container Tomcat in regime di Load Balancing, utilizzando un web server Apache 2 che funge da load balancer, effettuando il dispatching delle richieste ai diversi servlet container in base al peso assegnato a ciscuno di essi.

Tale pratica consente la distribuzione del carico elaborativo su più JVM, migliorando le performance generali delle applicazioni, abbassandone di conseguenza i tempi di risposta.

Vediamo in sequenza i passi per ottenere quanto descritto, considerando che il carico verrà bilanciato su due servlet container Tomcat 4.x:

Passo 1: Download del software necessario

Passo 2: Installazione del software

Per le procedure di installazione di Apache 2.x e Tomcat 4.x seguire le indicazioni fornite nella documentazione ufficiale, mentre il modulo mod_jk-2.0.42.so va rinominato in mod_jk.so e copiato nella directory modules presente nella root di installazione di Apache 2.

Passo 3: Configurazione di Apache 2.x

Aprire il file httpd.conf contenuto nella directory conf di Apache 2.x, ed aggiungere le seguenti linee, subito dopo l’ultimo LoadModule :

#
# Load mod_jk
#
LoadModule jk_module modules/mod_jk.so
#
# Configure mod_jk
#
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info

Inserire sotto la linea relativa alla DocumentRoot, le seguenti linee:

JkMount /*.jsp loadbalancer
JkMount /servlet/* loadbalancer

Creare un file workers.properties, sempre nella directory conf di Apache 2.x, questo file in pratica elenca i vari Tomcat su cui verrà bilanciato il carico di lavoro e su quali porte Apache 2.x attraverso il mod_jk comunicherà con essi:

#
# workers.properties
#
# In Unix, we use forward slashes:
ps=/
# list the workers by name
worker.list=tomcat1, tomcat2, loadbalancer
# ------------------------
# First tomcat server
# ------------------------
worker.tomcat1.port=11009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
# Specify the size of the open connection cache.
#worker.tomcat1.cachesize
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
# ----> lbfactor must be > 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat1.lbfactor=100
# ------------------------
# Second tomcat server
# ------------------------
worker.tomcat2.port=12009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
# Specify the size of the open connection cache.
#worker.tomcat2.cachesize
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
# ---->; lbfactor must be >; 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat2.lbfactor=100
# ------------------------
# Load Balancer worker
# ------------------------
#
# The loadbalancer (type lb) worker performs weighted round-robin
# load balancing with sticky sessions.
# Note:
# ----> If a worker dies, the load balancer will check its state
# once in a while. Until then all work is redirected to peer
# worker.
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1, tomcat2
#
# END workers.properties
#

Passo 4: Configurazione di Tomcat 4.x

Aprire il file server.xml presente nella directory conf di Tomcat 4.x ed effettuare le seguenti modifiche:

Modificare la linea:

<Engine name="Standalone" defaultHost="localhost" debug="0">

in:

<Engine jvmRoute="tomcat1" name="Standalone" defaultHost="localhost" debug="0">

per il secondo Tomcat specificare “tomcat2″ per il parametro jvmRoute.

Modificare l’attributo:

<Server port="8005"

in

<Server port="11005"

per il secondo Tomcat specificare la porta 12005
Modificare poi la porta del connettore AJP13, da:

port="8009"

in:

port="11009"

per il secondo Tomcat, specificare la porta 12009
queste impostazioni rispecchiano ciò che è stato indicato nel file workers.properties visto in precedenza
Se non si desidera che i due Tomcat possano essere utilizzati direttamente, è necessario disabilitare il loro connector HTTP commentando il blocco XML:

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<!--
<Connector className="org.apache.catalina.connector.http.HttpConnector" port="8080" 
       minProcesssors="5" maxProcessors="75" enableLookups="true" redirectPort="8443" 
       acceptCount="10" debug="0" connectionTimeout="60000"/>
-->

Se si decide di non commentare questa parte è necessario modificare l’attributo port per uno dei due Tomcat o per tutti e due indicando ad esempio per il primo Tomcat

port="11080"

e per il secondo Tomcat

port="12080"

Passo 5: Avvio dei servizi nel corretto ordine

Avviare nella sequenza riportata i servizi:

  1. Tomcat 4.x n.1
  2. Tomcat 4.2 n.2
  3. Apache 2.x

Conclusioni

Il load balancing funziona grazie al meccanismo del session affinity, (opzione jvmRoute di Tomcat) che consente, dopo la prima richiesta di continuare ad inoltrare le successive richieste del browser allo stesso Tomcat per non perdere le informazioni create in sessione e gestite dal servlet container che ha risposto appunto alla richiesta iniziale di un browser.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *