Un esempio di Load Balancing con Mod_jk

Il client di una Web Application comunica con essa tramite il protocollo HTTP. In un contesto clusterizzato in JBoss occorre un load balancer esterno per processare le richieste dei client ed eseguire il disptching sui vari nodi.

Il browser del client si collega solo al load balacer e non ha alcuna visione delle istanze di JBoss schierate nel cluster.

Sul mercato sono disponibili load balancer sia hardware che software, e nello sviluppo di questo progetto è stato utilizzato il modulo mod-jk per il Web Server Apache.

Un potenziale problema di questa architettura è che il load balancer di per sè può essere un punto critico: occorre monitorarlo costantemente per garantire alta affidabilità a tutto il servizio di cluster.

Il mod-jk per Apache permette di eseguire il load balancing delle chiamate HTTP a vari Servlet Container (rappresentati dai Web Container Tomcat dei nodi JBoss del cluster).

Dopo aver scaricato il modulo occorre rinominarlo in mod-jk.so ed inserirlo nella directory modules di Apache. Ora informiamo Apache di caricare al suo avvio il file di configurazione del mod-jk inserendo nel file /conf/httpd.conf il seguente codice:

Il file di configurazione mod-jk.conf è definito nel seguente modo:

La direttiva più importante è JkMount, che permettere di definire quali URL vanno passati al load balancer, in questo caso /rubWeb/. Se ad esempio il server Apache utilizza come porta principale la 8765 ed è attivo sulla macchina di indirizzo 192.168.1.10, il punto d’accesso alla nostra applicazione sarà quindi 192.168.1.10:8765/rubWeb/.

JkWorkersFile definisce quale worker file utilizzare. Un worker file definisce la locazione dei diversi Servlet Container e le modalità con cui effettuare il load balancing. Vediamo il workers.properties nel caso in cui due nodi JBoss e Apache stiano attivi sulla stessa macchina:

Ogni worker rappresenta un nodo e occorre definirne il nome, l’indirizzo e la porta per l’AJP13, il connector del Servlet Container. E’ anche possibile definire un grado di priorità tra i vari nodi mediante l’attributo lbfactor. La linea worker.loadbalancer.sticky-session=1 abilita la sticky session: con questa modalità un client utilizzerà sempre la stessa istanza di JBoss fino al termine della sessione HTTP.

Dopo aver configurato il mod-jk di Apache occorre configurare le istanze di JBoss per gestire le richieste passate dal load balancer. Nel file /server/all/deploy/jbossweb.sar/server.xml occorre aggiungere l’attributo jvmRoute contenente il nome del nodo definito al worker.properties nel seguete modo: