Cos’è: Infinispan è una piattaforma di caching (key/value) e datagrid, altamente distribuita e estremamente scalabile.
Essa viene solitamente utilizzata come cache, di fronte ad un database NoSql basato su disco, per migliorarne le performance. In aggiunta, quando una semplice cache non è sufficiente, per esempio nelle applicazioni in cluster dove la coerenza della cache è importante per la consistenza dei dati, una cache distribuita può essere di grande aiuto.
Ancora, può essere utilizzata come archivio dati NoSql ad alte prestazioni, infatti oltre ad essere in memoria Infinispan può conservare i dati in maniera permanente. Questa viene chiamata cache store. Ed in altri modi ancora…
Implementato sulla robustezza di Wildfly, può sfruttare tutti i servizi messi a disposizione dall’Application Server.
Eredita da Wildfly due modalità operative: standalone e domain.
Standalone: Questa modalità è utilizzata per l’avvio di un singolo nodo.
In alternativa è possibile utilizzarla per l’avvio di un cluster, sarà responsabilità dell’utente la gestione e la manutenzione dei nodi.
Domain: È la modalità raccomandata per avviare un cluster di server, i quali potranno essere gestiti centralmente da un singolo host, il Domain Controller.
Host-Controller: Il termine “Host” viene utilizzato per indicare un host virtuale o fisico.
L’Host Controller è il responsabile dell’avvio e lo stop dei server, in esecuzione sull’host, e dell’interazione con il Domain Controller.
La configurazione dell’Host Controller si trova nel file system dell’host sul file:
${INFINISPAN_HOME}/domain/configuration/host.xml
Domain-Controller: L’Host Controller configurato per la gestione centralizzata dell’intero dominio è chiamato “Domain Controller”.
La responsabilità principale del Domain Controller è mantenere centralizzata la politica di gestione del dominio, distribuendola a tutti gli Host Controller, assistendo, in questo modo, ciascun Host Controller a garantire che tutte le istanze di Infinispan Server siano in esecuzione nel rispetto della configurazione distribuita.
La configurazione del Domain Controller è situata nel file system del Domain Controller sul file:
${INFINISPAN_HOME}/domain/configuration/domain.xml
Server Group: Insieme di server che è possibile gestire e manutenere come fosse un solo server.
In modalità domain ogni istanza server fa parte di un server group.
Server: Ogni server rappresenta un nodo di Infinispan Server.
Ciascun server è eseguito su una JVM separata dall’Host Controller; è responsabilità dell’Host Controller avviare tale processo.
Il documento sopra è una sintesi dei concetti base indispensabili per la comprensione dell’ambiente che andremo a configurare. Potete approfondire tali concetti e molti altri aspetti dalla documentazione ufficiale, reperibile al seguente link:
http://infinispan.org/docs/stable/server_guide/server_guide.html
Iniziamo creando il nostro ambiente di lavoro.
Installiamo e configuriamo una macchina virtuale con almeno tre NIC, possiamo utilizzare una Centos 7 minimal.
Di seguito il link dell’iso:
http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso
Per semplicità di configurazione disabilitiamo firewalld.
L’installazione in un ambiente di produzione richiederà l’apertura delle porte necessarie su firewalld.
systemctl stop firewalld systemctl disable firewalld
Scarichiamo l’archivio per l’installazione di Infinispan Sever dal seguente link:
http://downloads.jboss.org/infinispan/9.1.0.Final/infinispan-server-9.1.0.Final-bin.zip
Una volta scaricata l’ultima versione, procediamo scompattando l’archivio:
unzip infinispan-server-9.1.0.Final-bin.zip -d /opt/
Avviamo Infinispan utilizzando lo script:
${INFINISPAN_HOME}/bin/domain.sh
Lo script utilizza i seguenti file di configurazione:
${INFINISPAN_HOME}/domain/configuration/domain.xml ${INFINISPAN_HOME}/domain/configuration/host.xml
(in seguito vedremo come avviare Infinispan Server utilizzando configurazioni personalizzate).
La configurazione base prevede il Domain Controller, l’Host Controller e due istanze Server.
Eseguendo il comando:
ps -aux | grep infinispan
possiamo osservare, a meno di errori durante l’avvio, che sulla macchina virtuale sono in esecuzione quattro JVM.
Potrebbe essere utile eseguire lo script base sulla macchina in cui andremo ad installare Infinispan Server per verificare, prima di iniziare a personalizzare la configurazione, eventuali conflitti di porta con altri processi in esecuzione sulla macchina.
Terminiamo l’esecuzione in corso ed iniziamo la configurazione del cluster.
Eseguiamo tre copie della directory ${INFINISPAN_HOME}/domain
cp -r ${INFINISPAN_HOME}/domain /opt/domain cp -r ${INFINISPAN_HOME}/domain /opt/servera cp -r ${INFINISPAN_HOME}/domain /opt/serverb
In queste directory risiederanno le configurazioni del nostro cluster.
In ordine andremo a configurare il Domain Controller e successivamente gli Host Controller.
Iniziamo configurando il Domain Controller:
I file che ci interessano per la configurazione del Domain Controller sono i seguenti:
/opt/domain/configuration/domain.xml /opt/domain/configuration/host-master.xml
Il file “host-master.xml” è preconfigurato per avviare un Domain Controller.
Per prima cosa impostiamo l’indirizzo dell’interfaccia di managment, in modo da poter accedere alla managment console dall’esterno.
Nel mio caso assegno l’indirizzo dell’interfaccia eth0:
<interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:192.168.124.254}"/> </interface> </interfaces>
Dalla directory di installazione di Infinispan Server eseguiamo il comando:
${INFINISPAN_HOME}/domain.sh -Djboss.domain.base.dir=/opt/domain/ --host-config=host-master.xml
In questo modo, come anticipato in precedenza, modifichiamo a runtime la directory base dove si troverà la configurazione del dominio ed il file da utilizzare per la configurazione dell’Host Controller. Sarà necessario rendere tale configurazione persistente; ci torneremo più avanti.
Navighiamo su:
http://192.168.124.254:9990/console
Se tutto è andato a buon fine, dovremmo visualizzare la seguente pagina.
Seguiamo le istruzioni per aggiungere il Management User e così avere accesso alla console.
Terminiamo l’esecuzione del Domain Controller, per completare la configurazione.
Eseguiamo lo script per aggiungere l’utente passando come parametro in ingresso, la directory base di configurazione:
./add-user.sh -dc /opt/domain/configuration/
Diversamente l’utente sarà aggiunto nei file di configurazione della directory di installazione di Infinispan Server.
Seguiamo le istruzioni,dovremmo ottenere una chiave con la password cifrata (base64):
<secret value="aW5maW5pc3Bhbg==" />
Conserviamo questa chiave che ci servirà per connettere gli Host Controller al Domain Controller.
Prepariamo i nodi copiando il file “mgmt-users.properties”, appena configurato dall’esecuzione dello script precedente.
cp /opt/domain/configuration/mgmt-users.properties /opt/servera/configuration/ cp /opt/domain/configuration/mgmt-users.properties /opt/serverb/configuration/
Al fine di fornire una configurazione utilizzabile anche dove il multicast UDP è bloccato, configuriamo lo stack TCP di JGroups.
Apriamo il file:
/opt/domain/configuration/domain.xml
Aggiungiamo lo stack tcpping, di seguito:
<stack name="tcpping"> <transport type="TCP" socket-binding="jgroups-tcp"/> <protocol type="TCPPING"> <property name="initial_hosts"> 192.168.124.11[7600],192.168.124.11[7750],192.168.124.12[7600],192.168.124.12[7750] </property> </protocol> <protocol type="MERGE3"/> <protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd"/> <protocol type="FD_ALL"/> <protocol type="VERIFY_SUSPECT"/> <protocol type="pbcast.NAKACK2"> <property name="use_mcast_xmit"> false </property> </protocol> <protocol type="UNICAST3"/> <protocol type="pbcast.STABLE"/> <protocol type="pbcast.GMS"/> <protocol type="MFC"/> <protocol type="FRAG3"/> </stack>
Quindi impostiamo lo stack appena creato come default per JGroups
<stacks default="${jboss.default.jgroups.stack:tcpping}">
Infine eseguiamo nuovamente il comando :
${INFINISPAN_HOME}/domain.sh -Djboss.domain.base.dir=/opt/domain/ --host-config=host-master.xml
Configuriamo ora l’Host A. Dobbiamo fare riferimento al file:
/opt/servera/configuration/host-slave.xml
Indichiamo il nome dell’Host come segue:
<host xmlns="urn:jboss:domain:4.2" name="servera">
Sostituiamo il secret value, come suggerito all’interno del file, con la chiave generata precedentemente dallo script “add-user.sh”.
<server-identities> <!-- Replace this with either a base64 password of your own, or use a vault with a vault expression --> <secret value="aW5maW5pc3Bhbg==" /> </server-identities>
Configuriamo ora i parametri per la connessione al Domain Controller, indicando l’utenza da utilizzare e l’indirizzo del Domain Controller.
<remote security-realm="ManagementRealm" username="ispnadmin"> <discovery-options> <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address:192.168.124.254}" port="${jboss.domain.master.port:9999}"/> </discovery-options> </remote>
Infine assegniamo l’indirizzo alle interfacce: management; public e unsecure.
Nel mio caso l’indirizzo di eth1.
<interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:192.168.124.11}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:192.168.124.11}"/> </interface> <interface name="unsecure"> <inet-address value="${jboss.bind.address.unsecure:192.168.124.11}"/> </interface> </interfaces>
Ricordo che stiamo effettuando l’installazione su una singola macchina virtuale, quindi interfaccia locale condivisa, per tale motivo si è reso necessario settare l’indirizzo di tutte le interfacce.
Utilizziamo il seguente comando per avviare l’Host appena configurato:
${INFINISPAN_HOME}/domain.sh -Djboss.domain.base.dir=/opt/servera/ --host-config=host-slave.xml
Dovremmo vedere sulla console del Domain Controller il seguente messaggio, che ci avvisa che un server, in questo caso ”servera”, è stato registrato nel dominio:
[Host Controller] 15:50:03,369 INFO [org.jboss.as.domain.controller] (Host Controller Service Threads - 18) WFLYHC0019: Registered remote slave host "servera", JBoss Infinispan Server 9.1.0.Final (WildFly 2.2.0.Final)
Eseguiamo gli stessi passi per la configurazione dell’Host B, ricordandoci che il file da configurare sarà:
/opt/serverb/configuration/host-slave.xml
Anche in questo caso, dopo aver avviato il server, dovremmo vedere il messaggio di avvenuta registrazione:
[Host Controller] 15:50:05,090 INFO [org.jboss.as.domain.controller] (Host Controller Service Threads - 18) WFLYHC0019: Registered remote slave host "serverb", JBoss Infinispan Server 9.1.0.Final (WildFly 2.2.0.Final)
Testiamo la configurazione di JGroups con tcpdump:
tcpdump -i lo tcp port 7600 -vvv
Dovremmo visualizzare un output simile al seguente:
tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes 20:07:17.845452 IP (tos 0x0, ttl 64, id 32616, offset 0, flags [DF], proto TCP (6), length 243) centos_master.37190 > centos_master.7600: Flags [P.], cksum 0x7c33 (incorrect -> 0xa823), seq 3548529607:3548529798, ack 736000418, win 32742, options [nop,nop,TS val 1124275 ecr 1119252], length 191 20:07:17.845547 IP (tos 0x0, ttl 64, id 37640, offset 0, flags [DF], proto TCP (6), length 52) centos_master.7600 > centos_master.37190: Flags [.], cksum 0x7b74 (incorrect -> 0x3ad3), seq 1, ack 191, win 1172, options [nop,nop,TS val 1124275 ecr 1124275], length 0 20:07:18.793695 IP (tos 0x0, ttl 64, id 7628, offset 0, flags [DF], proto TCP (6), length 243) centos_master.49494 > centos_master.7600: Flags [P.], cksum 0x7c33 (incorrect -> 0x6f92), seq 1672010887:1672011078, ack 1996160684, win 32742, options [nop,nop,TS val 1125223 ecr 1119541], length 191
Concludiamo l’articolo lasciandovi il link per l’accesso alla Management Console e qualche screenshot:
http://192.168.124.254:9990/console
Fateci sapere se avete trovato l’articolo interessante e se volete approfondimenti, per esempio su come integrare la cache su un progetto Java Spring.
Continuate a seguirci sul blog EXTRAORDY per i prossimi articoli sugli argomenti legati al mondo JBoss Enterprise Application Platform.
Alla prossima!