Sommario
Il lavoro di tesi si inquadra nell'ambito dei sistemi distribuiti, ponendosi
come obiettivo la gestione dei processi di CLEVER, un middleware
distribuito per l'accesso e l'amministrazione di un'infrastruttura di cloud
computing. Tale gestione mira ad aumentare la fault-tollerance e la
flessibilità dell' architettura. Tutti i componenti del middleware sono stati
mappati all'interno di processi separati. A causa della natura centralizzata del
middleware è stato necessario introdurre degli algoritmi che provvedano al
ripristino ed alla rielezione dei processi coordinatori, che potrebbero crollare
in seguito a comportamenti anomali o guasti all'interno dell'architettura,
compromettendo il funzionamento del sistema. È stata prevista una
procedura di ripristino anche per i processi agenti, che ne garantisce una
presenza continuativa. Questi componenti vengono incaricati dai coordinatori
di eseguire le varie operazioni di gestione sulle macchine virtuali, database,
ecc. L'esecuzione in processi separati dei vari moduli ha richiesto un
meccanismo di comunicazione tra processi, a tale scopo si è sfruttato il plug-
in Dbus già integrato in CLEVER.
Nella prima parte dell'elaborato verranno approfonditi i concetti relativi ai
sistemi distribuiti ed al cloud computing. Nella seconda parte verrà analizzata
la struttura del middleware CLEVER e verranno accennate le tecnologie
utilizzate per la comunicazione dei suoi moduli. Nell'ultima parte si parlerà
in dettagli delle soluzioni sviluppate e verranno descritti i test effettuati a
lavoro finito, il cui scopo è quello di fornire delle misure sui tempi di
riassetto del sistema in seguito al crollo del processo coordinatore.
3
Parte I
Parte I
Sistemi distribuiti e Cloud
Computing
8
Parte I
Introduzione
Nel corso della storia i calcolatori elettronici hanno subito un'evoluzione inarrestabile,
durante la quale sono stati modificati profondamente sia i meccanismi di funzionamento
sia le modalità di rappresentazione dell'informazione. La fiamma che tiene vivo questo
continuo sviluppo è la necessità di una sempre maggiore potenza di calcolo, dovuta
sopratutto ad una integrazione sempre più profonda dei calcolatori nella vita dell'uomo.
In precedenza, la soluzione per ottenere calcolatori più potenti consisteva nell' aumen-
tarne la velocità di clock, questo fu possibile fin quando non ci si scontrò con la teoria
della relatività ristretta, secondo la quale un segnale elettrico non può propagarsi ad una
velocità superiore a quella della luce. Detto ciò per continuare sulla strada dell' aumento
del clock, era necessario rimpicciolire le CPU, in modo che i segnali al loro interno
percorressero distanze più brevi. Ammesso che ciò fosse fattibile, rimaneva da risolvere
un altro problema: la dissipazione del calore. Si è così passati ai calcolatori paralleli,
ovvero macchine dotate di più CPU, le quali collettivamente e a parità di clock,
possiedono una potenza di calcolo di gran lunga superiore a quelle dotate di una sola
CPU. Da questo momento, grazie anche allo sviluppo della rete internet hanno visto la
luce diverse architetture e tecnologie di computer paralleli che possono essere riassunte
in tre categorie fondamentali:
• Sistemi multiprocessore a memoria condivisa: un sistema di computer in cui
due o più CPU condividono l'accesso ad una RAM comune. Il problema
fondamentale di questi sistemi è il costo elevato, legato sopratutto alla difficoltà
di costruire multiprocessori di grandi dimensioni.
• Multicomputer a scambio di messaggi: in questi sistemi, a differenza dei
precedenti ciascuna CPU ha una propria memoria locale e tutti i nodi
comunicano attraverso una apposita infrastruttura di rete sottostante (non
necessariamente internet).
• Sistemi distribuiti: il paradigma maggiormente utilizzato al giorno d'oggi e sul
quale focalizzeremo la nostra attenzione.[1]
9
Introduzione
Un sistema distribuito è un insieme di unità di elaborazione debolmente connesse tramite una
rete di comunicazione. Ciascuna unità di elaborazione di un sistema distribuito considera remote
le altre unità di elaborazione del sistema e le rispettive risorse, mentre considera locali le
proprie. Le unità di elaborazione in esso presenti possono variare per dimensioni e funzioni;
possono comprendere piccole unità di elaborazioni, stazioni di lavoro, minicalcolatori e grandi
calcolatori d'uso generale.
I vantaggi principali che ne derivano dal suo utilizzo sono:
• condivisione delle risorse: ciascun utente ha la possibilità di accedere ai file e a risorse
hardware residenti in nodi remoti del sistema, o effettare elaborazione di informazioni in
una base di dati distribuita.
• accelerazione dei calcoli: se è possibile suddividere un calcolo in più sottocalcoli
eseguibili in maniera concorrente, un sistema distribuito permette di ripartire gli stessi
tra i suoi diversi siti.
• affidabilità: se un qualunque nodo del sistema si guasta i nodi rimanenti possono
continuare a funzionare, offrendo così al sistema una maggiore affidabilità. Questo non
vale se a ciascun nodo del sistema è stata affidata una funzione cruciale, in quanto un
singolo guasto può compromettere il funzionamento dell'intero sistema.
• riduzione dei costi: molte aziende hanno sostituito i loro mainframe con reti di stazioni
di lavoro o PC. Le aziende ottengono così un miglior rapporto tra prezzo e prestazioni,
una maggiore flessibilità nella dislocazione delle risorse e una manutenzione più
semplice.[2]
Da quanto detto si può concludere che un sistema distribuito non può prescindere
dall'architettura di rete sottostante, anzi i sistemi distribuiti aggiungono alla rete un
paradigma (modello comune) che fornisce un modo uniforme di guardare all'intero sistema.
L'intento del sistema distribuito è di trasformare un insieme debolmente connesso di macchine,
in un sistema coerente basato su un concetto, un'idea che unifichi il sistema. Un modo perché un
sistema distribuito ottenga una certa uniformità in presenza di hardware e sistemi operativi
eterogeneri, consiste in un strato di software sopra il sistema operativo. Questo strato, detto
middleware fornisce strutture dati e operazioni che permettono a processi e utenti su macchine
lontane di interagire in modo coerente. In un certo senso il middleware si può interpretare come
il sistema operativo di un sistema distribuito[1], nonostante questa definizione non sia del
10
Introduzione
tutto corretta, nella progettazione di un middleware ci si può scontrare con problemi
tipici dei sistemi operativi quali il bilanciamento del carico di lavoro, la sincronizzazione
degli accessi alle risorse comuni, il controllo della concorrenza per l'accesso alle sezioni
critiche dei vari processi residenti in nodi differenti.
11
Capitolo 1
Cloud Computing
Sempre più spesso oggi sentiamo parlare di cloud computing, ma cosa è in realtà?
Effettuando una breve ricerca sul web veniamo sommersi da definizioni eterogenee ed
un po' sfuggenti. Una definizione potrebbe essere quella fornita dal National Institute of
Standards and Technology (NIST):
Il cloud computing è un modello per rendere possibile un accesso via rete, su richiesta e in
maniera conveniente, a un insieme condiviso di risorse configurabili (ad esempio reti, server,
storage, applicazioni e servizi) che possono essere rapidamente fornite e rilasciate con costi di
gestione o interazioni con il fornitore minimali. [3]
Siamo in ambito di calcolo distribuito e lo scenario è quindi quello di un utente che con
un qualsiasi device (PC, tablet, smartphone), ed una connessione ad Internet può
accedere al cloud che gli fornisce tutti i servizi e i dati richiesti[4]. Si può quindi
immaginare che il cloud computing faccia in campo IT ciò che viene fatto tutti i giorni
con la fornitura di elettricità, gas o atri tipi di servizi di uso comune. Tali servizi
vengono forniti all’utente su richiesta senza che debba preoccuparsi di come sono
forniti: l’utente chiede e il servizio viene fornito nella quantità desiderata. In maniera
similare il cloud computing offre a sviluppatori ed utenti di applicazioni una visione
astratta dei servizi che semplifica e ignora molti dei dettagli implementativi e dei
funzionamenti interni dei servizi stessi[5]. In tutto questo non dobbiamo dimenticarci di
accennare al concetto che sta alla base del cloud computing: la virtualizzazione. Questa
è la carateristica che lo differenzia dal precedente paradigma di calcolo distribuito Grid
Computing, che invece basa il suo funzionamento sulla parallelizzazione dei software
su un numero elevato di CPU.
Fondamentalmente, esistono tre tipi di approcci al cloud computing:
Infrastructure as a Service (IaaS), Software as a Service (SaaS), e Platform as a
12
Cloud Computing
Service (PaaS).
Infrastructure as a Service : Alcuni fornitori mettono a disposizione dei clienti
l’infrastruttura per realizzare proprie soluzioni, consentendo a questi di noleggiare
hardware come server, firewall e cablaggi. Ricade sull’utente il compito di
configurare e installare da remoto le proprie soluzioni. È possibile potenziare
l’infrastruttura richiedendo più server, senza per questo dover acquistare nuovo
hardware. Questo approccio è definito Infrastructure as a Service (IaaS), perché
l’utente può noleggiare l’infrastruttura senza doversi preoccupare di stimare in
anticipo i picchi di massima domanda, ma ricade su quest’ultimo la responsabilità
di configurare correttamente l’infrastruttura noleggiata.
Software as a Service : Un altro approccio possibile è quello di noleggiare il
servizio offerto da un fornitore, configurandolo attraverso l’interfaccia messa a
disposizione dal fornitore medesimo, senza per questo dover conoscere i dettagli
dell’infrastruttura per veicolare il servizio. Questo approccio è denominato
Software as a Service (SaaS), perché si paga per utilizzare determinati servizi. In
un modello SaaS l’utente non ha il controllo dell’infrastruttura sulla quale il
servizio è installato. Allo stesso modo, non ha il controllo sul sistema operativo
sul quale il servizio gira, né su qualunque altro elemento software, se non quelli
che la stessa interfaccia espone all’utente. In altre parole, spetta al fornitore del
servizio il compito di predisporre tutto ciò che serve per eseguire l’applicazione,
isolando l’utente dai componenti sottostanti.
Platform as a Service : Il terzo tipo di approccio è definito Platform as a Service,
o PaaS. In questo approccio, l’utente noleggia una piattaforma sulla quale
effettuare il deploy delle proprie applicazioni senza dover configurare
l’infrastruttura e senza le limitazioni proprie dell’approccio SaaS[6] .
Le architetture di cloud computing possono inoltre essere classificate in pubbliche,
private o ibride. Quelle pubbliche offrono un'infrastruttura di calcolo pubblicamente
accessibile, attraverso la quale i clienti possono richiedere i servizi. I cloud privati,
invece, vengono costruiti dalle organizzazioni o dalle aziende per poter avere un proprio
ambiente computazionale. I cloud ibridi sono una via di mezzo tra le due soluzioni,
questi sono sostanzialmente costituiti da cloud privati che, all'occorrenza, si collegano
con un'infrastruttura pubblica al fine di aumentare le proprie risorse di calcolo[7].
13