Glassfish Cluster: LoadBalancer with Apache

Glassfish Cluster: LoadBalancer with Apache
G.Morreale

Introduzione:

Il loadbalancer, ha il compito di ripartire il traffico tra i diversi nodi del cluster.

La ripartizione del carico tra i vari nodi del cluster può essere realizzata in diversi modi:
LVS, mod_jk, plugin di glassfish, Rewrite Rule su Apache, usando dell'hardware dedicato etc. etc.
L'obiettivo è comunque quello di interrogare i diversi nodi secondo un determinato algoritmo in modo da caricare i vari nodi secondo le esigenze del sistema.

Nei passi successivi si fà riferimento alla configurazione di un LoadBalancer che sfrutta il plugin di glassfish che considera come ripartitore di traffico il webserver apache.

Usare la soluzione "plug-in" comparta i seguenti vantaggi:

- Integrazione con l'application server
- Possibilità di configurazione di loadbalancing direttamente da admin console:
- Sistema di integrato di Health Checking, il modulo infatti determina se un istanza non è in grado di rispondere al fine di eliminarla dal processo di ripartizione di carico.


- Configurazione dell'algoritmo di ripartizione del carico, con possibilità di caricare un modulo user-defined.

- Configurazione automatica del modulo di balancing, il plugin consente di esportare automaticamente o manualmente il file di configurazione per il modulo in modo da metterlo a corrente, anche in real-time, sulla struttura del cluster (ad es. aggiunta o eliminazione dei nodi).


Premessa:

La comunicazione tra il webserver che agisce da loadbalancer e il DAS avviene tramite SSL.
E' necessario quindi abilitare sul server apache il supporto per SSL.

Il plugin per glassfish considerato è compatibile con apache 2.0.x(versione 32 bit),
quindi non usare la più recente 2.2 o successive.

I passi da eseguire si dividono nelle seguenti macro-operazioni:

  • Installare e Configurare Apache con supporto SSL
  • Installare il plugin e configurare Apache affinchè comunichi con il plugin
  • Creare e abilitare il plugin all'interno del DAS


Installare e Configurare Apache con supporto SSL

I seguenti passi si riferiscono alla piattaforma Windows:
Per Linux o Solaris è possibile seguire una delle molteplici guide sul web o in alternativa consultare la guida fornita dalla sun

Scaricare una versione di Apache con openssl:

  • Abilitare il modulo su httpd.conf togliendo il commento '#'

LoadModule ssl_module modules/mod_ssl.so


  • Assicurarsi dell'esistenza in httpd.conf delle seguenti righe

<IfModule mod_ssl.c>
   Include conf/ssl.conf
</IfModule>


  • Generare il certificato e la chiave per apache

%ApacheDIR%bin openssl.exe req -new -x509 -keyout newreq.pem -out newreq.pem -days 365 -config "%ApacheDIR%confopenssl
.cnf"
(sostituire opportunamente la path per il file openssl.cnf usato)
nota: la generazione del certificato crea dei problemi con la variabile di ambiente che indica la locazione della configurazione openssl, meglio usare lo switch -config come nell'esempio.


ATTENZIONE: il common name richiesto deve corrispondere all'hostname usato su apache. Tale valore corrisponderà poi durante la configurazione del plug in su glassfish al device host.


  • Aprire con un editor di testo il file newreq.pem

  • copiare la porzione che và da 

-----BEGIN CERTIFICATE----- 
a
-----END CERTIFICATE-----

nel file %ApacheDIR%/conf/ssl.crt/server.crt

copiare invece la porzione che và da 
-----BEGIN RSA PRIVATE KEY----- 
a
-----END RSA PRIVATE KEY-----

nel file %ApacheDIR%/conf/ssl.key/server.key


Nota: Se è stata immessa una passphrase durante la generazione della chiave, il file server.key avrà una versione crittografata della chiave. Apache dovrebbe quindi mostrare durante l'avvio una finestra di dialogo per la digitazione della passphrase.
Tale finestra di dialogo NON è supportata in windows, quindi bisogna eliminare la passphrase dalla chiave con il seguente comando:

%ApacheDIR%/bin/openssl rsa -in server.key -out serverNoPhrase.key

