Progetto di un supporto per il
deployment
di applicazioni distribuite
di
Samorani Michele
Obiettivi



Realizzare supporto per deployment di
componenti interagenti

Allocazione risorse dinamica

Approccio esplicito
Deployment effettuabile da console di comando
(Master)
I nodi destinazione devono caricare
dinamicamente le classi che vengono distribuite
Caratteristiche

Ipotesi




Guasto singolo (ma non del registry)
In alcuni casi guasto multiplo
Messaggi non persi
Tecnologie usate




OSGi
RMI
Paradigma della rete di interazione
TuProlog
Paradigma della rete di interazione
(framework uniboEnv)
Actor_1
istanzia actors
Actor_2
Actor_3
sendSignal(actionName,args)
Cliente
istruisce
KERNEL
ESEMPIO
1.
Cliente:
2.
Actor_2:
3.
Actor_1:
kernel.reactInteraction (Actor_1, Actor_2, “inc”)
kernel.sendSignal(“inc”, args)
void doAction (String actionName, Object args) {…}
KB
Architettura fisica
Macchina master
RMI
registry
ApplicazioneMaster
MasterSupport
RmiServer
KB
Disco master
bundle1
Macchina registry
Factory di
actor
bundle1 bundle2
KB OSGiServer 1
bundle1
KB
OSGiServer 2
bundle2
Macchina 1
Macchina 2
Architettura di un nodo
(OsgiServer)
remotingSupport i-mo
FactoryManager
KERNEL i-mo
OSGi i-mo
Actor_3
Actor_2
Actor_1
KB i-ma
Architettura logica
actor
segnale
Cliente
Cliente
nodo
OsgiServer
KB
OsgiServer
MasterSupport
INVOCA API
Master Application
KB
KB
API del master support

declarePhisicalNode (nomeNodo, IP)


declareFactory (tipo, bundleLocation)




Installa la factory corrispondente nel nodo remoto

Istanzia un actor
remoteReactInteraction (reactor, emitter, actionName)
Creazione di un canale comunicativo tramite riferimento remoto /
supporto javaBeans
removeInteraction (reactor, emitter, actionName)


Dichiarazione di una factory di actor contenuta in un bundle
deployActor (tipo, nomeActor, nomeNodo)


Configura (rinomina) un nodo non configurato
Distruzione di un canale comunicativo
destroyActor (nomeActor, todoMode)

Distruzione di un actor
Ogni azione
scrive / cancella
una tupla in tutte le KB
declareNode (n1, 192.168.70.39)
declareNode (n2, 192.168.70.40)
declareFactory (counter,d:\bundles\b1.jar)
MasterSupport
declareFactory (gui,d:\bundles\b2.jar)
deployActor(counter, c1, n1)
deployActor(gui, g1, n2)
Se entrambi gli actor
installBundle
sono sullo stesso
deployActor(counter,
c1)
nodo, supporto
javaBeans
remoteReactInteraction (c1, g1, inc)
c1
c1_ref g1
Nodo
n1
Nodo
n2
n1
IOsgiServer_192.168.70.39_127.0.0.1).
n2
IOsgiServer_192.168.70.40_127.0.0.1).
Master
DEMO 1:
n1: g1,c1
n2: g2
g1,g2->c1
c1->g2
Tolleranza ai guasti: OBIETTIVI

Failure di un nodo non master:




Occorre rimuovere l’entry dal registry
Occorre rimuovere eventuali riferimenti remoti
inconsistenti
Occorre aggiornare la teoria
Failure del nodo Master:


Il sistema deve continuare a rispondere
correttamente ai solleciti del cliente durante
tutto il TTR del master
Il master, al rientro, deve poter reperire lo
stato aggiornato del sistema
Fallimento di un nodo


Chi se ne accorge avvisa il Master
Il Master aggiorna e diffonde la nuova
teoria priva delle clausole riguardanti il
nodo
X
Avviso il
master
DEMO 2:
c1 fails
Failure del Master



Agli occhi del cliente (≠ MasterApplication) tutto
continua a funzionare
Il master, ogni volta che cambia lo stato del sistema,
propaga una tupla a tutti i nodi (con Logical Clock), che
la registrano nella propria KB
Il master, quando entra nel sistema:


Si accorge (dal registry) se ci sono nodi configurati.
Cerca chi ha la KB più aggiornata, la carica e la inoltra a tutti i
nodi
 Il
Il sistema
caso peggiore
è quando il master modifica lo stato (i.e.
risponde
bene
i riferimenti
remoti)
anche durante
remoteReactInteraction:
c1 -> g2 (“updateVal”)
DEMO 3:
iles.
TTR
del
master!!! Master
Nodo di c1 master exit
Nodo di g2
Agg. teoria
Agg. teoria
Divulgazione teoria
aggiunto riferimento a g2
destroyActor (actorName, todo)



Il master elimina tutti i riferimenti remoti
Il master distrugge actorName aspettando
che finisca di lavorare
Se todo==true

All’inizio il master scrive

caso
Il nodo “todo” comincia a monitorare il
master.
todo:destroyActor(actorName) in un nodo a

Se si accorge che il master è fallito senza
cancellare la clausola todo, si incarica di ripetere
destroyActor

Al termine, cancella la clausola todo
TEST

CounterActor




GuiActor



Input: “updateVal (int n)” -> visualizza n
Output: “inc” : se viene premuto il tasto inc
DEMO 4:
c1 lazy
Master fails
MasterSupport


Input: “inc” -> incrementa un contatore
Output: “updateVal (int newVal) “
Anche versione lazy, fail
Realizzato anche in versione fail (fallisce durante destroyActor)
Prove

Eseguite prove su 3 macchine in rete locale (LAB2)
Lenta la reazione del supporto in caso di guasti (oltre 10 sec)
Sviluppi futuri



Progetto di un registry RMI ad alta
disponibilità e affidabilità…
Messaggi master – nodo non bloccanti…
Segnali tra gli actor con diverse
semantiche (asincroni,…)
Scarica

presentazione