Per cluster di application servers si intende una serie di istanze del server su cui girano le stesse risorse (le stesse Java web applications). Generalmente istanze diverse girano su Java Virtual Machine differenti e su macchine fisiche separate (sebbene appattenenti alla stessa sottorete) e questo introduce tutta una serie di problematiche peculiari al clustering. Il motivo per cui si ricorre a questa architettura è che in applicazioni di un certo peso la disponibilità del servizio (e le sue prestazioni) devono essere per quanto possibile garantite. In maniera molto semplice (e anche non del tutto precisa), un cluster di tre istanze è sempre in grado di svolgere il suo lavoro (garantire la disponibilità del sito all’utente finale) anche se una o due istanze dovessero incepparsi o crashare. Non solo, se mi accorgo che il sito e molto trafficato, posso sempre aggiungere un’istanza al cluster per ripartire il lavoro (scalabilità). Tutto questo inoltre avviene in maniera trasparente per l’utente finale che, anche se loggato ad un sito, non perderà la sessione, né si accorgerà di nessun cambiamento qualora alcune istanze del cluster dovessero avere dei problemi perché quelle rimaneni si faranno carico del lavoro.
Proseguendo il precedente post, vediamo come installare un architettura cluster su più server Linux fisicamente distinti. Suppongo si siano eseguite le istruzioni per installare Glassfish su un singolo server con supporto cluster abilitato come spiegato nel precedente articolo.
Se avete seguito le istruzioni, l’installazione di Glassfish che ne risulterà, sarà il nostro DAS (Domain Administration Server) vale a dire il nodo centrale di amministrazione delle varie istanze che comporranno il cluster.
È possibile installare una o più istanze all’interno di uno stesso cluster e residenti sulla stessa macchina fisica semplicemente leggendo la documentazione ufficiale e con qualche semplice e intuitiva operazione dalla interfaccia web di amministrazione. Caso più interessante è invece l’installazione di istanze su macchine fisiche separate. Partiamo col dire che le macchine devono appartenere alla stessa sottorete e nessun firewall deve impedire la comunicazione tra le varie istanze del cluster ospitate. Detto questo pensiamo di avere due macchine diciamo:
test1.acme.com
e
test2.acme.com
e supponiamo anche di aver già installato Glassfish con supporto cluster su test1.acme.com così come descritto nel precedente post. Logghiamoci a test1.acme.com con l’utente glassfish e avviamo il server:
asadmin start-domain domain1
Avviato il server, la console di amministrazione sarà disponibile all’indirizzo:
ora dobbiamo creare un node agent per test1.acme.com
asadmin create-node-agent --host localhost --port 4848 <node-name>>
dove “nodename” è il nome da noi scelto per il nodo (per esempio test1-node). Senza scendere nei dettagli, dobbiamo avere un agent node su ogni singola macchian fisica che entrerà a far parte del cluster. Dalla console di amministrazione possiamo proseguire creando un nuovo cluster e una nuova istanza che assegneremo al cluster (e che avrà come node agent il nodo appena creato e per ora l’unico disponibile). Ora avviamo il node-agent appena creato:
asadmin start-node-agent --syncinstances=true <node-name>
Ora ci dobbiamo loggare sulla seconda macchina che ospiterà una o più istanze del nostro cluster: test2.acme.com. Su questo server dobbiamo installare Glassfish per cui rimando al post precedente alle sezioni “installare il JDK” e “installare ANT”. In questo caso però non abbiamo bisogno di un’installazione completa che creerebbe un secondo DAS ridondante, per cui invece di eseguire il comando
lib/ant/bin/ant -f setup-cluster.xml
useremo questo di seguito:
lib/ant/bin/ant -f setup-cluster.xml create-node-agent --nodeagent <node-agent-name> -Ddas.host="test1.acme.com"
Dove “host” è l’host su cui è installato il DAS (nel nostro caso test1.acme.com) e <node-agent-name> è il nome del nuovo nodo che stiamo per creare (per esempio test2-node). Ci deve essere un node agent per ogni macchina fisica distinta destinata ad ospitare istanze del cluster e ovviamente il nome del nodo deve essere unico entro un cluster.
Avviamo il nuovo node agent creato su test2:
asadmin start-node-agent --syncinstances=true <node-agent-name>
Logghiamoci alla admin console (o facciamo un refresh se siamo già loggati) e nella sezione dedicata ai nodi dovremmo poter essere in grado di vedere il nuovo nodo appena creato su test2.acme.com. Sempre attraverso l’interfaccia web di amministrazione possiamo creare nuove istanze appartenenti al cluster e assegnarle il nodo su test2. Questo vuol dire che l’istanza verrà creata e girerà su test2.acme.com.
Le istanze del cluster girano su porte particolari. Se, per esempio, creiamo due istanze su test2.acme.com e una su test1.acme.com avremo le varie istanze del server in ascolto su queste porte:
- http://test1.acme.com:38080 (prima ed unica istanza su test1)
- http://test2.acme.com:38080 (prima istanza su test2)
- http://test2.acme.com:38081 (seconda istanza su test2)
A questo punto di solito si prosegue creando un load balancer e integrando Glassfish con un web server tipo Apache. Avremo quindi un unico URL con cui invocare la nostra applicazione java e dietro le quinte il load balancer deciderà concretamente (e in maniera trasparente per l’utente) a quale istanza del cluster indirizzare la richiesta.
Un ultima nota dedicata più agli sviluppatori Java. Le librerie (file .jar) che dovrebbero essere condivise tra le farie applicazioni java deployate su uno stesso cluster (per esempio un driver jdbc per un database) dovrebbero essere piazzate qui:
<glassfish-home>/domains/domain1/config/<cluster-name>-config/lib
La documentazione completa sul clustering su Glassfish (e argomenti correlati) è disponibile qui:
http://glassfish.dev.java.net/nonav/javaee5/docs/SJSASEEHAAG.pdf
Ciao,
complimenti per l’articolo, utilissimo!
Stevo pensando, come si configura il webserver in modo che tutte le applicazioni deployate sul cluster siano raggiungibili sulla porta 80?
Grazie
Ale
“Partiamo col dire che le macchine devono appartenere alla stessa sottorete e nessun firewall deve impedire la comunicazione tra le varie istanze del cluster ospitate”
Perchè? Quando mai s’è visto in un ambiente “vero” un vincolo impegnativo come questo? E se io avessi due nodi fisici su una sottorete e il das su un’altra?
Che porte mi servirebbero?
@Alessandro
Puoi configurare un load balancer per le diverse istanze del cluster. Sul sito trovi una guida piuttosto dettagliata sul come fare a questo indirizzo:
Fai clic per accedere a SJSASEEHAAG.pdf
@Tony
capisco le tue ragioni. In effetti sembra strano anche a me. Avevo trovato questa condizione ravanando tra la documentazione ma non ricordo esattamente dove. Potrei anche essermi sbagliato. Il buon senso mi suggerisce che le istanze di un cluster e il DAS comunichino tra loro su certe porte. Se non vi e’ nessun impedimento affinche’ cio’ avvenga, l’appartenere alla stessa sottorete o meno non dovrebbe fare differenza. Quali siano queste porte non lo so ma dovresti trovare qualcosa qua:
Fai clic per accedere a SJSASEEHAAG.pdf
oppure vai di grep per “port” sui files .xml di configurazione. Sicuramente queste porte saranno configurabili e le troverai specificate su uno di questi file.
Volevo segnalare il mio blog in relazione a questo post in quanto ultimamente ho fatto qualche esperimento con glassfish in cluster.
oltre a scrivere riguardo il setup base come avviene in questo post, ho trattato gli argomenti relativi all’ejb timer e al loadbalancing realizzato con il plugin di glassfish + webserver apache.
http://programmaremobile.blogspot.com/