Il serverNoPhrase.key ottenuto è senza passaphrase. Assicurarsi che nel file ssl.conf si punti a tale file piuttosto che a quello crittografato oppure ricopiare serverNoPhrase.key in server.key e cancellare serverNoPhrase.key.
.

  • Avviare Apache in SSL mode. In windows il comando è il seguente:
apache -D SSL

  • Testare il funzionamento di apache ssl con il browser non dimenticando di usare https.

ATTENZIONE: Ci potrebbero essere dei conflitti nell'uso delle porte tra glassfish e apache.
Leggendo i log (error.log in apache) o (server.log in glassfish) identificare il conflitto e operare di conseguenza.



Installare il plugin e configurare Apache affinchè comunichi con il plugin

  • Scaricare il plugin dai seguenti link: 

SOLARISX86    http://download.java.net/javaee5/external/SunOS_X86/aslb/jars/aslb-9.1-MS4-b1.jar
SOLARIS       http://download.java.net/javaee5/external/SunOS/aslb/jars/aslb-9.1-MS4-b1.jar
WINDOWS     http://download.java.net/javaee5/external/WINNT/aslb/jars/aslb-9.1-MS4-b1.jar
LINUX            http://download.java.net/javaee5/external/Linux/aslb/jars/aslb-9.1-MS4-b1.jar

nota: navigare su http://download.java.net/javaee5/external/ per ricercare eventuali versioni più recenti o altre piattaforme supportate

In questa configurazione è stato utilizzato "aslb-9.1-MS4-b7.jar"

  • Scompattare il file .jar usando il comando jar -xvf nomefile.jar o utilizzando un archiver come WinRar.
  • I file zip ottenuti (SUNWaslb.zip e SUNWaspx.zip) devono essere scompattati all'interno della cartella lib/lbplugin dell'application server
quindi creare la cartella "lbplugin" su %GLASSFISH_HOME/lib/ e scompattare il contenuto all'interno dei due file .zip

nota: in linux assegnare i permessi con il comando: chmod -R 755 <GLASSFISH_HOME>/lib/lbplugin/lib

  • Copiare il file mod_balancer.dll presente in <GLASSFISH_HOME>/lib/lbplugin/lib/webserver-plugin/windows/apache2/
all'interno della directory modules di Apache.

  • Creare e copiare all'interno di %ApacheDir%/modules/resource i file .res presenti in <GLASSFISH_HOME>/lib/lbplugin/lib/webserver-plugin/windows/apache2/

  • Creare e copiare all'interno di %ApacheDir%/modules/errorpages i file presenti in <GLASSFISH_HOME>/lib/lbplugin/lib/webserver-plugin/windows/apache2/errorpages

  • Creare e copiare all'interno di %ApacheDir%/sec_db_files i file .db presenti in <GLASSFISH_HOME>/lib/lbplugin/lib/webserver-plugin/windows/apache2/

  • Copiare all'interno di %ApacheDir%/conf il file loadbalancer.xml.example presente in <GLASSFISH_HOME>/lib/lbplugin/lib/install/templates/loadbalancer.xml.example 
e rinominarlo loadbalancer.xml

  • Riavviare Apache in modalità SSL



Creare e abilitare il plugin all'interno del DAS

E' consigliabile in questa fase del setup aprire delle console in grado di leggere in tempo reale i contenuti dei file di errori dei log (server.log per glassfish e error.log per apache, inoltre nel caso del cluster leggere non solo il server.log del dominio ma anche quello di nodi e istanze varie)

Effettuare il login sull'admin console del DAS, posizionarsi sull'icona HTTP Load Balancers e Cliccare su New per creare un nuovo riferimento al load balancer.


  • Scegliere un nome per il load balancer, ad esempio apacheLB
  • Indicare come Device Host, l'hostname di apache lo stesso presente nella configurazione ssl.conf, lo stesso digitato nel common name durante la creazione del file newreq.pem (certificato + chiave)
  • Indicare come Devce Admin Port, il numero di porta ssl di apache (di default è 443)
  • Selezionare il corretto target in modo che il loadbalancer punti sul cluster
  • Il checkbox Automatically Apply Changes può essere selezionato se si vuole notificare automaticamente al modulo di balancing di apache riguardo ai cambiamenti di struttura del cluster (es. aggiunta o eliminazione di nodi istanza)
  • Dopo il salvataggio testare la configurazione selezionando apacheLB e cliccando su Test Connection

Nota: Nella sezione Export del LoadBalancer esiste la possibilità di esportare il file di configurazione loadbalancer.xml necessario al modulo di balancing di apache o modificarlo direttamente cliccando su "Apply Changes Now".
Riguardo la generazione automatica del file xml sulla directory di apache su linux bisogna settare correttamente i vari permessi.

Accertarsi inoltre che le istanze all'interno del cluster abbiano abilitato il load balancing (Cliccare sul "Enable Load Balancing" come da immagine)

Il Plug In è configurato.

Installare un applicazione su cluster e verificare dal browser se risponde uno dei nodi richiamando

http://apache_hostname/path_applicazione_cluster

Nota: la configurazione che è stata realizzata usa SSL per la comunicazione tra DAS e apache, Il load balancing invece avviene usando il normale protocollo http.

Possibili Problemi

Provando a inoltrare richieste ripetute verso il loadbalancer si potrebbero verificare i seguenti errori (vedi error.log di apache)

[warn] lb.runtime: RNTM2024: Daemon http://MOBISERVER:38081 is unhealthy.
[warn] lb.runtime: RNTM2030: Daemon Monitor : http://MOBISERVER:38081 : could be because daemon is down
[warn] lb.runtime: RNTM2025: Daemon http://mobipc:38080 is healthy.
[warn] lb.runtime: RNTM2025: Daemon http://mobipc:38080 is healthy.
[warn] lb.runtime: RNTM2025: Daemon http://mobipc:38080 is healthy.
[warn] lb.healthchecker: HLCK3003: Listener: http://MOBISERVER:38081 is detected to be still unHealthy in cluster: cluster
[warn] lb.healthchecker: HLCK3003: Listener: http://MOBISERVER:38081 is detected to be still unHealthy in cluster: cluster
[warn] lb.healthchecker: HLCK3003: Listener: http://MOBISERVER:38081 is detected to be still unHealthy in cluster: cluster
[warn] lb.healthchecker: HLCK3003: Listener: http://mobipc:38080 is detected to be still unHealthy in cluster: cluster
[warn] lb.healthchecker: HLCK3003: Listener: http://mobipc:38080 is detected to be still unHealthy in cluster: cluster

Se le istanze del cluster sono nello stato running e rispondo se chiamate direttamente sui rispettivi ip:porta vuol dire che potrebbe esserci qualche problema nell'httpd.conf, è necessario infatti controllare che i virtual host e server name vari abbiano il corretto nome.

Inoltre il file error.log di Apache viene continuamente aggiornato dal modulo mod_balancer, quindi provvedere opportunamente alla rotazione automatica del file di log oppura a impostare un log-level diverso.

Link di riferimento:


6 comments:

ianaz said...

Ciao, sto seguendo la guida ma mi son bloccato dove bisogna copiare il certificato in /conf/ssl.crt/server.crt

Da me non c'é la cartella ssl.crt, non c'é nemmeno server.crt.

Ho utilizzato la versione di Apache consigliata da te.
Ho sbagliato qualcosa?

Grazie, Silvio

Giuseppe Morreale said...

Ciao silvio, è passato tanto tempo da quando feci questo test.
Però posso dirti che potresti provare semplicemente a creare la cartella ssl.crt

Luca Morettoni said...

Grazie Giuseppe per questi tuoi post molto interessanti (mi sto' avvicinando al mondo JavaEE). Una domanda (perdona se non e' coerente all'articolo (quindi puoi anche cancellare il commento se vuoi), mi consigli di lavorare su GlassFish v2 oppure mettere gia' le mani sulla versione v3 (prelude)?

Giuseppe Morreale said...

Ciao Luca!
La mia risposta è dipende.
Se devi a breve creare un "prodotto" stabile da mettere online ti consiglio di studiare sulla versione corrente.

In caso contrario puoi cominciare anche con la versione 3 portandoti già avanti coi tempi!

Luca Morettoni said...

Grazie per il consiglio, gia' che ci sono approfitto della tua gentilezza per chiederti un altro suggerimento, che testi mi suggerisci di leggere (oltre al tuo blog)?

Giuseppe Morreale said...

Non conosco alcun testo.
Credo che il web, unito magari a una buona stampante laser per stampare i pdf, sia già un ottima risorsa.

sul sito della sun ci sono diversi documenti interessanti, dai un occhio qua:

http://docs.sun.com/app/docs/coll/1343.6