virtualizzazione in un cluster ad alta disponibilità in ambiente linux

UNIVERSITÀ DEGLI STUDI DI CAMERINO
FACOLTÀ DI SCIENZE E TECNOLOGIE
Corso di Laurea Specialistica in Informatica
Dipartimento di Matematica e Informatica
VIRTUALIZZAZIONE IN UN CLUSTER AD
ALTA DISPONIBILITÀ IN AMBIENTE
LINUX
Tesi di Laurea Sperimentale
In
Reti di Elaboratori
Laureando
Mirco Perini
Relatore
Prof. F. Marcantoni
_________________
Anno Accademico 2005-2006
h o ri sa li to i l c rep a cc io d ella S ib i lla
h o lo t ta to p er o n o ra re l a mia Mu ta
h o vig i la to su lla g en t e d ell e A ra n c e
h o co mb a ttu to la g u er ra so t to la La n te rn a
h o tra s cin a to a m ic i fu o r i d a l N ive o
h o p u n ta to i p i ed i g u a rd a n d o le S c in t il le
ma i l ve ro co ra g g io lo v ed o in te.. in vo i
n ella d if fi co l tà d e lla vi t a … tu tt i i g io rn i
se ma i d o v rò b e re a n ch ’ io d a q u e sto a ma ro
ca li ce sp e mo d ’a v er i l v o st ro st e sso a rd i re.
forza papà
forza mamma
Ringraziamenti
Vorrei ringraziare il Prof. Fausto Marcantoni per avermi seguito e
consigliato nella realizzazione del progetto e nella stesura della tesi.
Un ulteriore grazie va agli operatori e ai ragazzi della Ripartizione
Servizi Informatici e Statistici dell’Università degli Studi di Perugia, ed
in particolare a Tiziano Micheli per aver ascoltato le mie noiose
spiegazioni, a Giovanni Sabatini e Federico Giorgetti per la disponibilità
e soprattutto a Marco Pallotta colui che mi ha permesso di diventare
l’amministratore di sistema che sono oggi.
Un meritato ringraziamento va al compagno di questa fantastica
avventura Dott. Carlo Manuali, alla Dott.sa Chiara Del Buono e alla sua
crew per aver sopportato il mio nervosismo, a tutti i ―malati‖ di
nolannoparty, agli amici del fù GHS, a Maurino e a tutti i ragazzi della
sua band per essere stati la colonna sonora di questa tesi ed infine a tutti
coloro che con il loro affetto e la loro pazienza mi hanno sopportato ed
hanno permesso per la terza volta che tutto questo si realizzasse.
Grazie.
———————————————————————————————— INDICE
Indice
INTRODUZIONE ....................................................... VI
CAPITOLO 1
SISTEMI DISTRIBUITI: GENERALITÀ ...................... 1
1 .1 A R C H IT E T T U R A ................................ ................................ ..... 3
1 .2 S IS T E M I O P E R A T IV I T I P IC I D E I C L U S T E R ................................ ... 6
1 .3 T IP O L O G IE D I C L U S T E R ................................ ........................... 8
CAPITOLO 2
L'ALTA DISPONIBILITÀ .......................................... 15
2 .1 L IV E L L I D I D IS P O N IB I L I T À ................................ ..................... 1 6
2 .2 I L R E Q U IS IT O D E I C IN Q U E 9 ................................ .................... 2 0
2 .3 L E P R E S T A Z IO N I N E L L ' A L T A D IS P O N IB I L I T À .............................. 2 5
2 .4 T IP O L O G IE D I C L U S T E R IN A L T A D IS P O N IB I L IT À ........................ 2 7
CAPITOLO 3
LA VIRTUALIZZAZIONE ......................................... 32
3 .1 C O N C E T T I GE N E R A L I ................................ ............................. 3 4
I
———————————————————————————————— INDICE
3 .2 A S P E T T I F O N D AM E N T A L I ................................ ....................... 3 6
3 .3 R E Q U IS IT I D I U N A M A C C H IN A V IR T U A L E ................................ .. 4 0
3 .4 V IR T U A L M AC H IN E M O N IT O R ( VM M) ................................ ..... 4 1
3 .4 .1 F U L L V IR T U A L IZ A T IO N E P AR A V IR T U A L IZ A T I O N .............. 4 2
3 .4 .2 B IN A R Y T R A N S L A T I O N E D Y N A M IC R E C O M P I L A T I O N ......... 4 3
3 .4 .3 S T R U T T U R A IN T E R N A D E L L ' H Y P E R V IS O R ........................ 4 4
3 .4 .3 .1 V IR T U A L I Z Z A Z IO N E D E L L A CP U ...................... 4 5
3 .4 .3 .2 V IR T U A L I Z Z A Z IO N E D E L L A M E M O R IA ............... 4 9
3 .4 .3 .3 V IR T U A L I Z Z A Z IO N E D E L L E P E R IF E R IC H E ........... 5 3
3 .5 B E N E F IC I D E L L A V IR T U A L I Z Z A Z IO N E ................................ ....... 5 5
3 .6 P R IN C IP A L I S O F T W AR E D I V IR T U A L I Z Z A Z IO N E ........................... 5 9
CAPITOLO 4
REALIZZAZIONE DEL PR OGETTO ......................... 63
4 .1 A N A L IS I D E L P R O B LE M A ................................ ........................ 6 4
4 .2 I N S T A L L A Z IO N E E C O N F I G U R A Z IO N E D E I D U E N O D I .................... 6 7
4 .2 .1 C H A N N E L B O N D IN G ................................ .................... 6 8
4 .3 C O N F IG U R A Z IO N E D E L L O S T O R A GE C O N D IV IS O ......................... 7 3
4 . 3 .1 T IP O L O G IE D I S T O R A G E ............................................... 7 4
4 . 3 .2 C A R A T T E R IS T IC H E D I DRB D ................................ ........ 8 1
4 .3 .2 .1 I P R O T O C O L L I D I S IN C R O N IZ Z A Z IO N E ................ 8 3
4 . 3 .3 I N S T A L L A Z IO N E E C O N F I G U R A Z IO N E D I D R B D ................ 8 5
4 .3 .3 .1 I L F I L E D I C O N F I G U R A Z IO N E " D R B D . C O N F " ........ 8 8
4 .4 C O N F IG U R A Z IO N E D I H E AR T B E A T ................................ ........... 9 5
4 . 4 .1 L A S T R U T T U R A D I H E AR T B E A T ................................ ..... 9 5
4 .4 .1 .1 I P L U G IN D I H E A R T B E A T ................................ . 9 9
4 .4 .2 I R E S O U R C E G R O U P ................................ .................. 1 0 1
4 . 4 .3 I N S T A L L A Z IO N E E C O N F I G U R A Z IO N E D I H E A R T B E A T ...... 1 0 2
4 .5 C O N F IG U R A Z IO N E D E L L E V IR T U A L M AC H IN E ........................... 1 1 2
4 . 5 .1 I N S T A L L A Z IO N E E C O N F IG U R A Z IO N E D I VM W AR E S E R V E R 1 1 3
4 .5 .2 I N S T A L L A Z IO N E D E L L E V IR T U A L M AC H IN E S ................. 1 1 9
4 .6 I N T E GR A Z IO N E D I T U T T O I L S IS T E M A ................................ ..... 1 2 5
4 .7 T E S T IN G D E L P R O GE T T O ................................ ...................... 1 3 7
II
———————————————————————————————— INDICE
CONCLUSIONI ........................................................ 144
APPENDICE A - I FILE DEL S.O. ............................ 147
APPENDICE B - I FILE DI DRBD ............................ 155
APPENDICE C - I FILE DI HEARTBEAT ................ 161
APPENDICE D - I FILE DI PROGETTO .................. 173
BIBLIOGRAFIA ....................................................... 177
III
——————————————————————————ELENCO DELLE FIGURE
Elenco delle figure
2 .1
P R O B AB I L I C A U S E D I D O W N T IM E ................................ ........... 1 9
2 .2
I C O S T I D E L L ' A L T A A F F ID AB I L IT À ................................ ......... 2 2
2 .3
C L U S T E R IN C O N F IG U R A Z IO N E A C T IV E - S T A N D B Y .................... 2 7
2 .4
C L U S T E R IN C O N F IG U R A Z IO N E A C T IV E - A C T IV E ....................... 2 8
2 .5
C L U S T E R IN C O N F IG U R A Z IO N E L O A D B A L A N C IN G .................... 2 9
3 .1
E S E M P IO D I V IR T U A L IZ Z A Z IO N E ................................ ............ 3 3
3 .2
M U L T IP L A Z IO N E
TEMPORA LE
NEGLI
A M B IE N T I
VIR TUALI
D E G L I A N N I S E S S A N T A ................................ ......................... 3 5
3 .3
S C H E M A A L IV E L L I D E L L A S T R U T T U R A D I U N C A LC O L A T O R E
S E N Z A V IR T U A L M AC H IN E
3 .4
................................ .................... 3 7
SCHEMA
DI
V IR T U A L I
................................ ................................ .......... 3 8
UN
C ALC OLAT ORE
DOTATO
DI
M AC C H I N E
3 .5
S T R U T T U R A D E L V IR T U A L M A C H IN E M O N IT O R ....................... 4 5
3 .6
I N T E R C E T T A Z IO N E D E L L E E C C E Z IO N I D E L D IS P A T C H E R ............. 4 7
3 .7
S IS T E M A D I IN D IR IZ Z AM E N T O D E L L A M E M O R I A N E L VMM ........ 5 2
3 .8
M AS C H E R AM E N T O D E L L I V E L L O H AR D W A R E N E L V MM ............ 5 8
3 .9
T AB E L L A
C O M P AR A T IV A
DEI
P R IN C IP A L I
SOFTWARE
DI
V IR T U A L I Z Z A Z IO N E ................................ ............................. 6 2
4 .1
F O T O D E L N O D O A L P H A ................................ ....................... 6 6
4 .2
F O T O D E L N O D O B R A V O ................................ ....................... 6 6
4 .3
SCHEMA
DEL
PROGETTO
C H AN E L L B O N D IN G
D OPO
L ' IN S T A L L A Z IO N E
DEL
................................ ............................. 7 3
4 .4
I M P O S T A Z IO N E D I D RB D P E R L ' A V V IO A L B O O T ...................... 8 7
4 .5
S C H E M A D E L P R O G E T T O D O P O L ' IN S T A L L A Z IO N E D I DRB D ....... 9 4
4 .6
S C H E M A D E I M O D U L I D I H E AR T B E A T ................................ ..... 9 6
4 .7
M O D U L I E S T E R N I D I H E A R T B E A T ................................ .......... 9 9
4 .8
I M P O S T A Z IO N E D I H E AR T B E A T P E R L ' A V V IO A L B O O T ............. 1 0 4
IV
——————————————————————————ELENCO DELLE FIGURE
4 .9
SCHEMA
DEL
PROGETTO
D OPO
L ' IN S T A L L A Z IO N E
DI
H E AR T B E A T ................................ ................................ ..... 1 1 1
4 .1 0 L A
F IN E S T R A
DI
L O G IN
DI
V M W AR E
MANAGEMENT
I N T E R F AC E ................................ ................................ ...... 1 1 8
4 .1 1 L A S C H E R M A T A IN I Z I A L E D I VM W A R E S E R V E R C O N S O L E ........ 1 2 0
4 .1 2 F A S I IN IZ I A L I D E L L A C O N F IG U R A Z IO N E D I U N A V M C O N
VM W A R E S E R V E R C O N S O L E ............................................... 1 2 1
4 .1 3 C O N F IG U R A Z IO N E H AR D W A R E D I U N A V M C O N VM W A R E
S E R V E R C O N S O L E ................................ ............................. 1 2 3
4 .1 4 I N S T A L L A Z IO N E D E L S IS T E M A O P E R A T IV O IN U N A M AC C H IN A
V IR T U A L E ................................ ................................ ........
123
4 .1 5 L E F A S I D I IN S T A L L A Z I O N E D E I VM W A R E T O O L S IN U N A
M AC C H IN A V IR T U A L E
................................ ........................ 1 2 5
4 .1 6 A V V IO D I H E AR T B E A T E T E S T D I F U N Z IO N A L I T À D E L L O
S C R IP T R E A L I Z Z A T O
................................ .......................... 1 3 4
4 .1 7 S C H E M A F IN A L E D E L P R O G E T T O ................................ .......... 1 3 5
4 .1 8 F O T O D E L C L U S T E R N E L L A C O N F I G U R A Z IO N E D E F I N IT IV A ....... 1 3 6
4 .1 9 L A M UI M O S T R A L O S T A T O D E L L E Q U A T T R O M AC C H IN E
V IR T U A L I S U L N O D O A L P H A ................................ ................
140
4 .2 0 I L C L IE N T K M A I L M O S T R A L A S E Q U E N Z A D I M E S S A G G I D I U P E
D O W N D E L L E M AC C H IN E V IR T U A L I
................................ ...... 1 4 1
4 .2 1 S C H E D A D E L P R O G E T T O A S E G U I T O D E L C R AS H S I M U L A T O ...... 1 4 3
V
————————————————————————————— INTRODUZIONE
Introduzione
Il presente lavoro di tesi è stato svolto presso l’Area Servizi TecnicoSistemistici
della
Ripartizione
Servizi
Informatici
e
Statistici
dell’Università degli studi di Perugia.
Il progetto ha avuto come scopo la ricerca, lo studio e
l’implementazione di una soluzione completamente open-source
finalizzata alla virtualizzazione di alcune macchine, utilizzando come
sistema ospite un Cluster composto da due nodi configurato per
l’erogazione di servizi in alta affidabilità (High Avaiability o HA).
Nella sala macchine dell’Ateneo, come in molte altre aziende, si è
notato che diverse macchine server vengono utilizzate ampliamente al
disotto delle loro potenzialità. Questo significa nella pratica che, per la
maggior parte del tempo, il processore di tali macchine resta inutilizzato,
in attesa che gli venga dato qualcosa da fare.
Di fatto questa situazione rappresenta per l’amministrazione un
inutile spreco di risorse: gli investimenti finanziari effettuati per
l’acquisto di tali macchine e il tempo richiesto ai sistemisti per la loro
gestione, potrebbero essere facilmente recuperati mediante un attento
VI
————————————————————————————— INTRODUZIONE
consolidamento, avente come fine ultimo l’accorpamento in un unico
server delle attività svolte da un insieme di macchine.
Proprio sulla base dei principi appena illustrati, la Ripartizione
Servizi Informatici e Statistici ha deciso attraverso questo lavoro di tesi
di sperimentare la virtualizzazione di alcune delle sue macchine,
ponendosi fondamentalmente due obiettivi: da un lato la minimizzazione
delle spese necessarie alla realizzazione del progetto stesso e dall’altro il
miglioramento della qualità dei servizi offerti con particolare riferimento
alla loro affidabilità.
Nei
capitoli
iniziali
verranno
illustrate
le
caratteristiche
fondamentali delle teorie alla base di questo lavoro. Nel primo capitolo si
affronterà un analisi dei fondamenti e delle tipologie di sistemi
distribuiti,
soffermandosi
in
particolare
sui
sistemi
operativi
maggiormente utilizzati e sulle differenze tra cluster per il calcolo
scientifico e cluster per l’alta affidabilità.
Nel secondo capitolo si proseguirà con una attenta descrizione dei
diversi livelli di disponibilità, dei requisiti fondamentali, delle vari livelli
prestazionali dell’affidabilità e delle varie tipologie che caratterizzano un
cluster in high avaiability.
Nel terzo capitolo verranno affrontati i concetti basilari su cui si
fondano le teorie della virtualizzazione: dagli aspetti fondamentali ai
requisiti indispensabili per la sua attuazione. Nella parte conclusiva del
capitolo verrà infine descritta, in modo dettagliato, l’architettura alla base
VII
————————————————————————————— INTRODUZIONE
della virtualizzazione con particolare riferimento ai benefici introdotti da
questa tecnica ed ai principali software utilizzati.
Nel quarto e ultimo capitolo verrà affrontata la fase di analisi di
questo lavoro di tesi, si cercherà di far capire il percorso logico e le
motivazioni che hanno condotto alle scelte adottate all’interno del
progetto. Si partirà in principio con una panoramica delle potenziali
soluzioni a disposizione, sia dal punto di vista software che da quello
hardware, e si proseguirà poi con un dettagliato studio delle informazioni
raccolte
che
porterà
alla
definizione
delle
scelte
progettuali
effettivamente adottate nella fase realizzativa. La seconda parte del
capitolo è invece incentrato sull’implentazione pratica del lavoro ed in
particolare sull’installazione e la configurazione degli strumenti scelti per
la messa in opera del progetto. Il primo di questi strumenti è il modulo
DRDB che, in combinazione con il meccanismo del channel bonding,
fornisce ai sistemi operativi appartenenti al cluster, un dispositivo di
memorizzazione di massa condiviso realizzato attraverso le partizioni dei
dischi reali. Nei paragrafi seguenti verrà prima configurata la suite
Heartbeat, indispensabile per garantire l’alta disponibilità del sistema, e
successivamente VMWare Server per la virtualizzazione. Nella parte
conclusiva del capitolo verranno infine illustrate le modifiche necessarie
per integrare gli strumenti mostrati e rendere operativo l’intero progetto.
Chiudono il lavoro di tesi una serie di appendici contenenti i file testuali
relativi alla configurazione dei software utilizzati.
VIII
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
Capitolo 1
1 Sistemi distribuiti: generalità
Nonostante l’informatica sia una scienza relativamente moderna è
riuscita nel corso del tempo ad invadere ogni strato della società civile.
Il suo sviluppo, avvenuto contestualmente all’invenzione delle
macchine in grado di eseguire calcoli in modo automatico ed in brevi
lassi di tempo, ha consentito agli studiosi di addentrarsi in realtà prima
di allora inesplorate.
I primi computer erano in grado di risolvere solo problemi
elementari, ma grazie alla ricerca e agli investimenti negli ambienti
accademici e in quelli aziendali, la scienza informatica è stata
progressivamente in grado di progettare elaboratori sempre più potenti,
denominati supercomputer, capaci di risolvere problematiche sempre
più evolute.
La crescente richiesta di ingenti capacità elaborative in molti
settori legati alla ricerca e all’analisi di realtà complesse (scientifica,
finanziaria, ecc…) condussero molte aziende a realizzare prodotti
1
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
informatici specializzati e progettati appositamente allo scopo ma a
prezzi decisamente elevati.
Il successivo avvento dell’informatica personale e la creazione di
ciò che può esserne ritenuto il suo simbolo, il personal computer (PC),
portarono realtà consolidate come i supercomputer a diminuire la loro
incidenza sul mercato. La diffusione dei PC a prezzi modesti indusse la
richiesta di capacità di calcolo ad orientarsi verso soluzioni a basso
costo; nacquero così software in grado di ―virtualizzare‖ un gruppo di
macchine, creando un unico sistema in grado di redistribuire il carico
operativo su ogni singolo componente.
Un gruppo di computer, uniti allo scopo di risolvere insieme un
problema comune e visibili all’utente come un unica macchina virtuale,
viene definito sistema distribuito o cluster1
Il paradigma alla base del sistema distribuito è assimilabile alla
teoria del ―divide et impera‖, tipica degli studi sugli algoritmi, secondo
la quale ogni problema può essere risolto con una scomposizione in
sottoproblemi più piccoli, la cui risoluzione genera una parte della
soluzione complessiva del problema primario. L’applicazione di questo
schema di ragionamento incorpora il concetto di modularità che
1
Un cluster (dall’inglese grappolo) è un insieme di computer connessi tramite una
rete telematica. Lo scopo di un cluster è quello di distribuire una computazione molto
complessa tra i vari computer componenti il cluster. In sostanza un problema che
richiede molte elaborazioni per essere risolto viene scomposto in sottoproblemi
separati i quali vengono risolti in parallelo. Questo aumenta, ovviamente, la potenza
di calcolo del sistema
2
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
caratterizza tutti i moderni sistemi di calcolo, in modo particolare i
sistemi distribuiti.
Un sistema distribuito, infatti, non è altro che un insieme di
calcolatori identici che vengono comunemente definiti ―nodi‖. In un
sistema di questo tipo si ha la possibilità di aggiungere o eliminare nodi
generando rispettivamente un aumento oppure una diminuzione di
potenza di calcolo complessiva dell’intero sistema. Questa particolare
caratteristica prende il nome di scalabilità. In generale un sistema si
definisce scalabile quanto l’aumento delle prestazioni di calcolo
aumenta in modo proporzionale al numero di nodi del sistema.
Secondo la definizione principale, un cluster è un sistema
distribuito composto da un numero non specificato di singoli computer
definiti ―processori‖ o più semplicemente ―nodi‖, interconnessi tra loro
da una rete di comunicazione privata utilizzata esclusivamente per la
sincronizzazione dei dati e l’interscambio di messaggi fra i processi in
esecuzione e che condividono delle risorse locali o remote[1].
1.1 Architettura
In funzione della modalità con cui le risorse utilizzate dai nodi sono
disposte e gestite, un sistema distribuito può essere principalmente
distinto in due categorie[2]:
3
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ

Sistemi Tightly Coupled o anche definiti Shared Memory, la cui
caratteristica distintiva sta nel fatto che ogni singolo nodo del
cluster condivide la medesima porzione di memoria, utilizzata
anche per scopi di comunicazione e sincronizzazione;

Sistemi Loosely Coupled, si differenziano dai precedenti per il
fatto che ognuno dei nodi utilizza e gestisce autonomamente la
propria memoria principale e lo scambio di informazioni tra i
processi avviene mediante una tecnica denominata di ―Message
Passing‖.
La specializzazione che rivestono i diversi nodi all’interno del cluster,
classifica ulteriormente un sistema distribuito, consentendo di
individuare dei modelli che meglio definiscono la tipologia di
soluzione adottata.
Fanno parte della categoria Tightly Coupled i sistemi definibili
come minicomputer che in realtà non sono altro che sistemi dotati di un
certo numero di processori che condividono le stesse risorse
centralizzate mantenendo al contempo caratteristiche di scalabilità e
modularità. La sincronizzazione delle operazioni e lo scambio di
messaggi tra di essi avviene utilizzando aree della memoria principale
ed ogni operazione d’inserimento dati e consultazione viene realizzata
utilizzando appositi terminali oppure workstation.
Nella categoria Loosely Coupled possiamo individuare i seguenti
modelli [3]:
4
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ

workstation model: comprendono quei sistemi caratterizzati
dalla presenza di un insieme di workstation che gestiscono
autonomamente le proprie risorse e che sono dotate sia di un
sistema di gestione dei processi locali, sia di un sistema per la
gestione dei processi remoti in grado di spostare i processi sui
nodi meno carichi;

workstation-server model: è un modello caratterizzato dalla
flessibilità del modello workstation model, dato che anch’esso è
costituito da un gruppo di workstation interconnesse, ma eredita
anche i vantaggi del modello a minicomputer. Tale soluzione
permette l’esecuzione di operazioni generiche sulle workstation
e di operazioni particolarmente specializzate sui minicomputer
dedicati. I vantaggi forniti da questo modello possono essere di
importanza
rilevante,
quando
sono
richiesti
livelli
di
performance molto elevati, spesso infatti la scelta risulta
obbligata. Grazie a questo modello, per esempio, è possibile
centralizzare
le
risorse
di
memorizzazione
di
massa
predisponendo un minicomputer come file server, al fine di
fornire
prestazioni
eccellenti
nell’input/output
dei
dati,
semplificare la manutenzione, evitare un traffico eccessivo
nella migrazione dei processi dati ed eseguire elaborazioni
remote attraverso protocolli di tipo client-server;
5
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ

processor pool model: è caratterizzato dalla presenza di nodi
generici non specializzati che vengono dinamicamente allocati
dal sistema di gestione delle risorse e che vengono rappresentati
esternamente con l’immagine di un sistema singolo. L’utente
che deve utilizzare le risorse di calcolo del cluster, non si
collega in modo diretto ai nodi, ma a terminali specializzati che
non fanno parte del cluster. Pertanto la percezione che ne risulta
è quella di collegarsi direttamente all’interno del sistema. Per le
sue caratteristiche di praticità ed efficacia, questo modello,
risulta essere quello più diffuso tra gli attuali cluster adibiti al
calcolo scientifico.
1.2 Sistemi Operativi tipici dei cluster
Una parte cruciale nel corretto funzionamento dei sistemi distribuiti è
svolta dal sistema operativo che deve essere in grado di consentire e
favorire le operazioni tipiche eseguite da un cluster. Si possono in tal
senso distinguere due classi di sistemi operativi per cluster denominati
Network
Operating System e Distributed Operating System. Le
differenze fra i due possono essere individuate, in particolare,
nell’immagine che l’utente percepisce dell’intero sistema [4].
6
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
Un Network Operating System coordina i diversi sistemi operativi
presenti su ogni nodo, demandati alla gestione delle risorse locali,
dando all’utente la possibilità di conoscere quali sono i nodi che
costituiscono il cluster, il loro stato e il nodo sul quale eseguire la
computazione.
Un Distributed Operating System invece si prende in carico la
gestione dell’onere di assegnamento del lavoro ai diversi nodi del
cluster, fornendo all’utente l’immagine di un sistema unico. È evidente,
in questo caso, che i malfunzionamenti di ciascun nodo vengono
nascosti all’utente, dato che egli stesso non conosce come il sistema è
costruito.
Un sistema operativo distribuito è estremamente complesso, sia
perché deve consentire performance, scalabilità e affidabilità nella
gestione dei suoi componenti, ma anche e soprattutto per la sicurezza
che deve garantire sicurezza visto l’utilizzo contemporaneo di diversi
utenti.
La necessità di utilizzare un sistema operativo con le
caratteristiche appena esposte e nel contempo di abbattere i costi del
software, ha fatto si che il sistema operativo GNU/Linux2 giocasse un
2
Si noti la differenza tra le diciture Linux e GNU/Linux. La prima sta ad indicare il
solo kernel del sistema operativo sviluppato originariamente da Linus Torvalds, la
seconda indica invece l'insieme del kernel Linux e di svariati programmi open-source
facenti capo al progetto GNU il cui padre è Richard Stallman. Spesso questo insieme
più o meno esteso può costituire una °distribuzione Linux‖ creata da chiunque ed
eventualmente messa in vendita. A volte si dice ―Linux‖ per riferirsi erroneamente ad
una intera distribuzione quando invece il termine ―Linux‖ sta ad indicare il solo
kernel.
7
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
ruolo chiave per la definizione e l’implementazione di modelli di
clustering.
GNU/Linux è un sistema UNIX-Like notoriamente orientato alle
reti e che ha come vantaggio non trascurabile, oltre alla stabilità e
l’efficienza tipica di tutti i sistemi *NIX, il fatto di essere
completamente open-source e quindi generalmente gratuito.
È evidente come la caratteristica open-source di tali prodotti sia
garanzia di trasparenza e stabilità, per il fatto che chiunque può
analizzare, modificare e correggere il codice sorgente.
1.3 Tipologie di cluster
Un cluster può, in generale, essere visto come un insieme di nodi
ognuno dei quali è un fornitore di servizi per tutto l’insieme.
All’interno del cluster si avranno quindi diverse tipologie di nodi
con specifici compiti per la collettività come File Server, Batch Server,
Tape Server o nodi che offrono servizi specializzati come NIS, DNS,
Web, Mail, FTP e così via.
Per passare da un insieme di sistemi interconnessi ad un cluster
sono necessari almeno tre elementi:

un meccanismo di condivisione delle informazioni
amministrative;
8
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ

un’architettura con forte centralizzazione delle immagini di
sistema (auspicabile ma non essenziale);

un meccanismo di gestione della schedulazione di richieste
delle risorse.
Quest’ultimo punto (insieme alla distribuzione sui vari nodi di tali
richieste) è il primo valore aggiunto che deve essere previsto dopo lo
startup iniziale.
Ovviamente la topologia del cluster e soprattutto la sua architettura
vanno selezionate in base alle diverse esigenze degli utilizzatori ed al
particolare contesto in cui si viene ad operare.
Mentre un responsabile IT (Information Technology) potrebbe
essere interessato al mantenimento della massima affidabilità dei propri
server o alla diminuzione del tempo generale di esecuzione delle
applicazioni e dei servizi di punta della sua organizzazione, un fisico
delle alte energie potrebbe essere interessato alla simulazione su larga
scala o alla disponibilità di enormi quantità di dati sperimentali
fisicamente distribuiti suWAN.
In definitiva la distinzione fondamentale sulle tipologie di cluster è
legata essenzialmente alle finalità cui il cluster è destinato, si possono
quindi individuare almeno quattro categorie distinte [5]:

cluster per l’affidabilità dei servizi;

cluster per l’alta disponibilità dei servizi (High Avaiability
oppure HA)
9
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ

cluster per il bilanciamento del carico (Load Balancing
oppure LB);

cluster per il calcolo parallelo.
Cluster per l’affidabilità dei servizi
Tale soluzione prevede la predisposizione di un insieme di sistemi che
devono mantenere copie separate dei servizi e che rispondono
comunque ad un unico nome host virtuale con il quale i client
interrogano il singolo servizio.
Essenzialmente, avendo a disposizione un cluster con forte
centralizzazione delle immagini di sistema e di quelle applicative,
diverse tipologie di servizi di rete si prestano per far sì che ogni singolo
nodo del cluster possa, nel caso si renda necessario, diventare un nodoservizio.
Questo permette di avere una scalabilità dei servizi a costi irrisori
rispetto ad un eventuale cambio architetturale (ad esempio da low ad
high level server).
Il punto cruciale di questo modello è il servizio di virtualizzazione
dei nomi macchina a livello DNS (fino ad arrivare a criteri avanzati di
load balancing) e la gestione del carico della rete (attuabile con
l’introduzione di router in grado di effettuarne il bilanciamento del
carico).
10
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
Cluster per l’alta disponibilità dei servizi
Se il modello di affidabilità risponde alla domanda di scalabilità, quello
di alta disponibilità risponde alla domanda di continuità di servizio,
puntando sull’eliminazione dei punti deboli del sistema comunemente
definiti single point of failure.
Un cluster per l’alta disponibilità (HA cluster) è costituito
essenzialmente da due (o più) server gemelli, nei quali meccanismi
hardware e software permettono di far sì che se il nodo principale del
cluster HA si blocca, il nodo secondario, fino a quel momento in attesa,
si riconfiguri per apparire come il nodo principale del cluster, con
un’immagine congrua al nodo originale immediatamente prima della
sua indisponibilità (ovvero senza perdite di dati sensibili).
All’utente
finale,
attraverso
complessi
algoritmi
per
la
determinazione delle variazioni di stato dei sistemi, l’intero processo di
riconfigurazione apparirà come una breve indisponibilità temporanea
del servizio.
Tale modello è particolarmente indicato per tipologie di servizi
come File Server, Web Server o Database Server.
Cluster per il bilanciamento del carico
Un load balancing cluster può essere un incomparabile strumento di
produttività. L’idea (che estende il modello di affidabilità) è quella di
introdurre un sotto-sistema di schedulazione delle richieste applicative,
11
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
ad esempio un sistema di code che sia in grado di reindirizzare la
richiesta sul nodo più scarico, in grado di far fronte alla richiesta
utente.
I sotto-sistemi di questo tipo solitamente sono dotati di vari
strumenti amministrativi che permettono un controllo molto fine
sull’utilizzo delle risorse e che consentono un monitoraggio avanzato
dello stato del cluster.
L’asintoto attuale di questo modello è rappresentato dalla
possibilità di includere a livello kernel i meccanismi di schedulazione,
la gestione dello spazio globale delle risorse (file system e processi) e la
gestione delle politiche di bilanciamento del carico e della migrazione
dei processi.
Cluster per il calcolo parallelo
La ragione principale per cui molti sforzi si sono concentrati verso lo
sviluppo di architetture cluster per il calcolo parallelo basate su PC
sono i costi.
In questo modo, invece di rincorrere a colpi di milioni di dollari
l’ultimo supercomputer in grado di far fronte alle sempre maggiori
richieste di TeraFlops (trilioni di operazioni in virgola mobile per
secondo), si è sempre più affermata l’idea di assemblare grandi
quantità di processori classe PC con una struttura di comunicazione a
banda larga e bassa latenza, appositamente progettata.
12
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
Per mantenere tali caratteristiche a volte viene utilizzato un
protocollo di rete diverso dal TCP/IP (come ad esempio Myrinet), che
contiene
troppo
overhead
rispetto
alle
limitate
esigenze
di
indirizzamento, routing, e controllo nell’ambito di una rete di cui i nodi
siano ben noti a priori.
In alcuni casi viene utilizzato un meccanismo di Direct Memory
Access (DMA) fra i nodi, fornendo una sorta di distribuited shared
memory che può essere acceduta direttamente da ogni processore su
ogni nodo.
È previsto, inoltre, un livello di comunicazione a scambio di
messaggi (message passing) per la sincronizzazione dei nodi, le cui
implementazioni più diffuse sono rappresentate da MPI (Message
Passing Interface), OpenMP (Open Message Passing) e PVM
(Parallel Virtual Machine).
MPI è una API (Application Program Interface) per gli
sviluppatori di programmi paralleli che garantisce una piena astrazione
dell’hardware correntemente utilizzato senza alcuna necessità di
inserire nel codice del programma alcuna direttiva di effettiva
distribuzione dei segmenti di codice fra i nodi del cluster garantendo,
fra l’altro, una buona portabilità del codice prodotto.
PVM permette ad un insieme di computer di essere visto come una
singola macchina parallela; la Parallel Virtual Machine è composta da
13
————————————————————— SISTEMI DISTRIBUITI: GENERALITÀ
due entità principali: il processo PVM daemon su ogni processore e
l’insieme delle routine che ne forniscono il controllo [6].
14
————————————————————————— L’ALTA DISPONIBILITÀ
Capitolo 2
2 L’alta disponibilità
Nel corso del capitolo si cercherà di chiarire in profondità il concetto di
alta disponibilità. Si tenga presente che lo scopo di un sistema in High
Avaiability, o in sintesi HA, è nella pratica quello di fornire la capacità
di fault tolerance3 all’erogazione di un servizio.
Tale funzionalità può ritenersi cruciale ed indispensabile per
servizi di particolare importanza ma, grazie ad un progressivo
abbattimento dei costi di realizzazione derivati dall’utilizzo di
hardware ad ampia diffusione in congiunzione con la nascita di
software open-source e gratuito, si può scegliere di dotare di tale
funzionalità anche servizi che non sono particolarmente critici.
3
Con il termine fault tolerance (letteralmente ―tolleranza ai guasti‖) si intende la
capacità di un sistema di non subire fallimenti ovvero interruzioni di servizio, anche
in presenza di guasti. È importante notare che la tolleranza ai guasti non garantisce
l’immunità da tutti i guasti, ma solo che i guasti per cui è stata progettata una
determinata protezione non causino fallimenti.
15
————————————————————————— L’ALTA DISPONIBILITÀ
2.1 Livelli di disponibilità
La disponibilità di un servizio può essere definita come una serie
stratificata di livelli concentrici, ed ognuno dei quali include il
precedente e lo estende con nuove funzionalità, essi possono essere
schematizzati nel seguente modo [7]:

Livello 1: Disponibilità normale. Rappresenta il livello
minimo di disponibilità. L’unica protezione contro eventuali
interruzioni nell’erogazione del servizio è il backup dei dati,
eseguito secondo una politica decisa e posta in essere
dall’amministratore di sistema. Risulta evidente che in caso di
guasto con il successivo ripristino del sistema e delle
informazioni gestite, potrebbe essere possibile ottenere solo
parte dei dati, che risulterebbero così aggiornati in modo
incompleto (in funzione della frequenza con cui vengono
eseguiti e conservati i backup). È altresì ovvio che l’erogazione
del
servizio
potrà
essere
ripresa
solamente
quando
l’amministratore avrà completato il restore dell’intero sistema e
riterrà sicuro e opportuno riprendere l’erogazione del servizio
agli utenti. Il tempo di ripresa dell’attività è pertanto
inevitabilmente legato ad un fattore umano. Attente analisi,
svolte nell’ambito di questa problematica, hanno dimostrato che
in situazioni critiche, quali il ripristino di un sistema
16
————————————————————————— L’ALTA DISPONIBILITÀ
informativo, l’incidenza dell’errore umano aumenta in modo
esponenziale, dilatando ulteriormente i tempi potenziali per la
ripresa del servizio.

Livello 2: Media disponibilità con protezione dei dati.
Lo scopo di un sistema, in grado di garantire questo livello di
disponibilità, è quello di garantire un miglior livello di
aggiornamento dei dati anche in caso di guasto di uno o più
dischi (in funzione del tipo di tecnologia utilizzata).
Tale obiettivo è raggiunto attraverso la replicazione fisica dei
dati memorizzati sui dischi attraverso una tecnologia definita
RAID4. Anche in questa situazione, come in quella presentata
precedentemente, è possibile mantenere i dati aggiornati anche
nell’eventualità di danni lievi ai dispositivi di memorizzazione
di massa in uso. Tuttavia la ripresa dell’erogazione piena del
servizio dipenderà comunque, seppure in modo minore, dalla
disponibilità
dell’amministratore
di
sistema
che
dovrà
intervenire manualmente per riportare la funzionalità allo stato
normale.

Livello 3: Alta disponibilità con protezione del sistema.
Questo livello garantisce la protezione del sistema e
l’erogazione dei servizi ad esso collegati, anche in caso di
guasto di una porzione particolarmente significativa del
17
————————————————————————— L’ALTA DISPONIBILITÀ
sistema. Risulta evidente come questo livello rappresenti un
notevole salto di qualità rispetto ai quelli appena presentati. In
soluzioni di questo tipo non si è più dipendenti dal livello di
disponibilità dell’amministratore di sistema e soprattutto la
ripresa dell’erogazione del servizio non è più vincolata ad
eventuali errori umani. Un sistema implementato secondo
queste specifiche è costituito da un cluster di almeno due nodi,
configurati in modo che il secondo intervenga automaticamente
prendendo il posto del primo, nel caso in cui quest’ultimo non
fosse più in grado di erogare il servizio per un evento casuale
(rottura di
un
componente hardware) oppure previsto
(manutenzione programmata del sistema).

Livello 4: Disaster Recovery con protezione del sito.
Questo
livello,
che
rappresenta
l’evoluzione
dell’alta
disponibilità, permette di mettere al riparo i dati anche da eventi
che comportino la distruzione dell’intero sito nel quale sono
fisicamente collocate le macchine. Essenzialmente, si procede
con una replicazione dell’intera infrastruttura di sistema e dei
dati in essa contenuti, in un’area dislocata geograficamente
lontano, più o meno distante in funzione del livello di fault
tolerance che si vuole ottenere.
4
RAID: Acronimo di Redundat Array of Inexpensive Disk. Sistema di sicurezza che
consente la registrazione simultanea su più memorie degli stessi dati.
18
————————————————————————— L’ALTA DISPONIBILITÀ
Al fine di comprendere a fondo i motivi che impongono il ricorso
all’alta disponibilità nell’erogazione di un servizio, si riporta una
statistica redatta dall’IEEE5, che mostra le classiche cause di downtime
di un sistema di elaborazione [36][4].
15,00%
10,00%
30,00%
5,00%
40,00%
Malfunzionamenti Software
Downtime Pianificati
Persone
Hardware
Ambiente
Figura 2-1 Probabili cause di downtime.
Come si evince dal grafico, la causa principale di inattività dei sistemi
informatici è un malfunzionamento software che per sua natura è
praticamente impossibile da prevedere in quanto concerne errori di
5
IEEE: acronimo di Institute of Electrical and Electronic Engineers. Organismo
Americano che nasce nel 1963 dalla fusione di due istituzioni precedenti: l’IRE
(Institute of Radio Engineers) e l’AIEE (American Institute of Electic Engineers).
Scopo fondamentale è la promozione, lo sviluppo e l’applicazione di tecnologie e
19
————————————————————————— L’ALTA DISPONIBILITÀ
programmazione che si verificano unicamente in presenza di certe
condizioni ignote a priori.
Sulla base di questa analisi risulta evidente quindi che fornire un
servizio con la probabilità che quattro volte su dieci si interrompa, non
è di certo incoraggiante. Proprio per questo motivo l’adozione di un
cluster in alta disponibilità ben configurato, può ridurre drasticamente
le percentuali indicate nel grafico, eliminando i punti deboli del sistema
definiti SPF (Single Point of Failure).
2.2 Il requisito dei cinque 9
Un sistema in alta disponibilità viene tipicamente classificato sulla base
di tre fattori:

il tempo di disponibilità del servizio;

le prestazioni complessive del sistema;

l’economicità totale del sistema implementato.
È evidente come il tempo di disponibilità del servizio sia quello che
maggiormente caratterizza un sistema ad alta disponibilità. Proprio per
questo motivo uno dei parametri presi generalmente in considerazione
è il tempo di disponibilità garantita [4] definito come il rapporto
scienze per il beneficio dell’umanità attraverso la definizione di standard
internazionali.
20
————————————————————————— L’ALTA DISPONIBILITÀ
percentuale fra il tempo di erogazione effettiva del servizio ed il tempo
di osservazione.
L’obiettivo ideale di ogni sistema ad alta disponibilità è quello di
raggiungere la fatidica soglia dei ―cinque 9‖, ovvero un tempo di
erogazione effettiva del servizio pari al 99,999% del tempo totale di
osservazione.
Se prendiamo in considerazione un tempo di osservazione pari ad
un anno solare, si ricava facilmente che il tempo massimo consentito
per la sospensione del servizio è di soli 5 minuti e 15 secondi, che
equivalgono ad una media settimanale di 6 secondi. Tale valore è un
traguardo estremamente arduo da raggiungere, e sino a pochi anni fa
era raggiungibile solamente con implementazioni ad appannaggio di
grandi aziende specializzate nella creazione di sistemi ad alta
disponibilità e con grande impiego di risorse finanziarie.
Con l’affermarsi negli ultimi anni, in modo sempre più marcato,
della filosofia open-source, ed in particolare con la diffusione dei
sistemi operativi GNU/Linux, sono stati creati diversi strumenti gratuiti
per la realizzazione dell’alta disponibilità in grado di avvicinarsi alla
fatidica soglia del 99,999% di uptime del servizio.
I tempi di sospensione di un servizio, ammissibili secondo la
percentuale di erogazione del servizio stesso, sono riassunti nella
tabella seguente:
21
————————————————————————— L’ALTA DISPONIBILITÀ
Percentuale Uptime
Downtime per anno
Downtime per settimana
98,00%
7,3 giorni
3 ore, 22 minuti
99,00%
3,65 giorni
1 ora, 41 minuti
99,80%
17 ore e 30 minuti
20 minuti, 10 secondi
99,90%
8 ore e 45 minuti
10 minuti, 5 secondi
99,99%
52 minuti, 30 secondi
1 minuto
99,999%
5 minuti, 15 secondi
6 secondi
99,9999%
30,5 secondi
0,6 secondi
Tabella 2-1 Tempi di sospensione in base alla percentuale di erogazione.
Figura 2-2 I costi dell’alta affidabilità [43].
Per ottenere percentuali di uptime sempre più elevate, è
indispensabile analizzare nel dettaglio l’infrastruttura che si desidera
realizzare mirando all’eliminazione progressiva di ogni single point of
failure, ovvero tutti gli elementi la cui compromissione porterebbe ad
un inevitabile collasso dell’intera struttura, interrompendo pertanto
l’erogazione del servizio stesso.
22
————————————————————————— L’ALTA DISPONIBILITÀ
Le possibili soluzioni a questo problema sono essenzialmente di
due tipi: si può procedere con l’introduzione della ridondanza
dell’hardware chiave del sistema, oppure si possono adottare soluzioni
clusterizzate.
L’introduzione di componenti ridondati nel sistema, sebbene
migliori il livello di disponibilità medio del servizio, non pone al riparo
da diverse tipologie di guasto ed implica, se estremizzata, un
incremento smisurato dei costi di realizzazione.
A dimostrazione di quanto esposto si prenda in considerazione la
ridondanza di componenti relativamente economici quali le schede di
rete, gli hard disk o gli alimentatori, questo può portare ad avere
considerevoli vantaggi in termini di disponibilità con un leggero
aggravio in termini finanziari pari solo al 1-2% del costo totale del
sistema. Se si cerca però di ridondare componenti chiave quali CPU,
moduli di memoria RAM o controller RAID del sistema i costi possono
lievitare fino al 200-300% del costo del sistema base.
Come si può facilmente comprendere, un sistema così configurato
diviene poco conveniente in termini economici ed induce alla ricerca di
implementazioni alternative in grado di offrire gli stessi livelli di
disponibilità a costi decisamente più ridotti.
Con il passare degli anni e con l’evoluzione delle tecniche di
programmazione sia nei software che nei sistemi operativi, si sono
creati programmi in grado di trasformare una collezione di due o più
23
————————————————————————— L’ALTA DISPONIBILITÀ
personal computer in un sistema server virtuale in grado di erogare i
suoi servizi con livelli di continuità conformi alla fatidica soglia dei
cinque 9.
Tale tecnica prende il nome di clustering HA (High Avaiability) ed
attualmente è talmente diffusa da essere presente in ogni reparto
dell’Information Tecnology (IT). Aziende del calibro di Google,
Porsche, Sony, Motorola e FedEX stanno utilizzando da anni sistemi
basati sulla tecnologia Linux Virutal Server (ed in particolare LinuxHA) all’interno di diverse sezioni critiche della loro infrastruttura
informatica.
Il segreto di tale diffusione è da ricercarsi, probabilmente, nella
semplicità dell’idea che sta alla base di tale soluzione ad alta
disponibilità. Nell’implementazione più semplice si hanno due
macchine gemelle che sono in grado di erogare in modo
intercambiabile un determinato insieme di servizi e che, attraverso un
software di analisi dello stato dei servizi, sono in grado di commutare
l’erogazione del servizio stesso da un server ad un altro. In questo
modo se una delle macchine viene danneggiata mentre sta fornendo un
servizio, ad esempio a causa della rottura di un componente hardware,
il sistema automaticamente provvede a spostare l’erogazione del
servizio sul server superstite, escludendo dall’intera infrastruttura la
macchina danneggiata.
24
————————————————————————— L’ALTA DISPONIBILITÀ
L’affinamento di questi passaggi ed alcune accortezze in termini di
implementazione del servizio permettono di non far percepire il guasto
all’utente che non noterà discontinuità nell’erogazione del servizio.
2.3 Le prestazioni nell’alta disponibilità
Altra caratteristica non trascurabile di un sistema in alta disponibilità
sono le prestazione complessive nell’erogazione del servizio. In base
ad alcuni studi condotti sull’argomento da diverse aziende, ed in
particolare dal Gartner Group e dalla Forresters6, si evidenzia che il
tempo di attesa tollerabile dagli utenti dopo aver effettuato la richiesta
di un servizio va dai 4 ai 20 secondo in funzione del tipo di
applicazione.
Considerando questi dati, per rendere l’erogazione di un servizio
sufficientemente
continua
è
necessario
che
in
caso
di
malfunzionamenti legati al server, il tempo di recovery non superi di
molto la soglia prefissata. Si consideri inoltre che il tempo di risposta
di una singola transazione comprende, non solo il tempo di
elaborazione effettiva, che è l’unico sul quale si possono fare interventi
6
Gartner Group (www3.gartner.com), Forrester (www.forrester.com), sono enti di
ricerca e analisi che svolgono indagini sui più disparati argomenti: analisi di mercato,
analisi delle tendenze comuni e di comportamento.
25
————————————————————————— L’ALTA DISPONIBILITÀ
diretti, ma anche i tempi legati all’ampiezza di banda del sistema di
comunicazione fra il client e il server, e la latenza dei dispositivi .
Inoltre deve essere garantita una qualità nell’erogazione del
servizio indipendente dal numero degli utenti che contemporaneamente
lo richiedono: in altri termini il sistema deve essere dimensionato in
modo tale da supportare il numero massimo di utenti che
probabilmente possono richiedere il servizio in contemporane. Questo
fattore impone dunque la disponibilità di potenza elaborativa che sia
adeguata e facilmente e velocemente scalabile per far fronte ad
esigenze crescenti nel futuro.
Adottando una soluzione di ridondanza dei componenti, il
problema viene risolto potenziando l’hardware a disposizione,
sostituendo e aggiornando le periferiche che costituiscono il collo di
bottiglia7 del sistema. Questo induce però un aumento dei costi di
installazione oltre che una scarsa adattabilità dell’intera infrastruttura
all’aumento del carico computazionale.
La soluzione cluster, ancora una volta, mostra di poter risolvere il
problema in modo più efficiente ed economico; infatti la scalabilità
delle prestazioni del sistema viene ottenuta aumentando il numero dei
server sui quali è distribuito il carico di lavoro oppure aggiornando i
server utilizzati [4].
7
In ambito informatico con l’espressione ―collo di bottiglia‖ si indica un componente
hardware o software di un sistema di elaborazione che condiziona il resto del sistema
a prestazioni non efficienti.
26
————————————————————————— L’ALTA DISPONIBILITÀ
2.4 Tipologie di cluster in alta disponibilità
Scendendo maggiormente in dettaglio, a seguito di tutte le
considerazioni fatte fin qui, si distinguono due tipologie di cluster ad
alta disponibilità utilizzabili per l’erogazione di servizi:

Cluster Active-Standby (A-S) o Active-Active (A-A);

Cluster a bilanciamento di carico (Load Balancing cluster).
Nella tipologia di cluster Active-Standby i servizi offerti sono tutti
residenti su un solo nodo, vengono poi presi totalmente in carico
dall’altro nodo, precedentemente in standby, nel momento in cui il
nodo principale dovesse cadere.
ACTIVE
STANDBY
Web Server
Database Server
ACTIVE
Web Server
Database Server
ACTIVE
Web Server
Database Server
Figura 2-3 Cluster in configurazione Active-Standby.
27
————————————————————————— L’ALTA DISPONIBILITÀ
Nel modello Active-Active i servizi sono invece distribuiti su entrambi i
nodi, i quali si compensano a vicenda nel caso uno dei due dovesse
bloccarsi, prendendo in carico il lavoro di quel nodo in difficoltà.
ACTIVE
Web Server
ACTIVE
Web Server
ACTIVE
Database Server
ACTIVE
Database Server
Web Server
Figura 2-4 Cluster in configurazione Active-Active.
Il software che realizza queste configurazioni fra i nodi è in grado di
riconoscere lo stato dell’erogazione dei servizi e del funzionamento dei
nodi e quindi agire di conseguenza per far passare i servizi da un nodo
all’altro attraverso la migrazione dello storage, degli eventuali indirizzi
IP e la riattivazione degli stessi sull’altro nodo. Il tutto avviene in
maniera del tutto trasparente per l’amministratore che interviene
solamente per riportare il cluster nello stato di funzionamento standard,
28
————————————————————————— L’ALTA DISPONIBILITÀ
ma senza che il servizio erogato abbia subito interruzioni di qualsiasi
tipo.
Un cluster per il bilanciamento del carico è costituito, a differenza
dei precedenti, da un pool di nodi opportunamente configurati per
consentire la suddivisione dinamica e bilanciata del carico di lavoro
computazionale.
Load Balancing
LAN / WAN
Web Server 1
Web Server 3
Web Server 2
Figura 2-5 Cluster in configurazione Load Balancing.
In tale configurazione uno dei nodi assume un ruolo specializzato, in
quanto assolve alla funzione di dispatcher e ha quindi la facoltà di
ripartire tra i nodi generici il lavoro. Esso infatti è costantemente
consapevole del carico presente su ogni nodo e, in base alla politica
29
————————————————————————— L’ALTA DISPONIBILITÀ
scelta per la ripartizione, distribuisce i processi da elaborare in modo
opportuno.
Il trasferimento dei pacchetti dalla macchina che funge da load
balancer agli altri nodi incaricati di una certa elaborazione può avviene
con tecniche diverse che comprendono il Direct-Redirect, il NAT
(Network Address Translation) o l’IP-Tunneling.
E’ evidente che un cluster di questo tipo offre oltre che il
bilanciamento del carico e la scalabilità, per via della possibilità di
aggiungere nodi generici in ogni momento, la caratteristica di faulttolerance in quanto se uno dei nodi generici dovesse per qualunque
problema
rendersi
non
disponibile
verrebbe
automaticamente
trascurato e indirettamente verrebbe messo fuori dal cluster.
L’alta disponibilità viene realizzata completamente utilizzando per
il nodo dispatcher un cluster del tipo Active-Standby, eliminando così
il single point of failure.
Naturalmente un servizio di questo tipo si rende necessario solo
nel caso in cui il carico al quale viene sottoposto il server è
decisamente elevato, come può accadere per un web server aziendale.
In definitiva dunque l’architettura cluster è molto vantaggiosa per
realizzare l’alta disponibilità dei servizi erogati, è in grado di fornire
scalabilità nelle prestazioni se si utilizza la tipologia di cluster che
consente il load balancing e non ultimo risulta essere molto più
economica rispetto a soluzioni diverse che offrono le stesse
30
————————————————————————— L’ALTA DISPONIBILITÀ
caratteristiche, soprattutto in considerazione del fatto che il software
che ne permette l’implementazione può essere reperito in modo
gratuito oltre che open-source.
31
—————————————————————————— LA VIRTUALIZZAZIONE
Capitolo 3
3 La virtualizzazione
Il concetto di virtualizzazione è uno dei più pervasivi e utilizzati in
informatica. In [8] la virtualizzazione viene definita come:
[…] a framework or methodology of dividing the resources of a
computer into multiple execution environments, by applying one
or more concepts or technologies such as hardware and software
partitioning,
time-sharing,
partial
or
complete
machine
simulation, emulation, quality of service, and many others.
In particolare, la virtualizzazione definisce e implementa un livello di
astrazione rispetto alle risorse del computer: questo livello di astrazione
media tra le risorse fisiche del computer e il software che le utilizza.
Questa strategia permette di creare, all’interno della stessa macchina
fisica, più ambienti di esecuzione virtuali (le macchine virtuali) che
emulano il comportamento della macchina reale sottostante, mettendo a
32
—————————————————————————— LA VIRTUALIZZAZIONE
disposizione dei livelli superiori l’interfaccia esportata dall’hardware
della macchina.
Negli ultimi anni questa tecnologia è stata rivalutata, soprattutto
perché dà la possibilità di eseguire simultaneamente sulla stessa
macchina fisica diverse istanze di sistemi operativi. Ad esempio, è
possibile eseguire Linux, Windows e Solaris in concorrenza sulla stessa
macchina, sfruttando l’esistenza di diverse macchine virtuali all’interno
delle quali è possibile eseguire sistemi operativi (vedi fig. 3-1).
LINUX
CPU
MEM
WINDOWS
DISCO
MACCHINA VIRTUALE
CPU
MEM
DISCO
MACCHINA VIRTUALE
SOFTWARE DI VIRTUALIZZAZIONE
CPU
MEMORIA
DISCO
MACCHINA REALE
Figura 3-1 Esempio di virtualizzazione.
Il software di virtualizzazione è in grado di tenere traccia dello stato di
ogni sistema operativo in esecuzione nelle macchine virtuali, in maniera
simile a quella con cui un sistema operativo tradizionale tiene traccia
dello stato dei processi e, inoltre, fornisce protezione e isolamento tra le
macchine virtuali [9].
33
—————————————————————————— LA VIRTUALIZZAZIONE
Non solo si hanno benefici in termini economici, per cui, ad
esempio, è possibile consolidare su una macchina fisica diversi server,
ma altresì si hanno benefici in termini di controllo centralizzato degli
ambienti virtuali. È possibile salvare lo stato delle macchine virtuali o
sospendere l’esecuzione per poi ripristinarla successivamente, oppure si
può migrare una macchina virtuale tra diverse macchine fisiche.
3.1 Concetti generali
Le prime macchine virtuali furono implementate negli anni sessanta dalla
IBM con lo scopo di creare più ambienti di lavoro su un unico
calcolatore. Ogni macchina virtuale era una copia del sistema ospitante.
Istanziando più macchine virtuali si avevano a disposizione diversi
calcolatori (virtuali) pronti all’uso. L’obiettivo di questo meccanismo era
ottimizzare l’utilizzo del calcolatore reale (all’epoca molto oneroso)
permettendo allo stesso tempo il suo utilizzo da parte di più utenti in
contemporanea. Le risorse del calcolatore venivano condivise fra gli
ambienti virtuali creati attraverso una forma di multiplazione temporale
simile a quella che avviene nei moderni sistemi operativi tra i processi
(vedi fig. 3.2).
Esistono anche altri tipi di macchine virtuali che non sono incentrate
sull’utilizzo condiviso di un calcolatore. Esse hanno lo scopo di
34
—————————————————————————— LA VIRTUALIZZAZIONE
effettuare il porting, cioè l’adattamento, di applicazioni e sistemi
operativi tra calcolatori con architetture diverse.
Sistema
Operativo
1
Sistema
Operativo
2
Sistema
Operativo
3
Sistema
Operativo
1
Sistema
Operativo
2
t
Figura 3-2 Multiplazione temporale negli ambienti virtuali degli anni sessanta.
Ogni architettura hardware risponde a determinate specifiche descritte
dalle ISA (Instruction Set Architecture) che possiamo descrivere come
l’interfaccia di presentazione dell’architettura verso i propri utilizzatori. I
sistemi operativi e le applicazioni che devono lavorare con una
determinata architettura conoscono e rispettano solo quella determinata
ISA. Questo rende praticamente impossibile la portabilità dei sistemi
operativi fra le diverse architetture [10].
Per ovviare a questo problema esistono quindi particolari macchine
virtuali in grado di imitare architetture diverse da quella del sistema
operativo. Interponendo queste macchine virtuali fra il calcolatore
ospitante ed il sistema operativo impossibilitato a girare su tale
architettura si crea una nuova interfaccia in grado di tradurre le istruzioni
tra le due ISA.
Riepilogando, esistono due grandi famiglie di macchine virtuali con
obiettivi ben diversi:
35
—————————————————————————— LA VIRTUALIZZAZIONE

Condivisione delle risorse hardware di un calcolatore;

Emulazione di architetture hardware diverse da quelle in
possesso.
In generale un obiettivo esclude l’altro poiché, come sarà possibile
vedere, emulare totalmente una architettura diversa è molto dispendioso
eliminando di fatto la possibilità di prevedere altre macchine virtuali
istanziate contemporaneamente. Allo stesso modo, la ricerca di
prestazioni elevate in modo da poter avviare simultaneamente più
macchine virtuali implica l’introduzione di macchine virtuali che
emulano solo in parte un calcolatore fisico, che di conseguenza devono
essere simili.
3.2 Aspetti fondamentali
La progettazione di un sistema complesso è facilitata da un approccio a
livelli di astrazione. In questo modo è possibile progettare una parte del
sistema senza considerare i dettagli delle altre parti. Ogni livello di
astrazione è rappresentato ai livelli superiori attraverso una interfaccia
che ne rappresenta il funzionamento senza scendere nei dettagli
implementativi e costrutti del livello, si può pertanto dividere la struttura
di un calcolatore in tre livelli di astrazione (vedi fig. 3.3).
36
—————————————————————————— LA VIRTUALIZZAZIONE
Applicazione Utente
Applicazione Utente
API
Sistema Operativo
ISA
Hardware
Figura 3-3 Schema a livelli della struttura di un calcolatore senza virtual machine.
Il livello hardware comprende la parte fisica del calcolatore (CPU,
memoria, dispositivi di I/O, ecc…). Esso viene interfacciato ai livelli
superiori attraverso le ISA (Instruction Set Architecture) cioè un insieme
di istruzioni macchina proprie di una architettura con cui è possibile
interagire con il livello hardware stesso.
I livelli successivi sono di tipo software ovvero non hanno nessun
tipo di rappresentazione tangibile. Il primo di questi è il sistema
operativo che possiamo definire come l’applicazione che sta a più vicino
contatto con il livello hardware e che permette il funzionamento di tutte
le applicazioni. Il sistema operativo interagisce con il livello hardware
attraverso le istruzioni che fanno parte dell’ISA relativa all’hardware del
calcolatore. L’interfaccia superiore del sistema operativo è detta API
(Application Programming Interface) che è un insieme di regole e
metodologie che i livelli superiori devono utilizzare per interagire con le
librerie del sistema operativo.
37
—————————————————————————— LA VIRTUALIZZAZIONE
L’ultimo livello di astrazione è quello delle applicazioni utente che
rappresenta tutti i programmi (processi) che interagiscono direttamente
con l’utilizzatore del calcolatore attraverso l’interfaccia grafica o altri
metodi di input e output.
La virtualizzazione di un sistema operativo comporta l’introduzione
di un nuovo livello posto tra l’hardware e il sistema operativo. Il nuovo
livello viene chiamato Virtual Machine Monitor o Hypervisor (vedi fig.
3.4). Ha il compito di fornire delle repliche del sistema hardware del
calcolatore attraverso la suddivisione temporale delle risorse. Si può
infatti affermare che il cuore, l’elemento chiave della virtualizzazione è
proprio il virtual machine monitor (VMM). La sua attività principale è il
controllo, da effettuare in modo trasparente, sulle istanze virtuali di
sistema da esso create. Ogni istanza virtuale prende il nome di virtual
machine o domain.
Dominio 1
Applicazione
Utente
Dominio 2
Applicazione
Utente
Applicazione Utente
Sistema Operativo
Sistema Operativo
Virtual Machine Monitor
Hardware
Figura 3-4 Schema di un calcolatore dotato di macchine virtuali.
38
—————————————————————————— LA VIRTUALIZZAZIONE
I livelli che si trovano al di sopra della virtualizzazione prendono il
nome di sistemi ospiti (Guest Systems) mentre i livelli su cui si appoggia
il virtual machine monitor sono chiamati sistemi ospitanti (Host
Systems).
Le CPU attualmente in commercio prevedono almeno due modalità
di funzionamento: una privilegiata (identificata con diversi nomi: kernel
mode, monitor mode, supervisor mode oppure system mode) in cui è
possibile invocare qualsiasi istruzione macchina e una modalità utente
(user mode) in cui, per questioni di sicurezza e protezione dell’hardware,
è possibile invocare solo alcune istruzioni macchina, generalmente quelle
ritenute non pericolose. In un sistema privo di macchine virtuali le
applicazioni lavorano in modalità utente e il sistema operativo (o parte di
esso: il kernel) lavora in modalità privilegiata. È possibile vedere le due
modalità come due livelli gerarchici, infatti, le applicazioni che lavorano
in user mode non possono in alcun modo influire sul sistema operativo
che lavora in modo privilegiato; viceversa, il sistema operativo riesce a
controllare l’attività delle applicazioni grazie alla possibilità di lavorare
in modalità privilegiata. Lo scheduling dei processi, ad esempio, avviene
in modalità privilegiata, in questo modo, nessuna applicazione (processo)
che sta lavorando in modalità utente può impedire il cambio di contesto e
di processo.
In un’architettura basata su macchine virtuali, il virtual machine
monitor deve appartenere ad un livello gerarchico più alto di quello dei
39
—————————————————————————— LA VIRTUALIZZAZIONE
sistemi operativi, poiché deve avere il controllo su di loro . La maggior
parte delle CPU prevede due soli livelli8 e dunque, se il VMM lavora
nella modalità privilegiata, i sistemi operativi devono forzatamente
utilizzare solo la modalità utente come le applicazioni che vi girano.
3.3 Requisiti di una macchina virtuale
Il virtual machine monitor deve in generale rispondere ai seguenti
requisiti [10]:

Compatibilità: l’utilizzo delle macchine virtuali non deve
richiedere
modifiche
ai
livelli
superiori;
sarebbe
infatti
improponibile al mercato una macchina virtuale che richieda
modifiche agli applicativi. Per questo motivo è necessario che le
macchine virtuali imitino completamente i comportamenti della
macchina che vanno a virtualizzare;

Performance: l’introduzione di un livello tra il sistema operativo
e l’hardware comporta l’introduzione di un certo overhead9. Il
raggiungimento di performance simili a quelle di una macchina
8
In realtà l’architettura x86 a 32 bit e a 64 bit prevedono quattro modalità di
funzionamento ma i sistemi operativi moderni utilizzano solo le due poste agli estremi.
9
Con il termine overhead si intende il tempo impiegato in attività accessorie
all’esecuzione di un compito. In questo caso al tempo strettamente necessario per
eseguire una certa interazione tra sistema operativo e hardware va aggiunto il tempo
speso nella gestione di questa interazione da parte del virtual machine monitor.
40
—————————————————————————— LA VIRTUALIZZAZIONE
reale
copre
buona
parte
degli
studi
sull’ottimizzazione
dell’attività di virtualizzazione;

Semplicità: le macchine virtuali possono essere utilizzate per
aumentare la sicurezza e l’affidabilità dei server. Per garantire
ciò, anche il virtual machine monitor deve essere affidabile. In
generale una architettura semplice è anche caratterizzata da un
certo grado di affidabilità e robustezza;

Isolamento: ogni macchina virtuale deve essere isolata da ogni
altra, quindi sia da attacchi accidentali che malintenzionati. Non
deve essere possibile consentire che una macchina virtuale
interferisca con un’altra macchina e che siano violati i
meccanismi di protezione implementati dal VMM.
3.4 Virtual Machine Monitor (VMM)
Il Virtual Machine Monitor (VMM) anche definito Hypervisor è il
software vero e proprio che permette l’esecuzione multipla di sistemi
operativi, sullo stesso computer e nello stesso momento.
Il VMM è il componente primario della virtualizzazione che abilita
la suddivisione delle risorse base di un PC, come ad esempio il
partizionamento della CPU, della memoria e dell’I/O. Con l’evolversi
delle tecnologie di virtualizzazione ed il miglioramento dell’hardware, le
41
—————————————————————————— LA VIRTUALIZZAZIONE
funzionalità base del VMM possono risiedere in uno strato software a sé
stante, che può trovarsi direttamente sull’hardware della macchina
oppure essere implementato in una parte del sistema operativo.
3.4.1 Full virtualization e paravirtualization
Esiste una distinzione tra le tipologie di virtualizzazione che vengono
fornite. Si ha virtualizzazione completa (full virtualization) quando un
sistema operativo può essere eseguito nella macchina virtuale creata
dall’hypervisor senza che sia necessario modificare il codice. Invece, nel
caso della paravirtualizzazione (paravirtualization) sono necessarie
alcune modifiche al codice del sistema operativo per ―portarlo‖, cioè per
permettergli di essere eseguito da una macchina virtuale.
In questo ultimo caso, il VMM presenta un’interfaccia di astrazione,
tramite la macchina virtuale, non uguale ma simile all’interfaccia
esportata dall’hardware sottostante. Sono quindi necessarie delle
modifiche al codice del sistema operativo, ma non alle applicazioni che
vengono eseguite sul sistema operativo.
Uno dei vantaggi della paravirtualizzazione è una performance
migliore. Infatti, non è necessario effettuare la traduzione dinamica delle
istruzioni. Uno svantaggio, invece, è che il numero di sistemi operativi
che possono essere eseguiti con questa tecnologia è minore, in quanto
42
—————————————————————————— LA VIRTUALIZZAZIONE
possono essere eseguiti nelle macchine virtuali, solo quei sistemi
operativi dei quali è possibile modificare il codice.
3.4.2 Binary translation e dynamic recompilation
Tra le varie tecniche utilizzate per implementare la virtualizzazione
completa è possibile citare quella della binary translation, tra gli altri
utilizzata da VMware [11] e da Virtual PC della Microsoft [12]. Questa
tecnica prevede una traduzione a tempo di esecuzione del codice
destinato all’architettura hardware. In pratica, visto che il codice del
sistema operativo non viene modificato, tutte le parti di codice che
contengono operazioni privilegiate, e che quindi richiedono l’intervento
del VMM, devono essere interpretate a tempo di esecuzione per inserivi
un
trap
al
VM.
Questa
soluzione,
rispetto
a
quella
della
paravirtualizzazione, ha però un overhead più elevato.
Un’altra tecnica per implementare la virtualizzazione completa è la
dynamic recompilation. Questo termine viene usato per indicare il fatto
che un sistema operativo, progettato per essere eseguito su una
particolare classe di CPU e quindi con un determinato linguaggio
macchina, viene eseguito da una macchina virtuale che emula un altro
tipo di CPU, con un differente insieme di istruzioni. Di conseguenza, a
tempo di esecuzione parti di codice vengono ricompilate per essere
43
—————————————————————————— LA VIRTUALIZZAZIONE
eseguite sulla nuova architettura. È un esempio pratico di questa filosofia
PearPC [13] che permette l’esecuzione di MacOS, noto sistema per
processori PowerPC su macchine con architettura x86.
Nella binary translation esiste il classico ciclo di prelievo-decodificaesecuzione dell’istruzione, e quindi ogni istruzione viene emulata per la
nuova architettura. Nel caso della dinamyc recompilation, invece,
durante l’esecuzione vengono riscritte in blocco sezioni di codice, ad
esempio la prima volta che si entra in una determinata sezione di codice.
Successivamente, se le stesse istruzioni dovessero essere rieseguite, si
utilizzerà nuovamente la sezione ricompilata. Un’altra differenza è
dovuta al fatto che, nel caso della binary translation le istruzioni vengono
eseguite direttamente dalle macchine virtuali e non vengono tradotte,
invece, nel caso della dynamic recompilation tutte le istruzioni devono
essere emulate.
3.4.3 Struttura interna dell’hypervisor
La struttura centrale del Virtual Machine Monitor (VMM), è la parte che
esegue la virtualizzazione vera e propria, può essere suddivisa in tre
moduli che gestiscono la virtualizzazione (o in alcuni casi l’emulazione)
della CPU, della memoria e delle periferiche di input e di output.
44
—————————————————————————— LA VIRTUALIZZAZIONE
Nei prossimi paragrafi verranno descritte nel dettaglio le
implementazioni di ognuno di questi moduli [10].
Macchina Virtuale
Macchina Virtuale
Sistema Operativo
Sistema Operativo
CPU
Virtuale
Memoria
Virtualizzata
Periferiche
Virtuali
CPU
Virtuale
Memoria
Virtualizzata
Periferiche
Virtuali
Virtual Machine Monitor
Macchina Reale
CPU
Periferiche
I/O
Memoria
Figura 3-5 Struttura del Virtual Machine Monitor.
3.4.3.1
Virtualizzazione della CPU
La gran parte dei microprocessori presenti nei calcolatori moderni
presentano un istruction set (l’insieme delle istruzioni macchina con cui
vengono scritti i programmi) non adatto alla virtualizzazione. La
virtualizzazione
della
CPU
passa
attraverso
la
risoluzione
o
l’aggiramento di questo problema.
MODALITÀ DI FUNZIONAMENTO DELLA CPU
La famiglia di CPU x86 presenta due soli modi di funzionamento che in
un sistema non virtualizzato sono assegnati al sistema operativo e alle
applicazioni. Il virtual machine monitor deve però utilizzare un modo di
funzionamento più privilegiato rispetto a quello del sistema operativo.
45
—————————————————————————— LA VIRTUALIZZAZIONE
Per questo motivo si sceglie di assegnare al virtual machine monitor il
livello privilegiato mentre sistema operativo e applicazioni girano in
modalità utente. In questo modo l’hypervisor riesce a mantenere il
controllo della CPU.
Eseguendo il sistema operativo in modalità utente, le istruzioni
privilegiate che esso tenta di eseguire sono facilmente catturate dal
virtual machine monitor: la CPU reale infatti, lancia delle eccezioni
(traps) quando si trova in modalità utente e deve eseguire una istruzione
privilegiata. È sufficiente implementare un sistema in grado di percepire
quando le eccezioni vengono lanciate (dispatcher), capire quale
istruzione l’ha generata (allocator) ed eseguire una istruzione alternativa
(interpreter). L’interpreter può eseguire la stessa istruzione in modalità
privilegiata, oppure scegliere di eseguire una istruzione equivalente che
produce gli stessi effetti. Il VMM deve quindi implementare questi tre
moduli per eseguire la virtualizzazione della CPU (vedi fig. 3.6).
ISTRUZIONI “SENSITIVE”
Un ulteriore problema è rappresentato dalle sensitive instructions cioè
quelle istruzioni che interferiscono con lo stato della VMM o delle altre
macchine virtuali eventualmente istanziate dal virutal machine monitor.
Se queste istruzioni sono tutte privilegiate allora la complessità
dell’hypervisor non aumenta poiché vengono riconosciute grazie alle
eccezioni della CPU ed in questo caso la CPU stessa viene definita
virtualizzabile.
46
—————————————————————————— LA VIRTUALIZZAZIONE
Sistema operativo ospitato
Istruzione
Privilegiata
Dispatcher delle eccezioni
Allocator
Interpreter
Eccezione
(trap)
Istruzione
Alternativa
Output
dell’istruzione
Microprocessore reale
tempo
Figura 3-6 Intercettazione delle eccezioni del dispatcher.
Purtroppo il progetto delle attuali CPU non ha tenuto conto delle
esigenze di una possibile virtualizzazione. Nelle CPU della famiglia x86
esistono delle istruzioni sensitive non privilegiate che non possono essere
catturate dall’hypervisor e di conseguenza la CPU non rilascia eccezioni
nel caso si verifichino. Per questo motivo deve esistere un sistema che
permetta il riconoscimento delle istruzioni sensitive non privilegiate
prima che vengano messe in esecuzione. Questo sistema si fonda sulla
traduzione binaria dinamica che permette di tradurre al volo le istruzioni
sensitive non privilegiate sostituendole con altre non pericolose.
L’implementazione di un traduttore binario dinamico necessità però di
47
—————————————————————————— LA VIRTUALIZZAZIONE
molte risorse ed aumenta notevolmente la complessità del VMM. Le
istruzioni tradotte vengono poi memorizzate in una memoria cache in
modo da evitare inutili traduzioni successive.
Per diminuire l’inevitabile overhead introdotto dal traduttore binario
dinamico vengono di norma implementate funzioni di ottimizzazione
dinamica del codice.
SCHEDULING DELLE CPU VIRTUALI
Più macchine virtuali che lavorano contemporaneamente, necessitano di
più CPU virtuali che lavorano a turno sul processore reale del
calcolatore.
Deve quindi esistere un algoritmo di scheduling delle macchine
virtuali, generalmente basato sul round robin: ad ogni macchina virtuale
viene concesso, a turno, l’utilizzo delle risorse reali per un quanto di
tempo prestabilito. Quando una macchina virtuale termina la sua
porzione di tempo deve ―congelarsi‖ e attendere che le venga assegnato il
nuovo turno. La CPU virtuale deve quindi avvalersi di una struttura dati
in memoria sui cui possa memorizzare lo stato della sua CPU reale
(registri, translation look-aside buffer, ecc…) in ogni transizione tra le
macchine virtuali. Questi dati verranno poi ricaricati sulla CPU reale
quando la machina virtuale entrerà in un nuovo quanto di tempo ad essa
dedicato.
48
—————————————————————————— LA VIRTUALIZZAZIONE
3.4.3.2
Virtualizzazione della memoria
La memoria di un calcolatore classico è formata da una sequenza di celle
elementari su cui è possibile scrivere e leggere dati. Ad ogni cella è
assegnato un indirizzo che viene chiamato fisico perché è effettivamente
quello che indica la posizione della cella nell’implementazione hardware
della memoria. Per migliorare e facilitare la gestione della memoria
centrale da parte della CPU ad ogni cella è assegnato almeno un indirizzo
logico. Poiché la CPU e il sistema operativo utilizzano i soli indirizzi
logici, deve esistere un’unità che effettui la conversione e il controllo
sulla validità degli indirizzi: la Memory Management Unit (MMU).
La gestione di grosse quantità di memoria necessita di un sistema di
indirizzamento basato su elementi di memoria di capacità maggiore
rispetto alle celle. Questi elementi, che a loro volta saranno formati da un
numero
prestabilito
di
celle,
sono
chiamati
pagine
(pages).
Analogamente a quello che succede per le celle, anche in questo caso si
hanno pagine logiche (spesso chiamate semplicemente pagine) e pagine
fisiche chiamate normalmente frames.
Le corrispondenze tra pagine e frames sono mantenute dalla page
table (letteralmente tabella delle pagine). In questa situazione l’algoritmo
di indirizzamento della memoria svolto dalla memory management unit
prevede l’indirizzamento della pagina (logica) e della cella (in termini di
offset rispetto all’inizio della pagina) e la conversione della parte di
49
—————————————————————————— LA VIRTUALIZZAZIONE
indirizzo riferito alla pagina tramite un accesso alla page table da cui si
ottiene l’indirizzo del frame.
Il tempo impiegato nella conversione tra gli indirizzi di pagine e
frames dipende dalla dimensione della page table e dal tempo impiegato
per scorrerla. Per questo motivo parte della page table viene memorizzata
in una memoria ad accesso veloce chiamata generalmente cache memory
e che nello specifico viene denominata Translation lookaside buffer
(TLB). Esistono diversi tipi di TLB che sono più o meno adatti alla
virtualizzazione, tra i più funzionali c’è il TLB di tipo tagged in cui oltre
agli indirizzi di pagine e frames viene memorizzato un indicatore con il
processo proprietario della pagina. Questa importante caratteristica può
essere sfruttata per discriminare fra le pagine appartenenti a macchine
virtuali diverse. La virtualizzazione è notevolmente agevolata quando la
TLB viene gestita dal sistema operativo e quindi dal virtual machine
monitor nel caso di un sistema virtualizzato. Purtroppo l’architettura x86
non risponde a nessuna delle due caratteristiche elencate e quindi, la
virtualizzazione di questa architettura è correlata a diverse complicazioni.
Virtualizzare la memoria significa condividere in modo sicuro la
memoria centrale del calcolatore e creare una rappresentazione virtuale
di questo complesso sistema di indirizzamento e di tutti gli altri dettagli,
quali caching della page table e gestione della memoria.
La memoria centrale del calcolatore viene quindi suddivisa in parti,
ciascuna delle quali assegnata in esclusiva ad una macchina virtuale.
50
—————————————————————————— LA VIRTUALIZZAZIONE
Ogni sistema operativo ospitato costruisce e gestisce una propria page
table che servirà come riferimento alla memory management unit e al
translation look-aside buffer per eseguire le conversioni fra gli indirizzi.
L’architettura x86 ha MMU e TLB di tipo hardware che quindi non
possono essere gestiti dai sistemi operativi ospitati e nemmeno dal
VMM.
La page table di ogni sistema operativo ospitato traduce gli indirizzi
delle pagine in indirizzi di frames che vengono calcolati come se la
macchina virtuale avesse a disposizione l’intero banco di memoria del
calcolatore reale. Per ovviare a questo problema è necessario introdurre
una nuova tabella che traduce gli indirizzi dei frames virtuali in indirizzi
di frames reali effettivamente residenti nella memoria reale.
Questa struttura dati, unica per ogni macchina virtuale, viene detta
pmap ed anche in questo caso la virtualizzazione introduce un passaggio
in più che genera overhead. Infatti, MMU e TLB dovrebbero effettuare il
doppio degli accessi in memoria per tradurre un indirizzo. Per evitare ciò,
il VMM si occupa allora del mantenimento di un’altra tabella delle
pagine trasparente alle macchine virtuali che per questo è definita
shadow (letteralmente ombra). La shadow page table mantiene la
corrispondenza tra le pagine di ogni macchina virtuale e i frames reali. È
quindi necessaria l’implementazione di un algoritmo che mantenga
coerentemente il contenuto della shadow page table con i contenuti della
coppia formata da page table e pmap. È necessario poi che il virtual
51
—————————————————————————— LA VIRTUALIZZAZIONE
machine monitor catturi ogni istruzione di indirizzamento che utilizzi le
page tables virtuali e le sostituisca con nuove istruzioni che dicano al
MMU di utilizzare la shadow page table come riferimento per la
conversione degli indirizzi.
L’utilizzo della shadow page table permette anche lo spostamento al
volo delle locazioni di memoria utilizzate da una macchina virtuale senza
dover modificare la page table della macchina stessa, è sufficiente
modificare il pmap corrispondente e la shadow page table.
Page
Table1
Page
Table1
Indirizzo del
frame virtuale
Pmap1
Indirizzo
del frame reale
Memoria centrale
del calcolatore
Pmap2
Shadow
page table
Figura 3-7 Sistema di indirizzamento della memoria nel VMM.
52
—————————————————————————— LA VIRTUALIZZAZIONE
CONDIVISIONE DELLA MEMORIA
Risparmiare memoria è fondamentale per un virtual machine monitor,
per cui, quando è possibile si tende a condividere locazioni di memoria
fra diverse macchine virtuali. Soprattutto nel caso delle sue applicazioni
in ambito server, il VMM si trova ad istanziare numerose macchine
virtuali su cui viene eseguito lo stesso sistema operativo. Una parte delle
informazioni immagazzinate in memoria centrale dai sistemi operativi
ospitati sono di sola lettura come, ad esempio, alcune parti del kernel del
sistema stesso. Esistono alcuni algoritmi di riconoscimento di pagine
simili basati sul controllo di una chiave (hash) assegnata ad ogni pagina
che ne riassume il contenuto. Nel caso il virtual machine monitor
individui due pagine simili, modifica immediatamente la shadow page
table in modo che le pagine allocate dalle due macchine virtuali puntino
allo stesso frame.
3.4.3.3
Virtualizzazione delle periferiche
La virtualizzazione dei dispositivi di input e di output di un calcolatore è
particolarmente complessa a causa della eterogeneità dei dispositivi
stessi. È infatti impossibile definire un unico livello di astrazione per tutti
i tipi dispositivi.
53
—————————————————————————— LA VIRTUALIZZAZIONE
Nelle prime applicazioni della virtualizzazione, i sistemi IBM
prevedevano dei canali asincroni di comunicazione attraverso i quali il
sistema virtuale poteva interagire con la periferica senza introdurre
fastidiosi overheads. Con questo sistema non era necessario nessun tipo
di interazione con il virtual machine monitor durante la comunicazione
con le periferiche. Questo sistema non è più applicabile a causa
dell’enorme eterogeneità delle periferiche che vengono utilizzate
soprattutto nei sistemi desktop.
I VMM utilizzati nelle varie applicazioni comunicano con le
periferiche effettuando appropriate system calls sul sistema operativo
ospitante. La struttura del virtual machine monitor risulta in questo modo
molto semplice poiché viene progettato tenendo conto delle sole API del
sistema operativo. Questa modalità purtroppo introduce delle latenze
nell’interazione con le periferiche poiché, in ogni caso, la comunicazione
tra macchina virtuale e periferica reale deve passare attraverso il
controllo effettuato dall’hypervisor e dal sistema operativo host.
In ambito server, dove l’eterogeneità delle periferiche è trascurabile
rispetto alla necessità di avere un ridottissimo overhead, le periferiche
vengono virtualizzate attraverso interfacce semplificate che comportano
un elevato grado di semplicità di progettazione e di portabilità delle
macchine virtuali stesse. La gestione della comunicazione tra macchine
virtuali e periferiche reali passa comunque attraverso il virtual machine
monitor.
54
—————————————————————————— LA VIRTUALIZZAZIONE
Alcuni hypervisor hanno inoltre la possibilità di virtualizzare una
periferica non presente nel calcolatore reale. In questo caso si parla di
―emulazione di una periferica‖. Come è già stato specificato più volte,
emulare qualcosa significa, imitarne il comportamento. È infatti possibile
creare una emulazione di periferica SCSI quando esse non sono presenti
o emulare porte seriali e parallele oppure, soprattutto nel caso di console
giocattolo, tutto l’hardware che sta attorno alla CPU.
3.5 Benefici della virtualizzazione
Come si è detto nei paragrafi precedenti, l’idea di creare una macchina
virtuale nacque all’incirca negli anni sessanta quando i calcolatori erano
molto onerosi in termini di costo e di spazio. In quella situazione era
conveniente cercare un meccanismo per riuscire ad utilizzare più sistemi
operativi (quindi più applicazioni) su una sola macchina. Con il
progredire delle tecnologie elettroniche ed informatiche i calcolatori sono
diventati sempre meno grandi, meno costosi e più potenti. Questo tipo di
progresso nell’hardware nascose le potenzialità della virtualizzazione.
Al giorno d’oggi la ricerca sulla virtualizzazione ha ripreso vigore
poiché il livello di integrazione dei moderni calcolatori è tale da
mantenere sottoutilizzati i calcolatori che svolgono attività di server.
Infatti, per questioni di sicurezza e affidabilità, si tende ad installare una
55
—————————————————————————— LA VIRTUALIZZAZIONE
sola applicazione per sistema operativo e quindi una sola applicazione
per calcolatore. In questo modo se una applicazione o un sistema
operativo è sotto attacco gli altri servizi forniti non ne risentono perché
meccanicamente indipendenti. Questa tecnica, assolutamente infallibile
da un punto di vista di affidabilità mostra però problemi in termini di
risorse: sono necessari svariati calcolatori che, tenuto conto delle
potenzialità odierne, risultano sottoutilizzati ed i costi di gestione e di
spazio necessario aumentano.
Attraverso l’impiego delle macchine virtuali è possibile sostituire i
server sottoutilizzati con un unico calcolatore su cui girano diverse
istanze di macchine virtuali. Su ognuna di queste è possibile installare il
sistema operativo e l’applicazione che si utilizzava precedentemente. In
questo modo, il numero dei calcolatori diminuisce, i costi di gestione e di
spazio diminuiscono, e il rendimento del calcolatore aumenta poiché
viene sfruttato maggiormente rispetto a prima.
Anche se con questo tipo di progettazione si ha un solo calcolatore,
le macchine virtuali sono isolate ―meccanicamente‖ tra loro e quindi le
applicazioni mantengono lo stesso tipo di isolamento che avevano
girando in calcolatori reali diversi. Infatti nel caso in cui una applicazione
o un sistema operativo sia attaccato o comunque abbia problemi, sarà
eventualmente la macchina virtuale su cui gira ad avere problemi e non il
calcolatore reale.
56
—————————————————————————— LA VIRTUALIZZAZIONE
L’utilizzo delle macchine virtuali comporta una certa forma di
standardizzazione che ha aspetti positivi in termini di istallazione di
sistemi e di loro amministrazione. Si pensi ad esempio ad una serie di
calcolatori differenti tra loro: il sistema operativo deve essere installato e
configurato su ognuno di essi per adattarsi alle caratteristiche hardware
del calcolatore. Questa attività richiede tempo e rappresenta un costo
notevole. Per evitare ciò si può installare su ogni macchina un virtual
machine monitor che generalmente è molto più leggero ed elastico di un
sistema operativo. Su ogni calcolatore viene quindi generata una
macchina virtuale standardizzata che li rende tutti uguali agli occhi del
sistema operativo. In questo modo è possibile effettuare una sola
installazione e configurazione del sistema operativo su di una macchina
virtuale e poi copiare il file immagine contenente la macchina virtuale. In
questo modo abbiamo configurato diversi calcolatori impiegando solo il
tempo necessario alla configurazione di un solo sistema operativo e al
trasferimento dell’immagine relativa tra i calcolatori.
La virtualizzazione permette di creare una imitazione d un
componente hardware o di un intero calcolatore. Nell’esempio visto in
precedenza si creavano macchine virtuali identiche al calcolatore
sottostante. È anche possibile generare macchine virtuali che differiscono
dal calcolatore su cui si appoggiano. Questo permette di utilizzare sistemi
57
—————————————————————————— LA VIRTUALIZZAZIONE
operativi su architetture diverse da quelle per cui erano stati progettati10.
Attraverso una stretta emulazione delle caratteristiche prestazionali di un
calcolatore si riesce anche ad imitare le prestazioni di calcolatori obsoleti
e piattaforme di gioco in cui la temporizzazione delle attività è
fondamentale.
App
App
App
App
SO
SO
SO
SO
HW
HW
VMM
HW
a
b
Figura 3-8 Mascheramento del livello hardware nel VMM.
I domini creati dal VMM, oltre che essere isolati tra di loro, sono isolati
anche dal calcolatore reale poiché le interazioni con esso avvengono
sotto il controllo dell’hypervisor che interrompe eventuali attività
pericolose. Questa caratteristica dà la possibilità di utilizzare le macchine
virtuali anche in ambito di ricerca e di testing di software. È possibile
infatti testare il comportamento di applicazioni costruendo, attraverso il
virtual machine monitor, situazioni critiche (introduzione di nuovi
dispositivi, malfunzionamenti, ecc…) ed analizzare l’andamento della
situazione senza danneggiare il calcolatore reale.
10
Tra gli esempi più famosi Microsoft VirtualPC che permette agli utenti di architetture
PowerPC di utilizzare sistemi operativi Microsoft Windows progettati per architetture
x86 e dall’altro lato PearPC che consente di utilizzare MacOS nato per processori
PowerPC su architetture x86.
58
—————————————————————————— LA VIRTUALIZZAZIONE
3.6 Principali software di virtualizzazione
L’architettura utilizzata in molti PC è particolarmente difficile da
virtualizzare, in quanto tutto ciò che non è supportato direttamente
dall’hardware come ad esempio l’accesso che normalmente avviene in
modo esclusivo a varie risorse del sistema, deve essere modificato e reso
compatibile, in modo da far convivere più sistemi operativi
contemporaneamente, attraverso il software. La piena virtualizzazione,
ossia la simulazione di un insieme completo di hardware di tipo standard,
nella architettura x86 ha quindi costi significativi nella complessità e
nelle performance per l’hypervisor (o VMM).
Un approccio alternativo richiede che il sistema operativo ospite sia
modificato. Questo sistema è utilizzato dal recente progetto open-source
Xen [14], è chiamato paravirtualizzazione e permette alte performance ed
una semplicità maggiore dell’hypervisor. Xen, è un’implementazione
software di macchina virtuale che gira quasi esclusivamente in sistemi
operativi di tipo linux, ma con kernel modificati.
Molti produttori di CPU hanno iniziato recentemente ad aggiungere
il supporto hardware per la virtualizzazione nei loro prodotti. I rispettivi
nomi per i progetti che realizzano questo obiettivo sono Vanderpool oVT
(Virtualization Technology) per Intel e Pacifica o SVM per AMD. In
59
—————————————————————————— LA VIRTUALIZZAZIONE
particolare
viene
aggiunto
il
supporto
alle
parti
difficilmente
virtualizzabili o inefficienti da virtualizzare, nell’architettura x86,
garantendo un supporto ulteriore agli hypervisors. Questo nuovo passo,
porta e porterà ad un aumento notevole di performance, migliorerà la
semplicità del codice da scrivere per virtualizzare un sistema, e
permetterà infine piena e completa virtualizzazione [15][16].
Tra i sistemi simile a Xen, che usa anch’esso la paravirtualizzazione
è Denali, che garantisce macchine virtuali ad alte performance, sempre
nelle architetture x86. Denali supporta macchine virtuali specializzate e
minimali per fornire servizi Internet.
Il sistema può scalare migliaia di macchine virtuali. A differenza di
Xen, Denali non preserva l’interfaccia dell’applicazione binaria, per
questo motivo le applicazioni devono essere ricompilate per girare nel
sistema operativo. La differenza tra Xen e Denali è proprio di carattere,
di utilizzo e di scelte progettuali differenti. Xen preferisce far girare un
numero moderato di sistemi operativi pienamente funzionanti, mentre
Denali preferisce quelli specializzati e leggeri [17].
VMware permette la virtualizzazione di sistemi operativi non
modificati, sempre nell’architettura x86. La tecnologia utilizzata è
estremamente
complessa
ma
è
anche
altrettanto
performante.
Recentemente, VMware per contrastare la concorrenza ha rilasciato
gratuitamente VMware Server. Questo è un prodotto freeware che
permette di partizionare server x86 (anche a 64 bit) in più macchine
60
—————————————————————————— LA VIRTUALIZZAZIONE
virtuali. Supporta inoltre la tecnologia di virtualizzazione Intel
Virtualization Technology e utilizza una specifica e potente interfaccia
per il monitoraggio delle macchine virtuali.
Virtuozzo, un altro sistema proprietario, sostituisce lo strato di
astrazione dell’hardware con una versione modificata, migliorando le
performance del sistema operativo. Questo è ottenuto forzando però
l’utilizzo dello stesso sistema operativo da parte di tutte le macchine
virtuali [18].
Un’altra implementazione dell’hypervisor è chiamata lightweight
hypervisor
introdotta in Parallels Workstation, anch’esso un sistema
proprietario. Questo tipo di hypervisor è uno strato software snello tra il
sistema operativo ospitato, che non necessita modifiche, ed il computer
ospite. Il lightweight hypervisor controlla direttamente una parte
dell’hardware della macchina e fornisce una interfaccia di supporto per le
chiamate di sistema virtualizzate, sia per i VMM che per il sistema
operativo ospitato, eliminato l’overhead e migliorando la velocità, le
performance e l’isolamento della macchina virtuale [19].
La tabella riassuntiva 3.1 presenta le caratteristiche base dei
principali Virtual Machine Manager.
61
—————————————————————————— LA VIRTUALIZZAZIONE
Figura 3-9 Tabella comparativa dei principali software di virtualizzazione.
62
—————————————————————— REALIZZAZIONE DEL PROGETTO
Capitolo 4
4 Realizzazione del progetto
L’Università degli Studi di Perugia è continuamente impegnata nel
tentativo di ridurre i costi di gestione e nell’ottimizzare le risorse a sua
disposizione.
A questo scopo la Ripartizione Servizi Informatici e Statistici, che è
la struttura demandata all’amministrazione sia dei server e che più in
generale alla struttura informatica dell’Ateneo, ha deciso nell’ultimo
periodo di rivedere il parco macchine a sua disposizione.
Una dettagliata analisi della sala server ha messo in evidenza che
molte delle macchine utilizzate risultano sovradimensionate rispetto alla
capacità di calcolo richiesta dai servizi che offrono.
Proprio sulla base di questa motivazione e sulla crescente spinta del
mondo IT verso i software di virtualizzazione, è nata l’idea di un
progetto finalizzato alla realizzazione di una struttura che permettesse di
63
—————————————————————— REALIZZAZIONE DEL PROGETTO
virtualizzare tutte quelle macchine con modeste richieste di calcolo
cercando nel contempo di migliorane l’affidabilità complessiva.
4.1 Analisi del problema
Quando si inizia la realizzazione di un progetto è importante capirne
bene le finalità e soprattutto le necessità che deve soddisfare, proprio per
questi motivi occorre analizzare il problema a fondo e in modo
dettagliato.
Essendo il progetto di natura sperimentale, inteso a verificare la
fattibilità dell’utilizzo della virtualizzazione su un ampio numero di
server, si è cercato di ridurre al minimo le spese necessarie: puntando su
macchine riciclate, per quanto riguarda l’hardware, e su prodotti opensource o freeware per la parte relativa al software.
La necessità di realizzare un sistema in grado di garantire la
disponibilità dei servizi offerti, ha indirizzato verso l’utilizzo di due
macchine da configurare in alta affidabilità. Il software scelto per la
realizzazione del sistema è hearbeat del progetto Linux-HA, un prodotto
open-source in grado di rispecchiare pienamente i requisiti di
minimizzazione dei costi imposti dal progetto.
L’utilizzo
di
un
sistema
in
alta
disponibilità
richiede
obbligatoriamente la presenza di uno storage condiviso tra le macchine
64
—————————————————————— REALIZZAZIONE DEL PROGETTO
che ne fanno parte. Poiché nelle disponibilità della Ripartizione Servizi
Informatici e Statistici non vi è un dispositivo adeguato da poter
recuperare e destinare a questo progetto, si è pensato di sopperire a
questa mancanza mediante il software drbd, che consente la realizzazione
di uno storage condiviso attraverso i dischi fissi dei nodi.
Il recente annuncio della società VMware, in merito al rilascio
gratuito della versione server del suo famoso e rinomato software per la
virtualizzazione, ha inciso notevolmente, insieme alle doti di stabilità e
performance, sulla scelta di adottare per questo progetto VMware Server
come layer di virtualizzazione.
Sulla base dei software scelti e di tutte le considerazioni sin qui fatte,
le due macchine recuperate sono state configurate con determinate
caratteristiche fisiche. La necessità di conferire al sistema capacità
prestazionali accettabili e throughtput adeguato nelle connessioni di rete,
ha reso necessaria l’installazione di almeno 4 interfacce di rete per ogni
nodo.
Per migliorare l’affidabilità delle macchine, aderendo inoltre al
livello 2 di disponibilità esposto nel paragrafo 2.1, i computer sono stati
dotati di un hard disk supplementare in modo da poter effettuare il
mirroring (RAID 1) dei dischi di sistema.
La necessità infine di mandare in esecuzione diverse macchine
virtuali, obbliga i nodi ad essere dotati di molta RAM. Nel caso specifico
si è riusciti a recuperare un GigaByte per ogni macchina che, in aggiunta
65
—————————————————————— REALIZZAZIONE DEL PROGETTO
ai processori rispettivamente di classe Pentium IV e Xeon, sono in grado
di garantire una capacità di calcolo sufficiente agli scopi che ci si è
prefissati.
Nome Nodo
Alpha
Bravo
Marca/Modello
IBM xSeries 336
Assemblato
Processore
Intel Xeon 3.20 Ghz
Intel Pentium 4 2.40 Ghz
Memoria RAM
1 GB
1 GB
Dischi
Maxtor 6Y080M0 – 80 GB
HDS728080PLA380 – 80 GB
Maxtor 6Y080L0 – 80 GB
Maxtor 6Y080L0 – 80 GB
Dischi
BCM5704 Gigabit Ethernet
BCM5704 Gigabit Ethernet
BCM5721 Gigabit Ethernet
BCM5721 Gigabit Ethernet
RTL-8169 Gigabit Ethernet
RTL-8169 Gigabit Ethernet
VT6105 [Rhine-III]
VT6105 [Rhine-III]
Tabella 4-1 Caratteristiche hardware dei nodi.
Figura 4-1 Foto del nodo Alpha.
Figura 4-2 Foto del nodo Bravo.
66
—————————————————————— REALIZZAZIONE DEL PROGETTO
4.2 Installazione e configurazione dei nodi
Una volta recuperate le macchine e terminata la configurazione della loro
parte hardware si è proceduto all’installazione del sistema operativo. Per
questo progetto si è scelta la distribuzione Kubuntu nella versione 6.06.1
LTS Alternate per via delle sue spiccate caratteristiche open-source e per
il forte orientamento verso gli ambienti server.
Kubuntu è un sistema operativo GNU/Linux di facile utilizzo che si
fonda sul progetto Ubuntu (distribuzione di derivazione Debian) al quale
viene sostituito l’ambiente grafico GNOME con quello KDE (K Desktop
Environment) decisamente più intuitivo.
È stata scelta la versione definita LTS (Long Team Support) poiché
vanta un ragguardevole supporto di 5 anni, molto utile negli ambienti
server in cui la completa reinstallazione del sistema non è sempre
facilmente attuabile. La dicitura Alternate indica infine che il CD
consente di eseguire installazioni personalizzate in modalità esperta,
necessario per la configurazione del RAID software.
Una volta giunta a termine l’installazione del sistema operativo in
entrambe le macchine, è bene controllare che i software installati siano
speculari. A questo proposito si può utilizzare il comando dpkg che,
lanciato con le giuste opzioni, restituisce l’elenco completo dei pacchetti
installati. Utilizzando lo stesso comando, insieme all’elenco dei package
67
—————————————————————— REALIZZAZIONE DEL PROGETTO
appena creato, si possono ottenere due macchine perfettamente speculari
dal punto di vista del software installato.
alpha:~# dpkg --get-selections > pacchetti_alpha.txt
bravo:~# dpkg --set-selections < pacchetti_alpha.txt
bravo:~# dselect
Ottenuta la specularità del sistema operativo tra le macchine, si può
procedere alla configurazione dei componenti necessari al funzionamento
del progetto ed in particolare alle schede di rete [20][21][22].
4.2.1 Channel Bonding
Il channel bonding è una tecnica utilizzata per configurare due o più
interfacce di rete, in modo da agire come so fossero una sola. Viene
utilizzata al fine di aumentare le performance del canale trasmissivo
oppure per evitare un possibile point of failure, dovuto a guasto delle
schede, del cavo o delle porte a cui esse sono collegate.
Sfruttando questo particolare metodo, basato su una proprietà del
kernel di Linux, si ottiene che i pacchetti di una trasmissione dati
vengano inviati attraverso tutte le interacce del pool di bonding
configurato (definite sullo stesso indirizzo IP). Il kernel del sistema
infatti mette a disposizione un device virtuale (tipicamente /dev/bond0)
che viene utilizzato normalmente dalle applicazioni di più alto livello
come un device di comunicazione.
68
—————————————————————— REALIZZAZIONE DEL PROGETTO
Per il funzionamento del bonding sono necessari due pacchetti
particolari iproute e ifenslave che vanno ovviamente installati su
entrambi i nodi attraverso i seguenti comandi:
alpha:~#
alpha:~#
bravo:~#
bravo:~#
apt-get
apt-get
apt-get
apt-get
install
install
install
install
ifenslave
iproute
ifenslave
iproute
Aggiunti i pacchetti necessari al sistema si può procedere con la
configurazione del modulo kernel, necessario per la creazione del
bonding, per farlo si deve modificare /etc/modprobe.d/arch/i386
aggiungendovi le seguenti righe:
alias bond0 bonding
options bonding mode=3 max_bonds=2 miimon=100
downdelay=200 updelay=200
Questo permette al kernel di caricare e configurare il modulo secondo i
parametri che gli vengono passati attraverso la sezione options. Di
seguito verranno illustrate le varie opzioni utilizzate a cominciare da
quella mode che identifica la policy utilizzata dal modulo bonding
secondo la seguente dicitura [25]:

0 – Imposta una policy di tipo round-robin per il bilanciamento
del carico e per il fault tolerance. Le trasmissioni vengono
ricevute e inviate in modo sequenziale, su ogni interfaccia slave
di tipo bonded, iniziando dalla prima disponibile.

1 – Imposta una policy di tipo active-backup per il fault tolerance.
Le trasmissioni vengono ricevute e inviate tramite la prima
69
—————————————————————— REALIZZAZIONE DEL PROGETTO
interfaccia slave di tipo bonded. Un’altra interfaccia slave viene
usata solo se la prima interfaccia non ha un esito sperato.

2 – Imposta una policy di tipo XOR (exclusive-or) per il
bilanciamento del carico e di fault tolerance. Usando questo
metodo l’interfaccia eguaglia l’indirizzo MAC della richiesta in
entrata, con l’indirizzo MAC per uno dei NIC slave. Una volta
stabilito questo collegamento, le trasmissioni vengono inviate in
modo sequenziale iniziando con la prima interfaccia disponibile.

3 – Imposta una policy di trasmissione per il fault tolerance. Tutte
le trasmissioni vengono inviate su tutte le interfacce di tipo slave.

4 – Imposta una policy del tipo IEEE 802.3ad dynamic link
aggregation. Crea gruppi d’aggregazione che condividono la
stessa velocità e impostazioni duplex. Trasmette e riceve su tutte
le interfacce slave nell’aggregator attivo. Questa funzione
necessità di un interruttore compatibile con il protocollo 802.3ad.

5 – Imposta una policy Transmit Load Balancing (TLB) per il
fault tolerance e per il bilanciamento del carico. Il traffico in
uscita viene distribuito a seconda del carico su ogni interfaccia
slave. Il traffico in ingresso viene ricevuto dall’interfaccia slave
corrente. Se la slave ricevente fallisce, un’altra al suo posto
assume il controllo dell’indirizzo MAC.

6 – Imposta una policy Active Load Balancing (ALB) per il fault
tolerance ed il bilanciamento del carico. La ricezione del
70
—————————————————————— REALIZZAZIONE DEL PROGETTO
bilanciamento del carico viene raggiunta grazie ad un ARP
negotiation.
Il parametro miimon invece specifica (in millisecondi) la frequenza con
cui il modulo controlla lo stato del link, quello downdelay definisce
quanto tempo si deve attendere dopo il fallimento del link prima di
disabilitarlo ed infine updalay specifica quanto bisogna attendere prima
di abilitare un link.
Dopo queste modifiche si può procedere con la configurazione del
nuovo device (che verrà generato dal caricamento del modulo) mediante
alcuni cambiamenti nel file /etc/network/interfaces. Nel caso
specifico vanno sostituiti tutti i riferimenti alle interfacce eth2 ed eth3
con le righe seguenti:
# Per il nodo Alpha
auto bond0
iface bond0 inet static
address 141.250.199.23
netmask 255.255.255.192
post-up ifenslave bond0 eth2 eth3
pre-down ifenslave -d bond0 eth2 eth3
# Per il nodo Bravo
auto bond0
iface bond0 inet static
address 141.250.199.24
netmask 255.255.255.192
post-up ifenslave bond0 eth2 eth3
pre-down ifenslave -d bond0 eth2 eth3
A questo punto un riavvio di entrambi i nodi metterà in funzione le
modifiche apportate e sarà sufficiente lanciare il comando ifconfig
seguito da alcuni ping di prova, per verificare il corretto funzionamento
di quanto configurato:
71
—————————————————————— REALIZZAZIONE DEL PROGETTO
alpha:~# ifconfig bond0
bond0 Link encap:Ethernet HWaddr 00:11:25:41:5D:7C
inet addr:141.250.199.23 Bcast:141.250.199.63 Mask:255.255.255.192
inet6 addr: fe80::211:25ff:fe41:5d7c/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:264 errors:0 dropped:0 overruns:0 frame:0
TX packets:158 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:24350 (23.7 KiB) TX bytes:19998 (19.5 KiB)
root@alpha:~# ping -I bond0 -c 6 141.250.199.62
PING 141.250.199.62 (141.250.199.62) from 141.250.199.23 bond0:
56(84) bytes of data.
64 bytes from 141.250.199.62: icmp_seq=1 ttl=64 time=0.165 ms
64 bytes from 141.250.199.62: icmp_seq=2 ttl=64 time=0.194 ms
64 bytes from 141.250.199.62: icmp_seq=3 ttl=64 time=0.245 ms
64 bytes from 141.250.199.62: icmp_seq=4 ttl=64 time=0.166 ms
64 bytes from 141.250.199.62: icmp_seq=5 ttl=64 time=0.205 ms
64 bytes from 141.250.199.62: icmp_seq=6 ttl=64 time=0.249 ms
--- 141.250.199.62 ping statistics --6 packets transmitted, 6 receivedc, 0% packet loss, time 4999ms
rtt min/avg/max/mdev = 0.165/0.205/0.257/0.033 ms
bravo:~# ifconfig bond0
bond0 Link encap:Ethernet HWaddr 00:50:70:13:11:AA
inet addr:141.250.199.24 Bcast:141.250.199.63 Mask:255.255.255.192
inet6 addr: fe80::250:70ff:fe13:11aa/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:185 errors:0 dropped:0 overruns:0 frame:0
TX packets:90 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:18136 (17.7 KiB) TX bytes:10502 (10.2 KiB)
root@bravo:~# ping -I bond0 -c 6 141.250.199.62
PING 141.250.199.62 (141.250.199.62) from 141.250.199.24 bond0:
56(84) bytes of data.
64 bytes from 141.250.199.62: icmp_seq=1 ttl=64 time=0.218 ms
64 bytes from 141.250.199.62: icmp_seq=2 ttl=64 time=0.129 ms
64 bytes from 141.250.199.62: icmp_seq=3 ttl=64 time=0.227 ms
64 bytes from 141.250.199.62: icmp_seq=4 ttl=64 time=0.219 ms
64 bytes from 141.250.199.62: icmp_seq=5 ttl=64 time=0.186 ms
64 bytes from 141.250.199.62: icmp_seq=6 ttl=64 time=0.166 ms
--- 141.250.199.62 ping statistics --6 packets transmitted, 6 received, 0% packet loss, time 5000ms
rtt min/avg/max/mdev = 0.129/0.190/0.227/0.039 ms
Allo stato attuale di evoluzione, il progetto può essere sintetizzato nello
schema riportato in figura 4-3 che illustra le configurazioni sin qui
effettuate [23][24][26][27].
72
—————————————————————— REALIZZAZIONE DEL PROGETTO
INTERNET / INTRANET
3C16794
Port Status
3C16794
Port Status
ä
Power
1
2
3
4
5
6
7
8
Green = 100M, Yellow = 10M, Flash = Activity
CHANNEL
bond0
BONDING eth2
ä
Power
Office Connect Switch 8
Office Connect Switch 8
CHANNEL
bond0 141.250.199.24
eth3
eth2 BONDING
141.250.199.23
eth3
RAID 1 Software
1
2
3
4
5
6
7
8
Green = 100M, Yellow = 10M, Flash = Activity
RAID 1 Software
ALPHA
(KUBUNTU 6.06.1)
BRAVO
(KUBUNTU 6.06.1)
Figura 4-3 Schema del progetto dopo l’installazione del channel bonding.
4.3 Configurazione dello storage condiviso
Il sistema di memorizzazione dei dati in un elaboratore elettronico
costituisce un punto nevralgico dell’intero sistema.
È fondamentale notare che le esigenze di un PC dal punto di vista
della memorizzazione dei dati sono notevolmente diverse dalle esigenze
di un cluster ad alta disponibilità, così come diversi sono anche i
73
—————————————————————— REALIZZAZIONE DEL PROGETTO
problemi legati alla sua gestione. Si pensi ad esempio al fatto che in un
cluster ogni nodo deve avere accesso agli stessi dati, e gli stessi dati
devono essere anche protetti da accessi contemporanei da parte di più
nodi.
Un file system progettato per sistemi cluster deve inoltre fornire la
possibilità della gestione dello storage da un singolo punto oltre che un
certo livello di consolidamento dei dati. Potrebbero inoltre esserci
esigenze ulteriori relative ad esempio al throughtput 11 dei dati, che
potrebbero richiedere specifiche particolari, volte ad evitare che il filesystem rappresenti il collo di bottiglia di un sistema cluster.
4.3.1 Tipologie di storage
Si possono individuare due grandi famiglie o filosofie costruttive per i
supporti di memorizzazione dei sistemi cluster, che si differenziano
sostanzialmente per la dislocazione fisica delle memorie di massa:
esterne oppure interne.
STORAGE ESTERNO
Questo tipo di storage permette di risolvere immediatamente il problema
dell’accesso condiviso ai dati da parte di tutti i nodi. Questa tipologia di
device infatti, sono dispositivi esterni ai quali tutti i nodi del cluster
74
—————————————————————— REALIZZAZIONE DEL PROGETTO
possono accedere. Con questa soluzione viene centralizzato il sistema di
memorizzazione dei dati, favorendo la gestione del file system da un solo
punto e allo stesso tempo eliminando l’onere della replica dei dati da
parte del gestore del cluster.
Le eventuali funzioni di protezione dei dati, mediante tecniche di
ridondanza e replicazione, sono gestite internamente dal dispositivo di
storage, riducendo in tal modo sia il traffico di rete generato dai
meccanismi di ridondanza che eventuali carichi elaborativi a scapito dei
nodi.
Questi vantaggi sono apprezzati soprattutto nella realizzazione di
cluster di calcolo per i quali spesso si ha la necessità di dover
memorizzare enormi quantità di dati a velocità elevata: lo storage esterno
è infatti spesso realizzato con tecnologie tali da massimizzare questa
capacità. Non è pertanto difficile trovare storage esterni, connessi al
cluster attraverso connessioni dedicate ad alta velocità basati su fibra
ottica, firewire12 o SCSI.
Spesso si parla di SAN (Storage Area Network) per far riferimento a
un insieme di dispositivi di storage di questo tipo, che si avvalgono di
una rete dedicata esclusivamente al traffico di dati e quindi spesso
utilizzando connessioni ad alta velocità per consentire alte prestazioni.
11
Throughput: con questo termine si definisce l’entità di un flusso per unità di tempo.
In questo contesto si riferisce al flusso di dati che viene calcolato in MB/sec.
12
Firewire: è il nome dato allo standard di collegamento ad alta velocità IEEE1394 il
quale ha come limite teorico di banda passante 480 Mb/sec. Molto usato in ambito
desktop anche come interfaccia di collegamento per dispositivi video e di editing
digitale.
75
—————————————————————— REALIZZAZIONE DEL PROGETTO
Un’altra tecnologia in forte crescita negli storage esterni è iSCSI (SCSI
over IP) in cui il dispositivo è costruito con tecnologia SCSI ma si basa,
per le trasmissioni dati con i nodi, sul protocollo di comunicazione IP.
Il lato negativo maggiormente evidente in questo tipo di soluzioni di
storage, risiede negli ingenti costi da sopportare. Tali dispositivi sono
infatti molto onerosi poiché devono sfruttare tecnologie spesso dedicate e
molte volte proprietarie, per fornire le prestazioni per cui sono stati
costruiti. È da valutare quindi con molta attenzione se l’esigenza di
disporre di dispositivi di questo genere giustifichi l’investimento
necessario.
STORAGE INTERNO E DISTRIBUITO
Questa seconda categoria di storage è invece orientata principalmente ai
cluster di tipo HA, visto che la caratteristica di essere distribuito consente
il recupero dei dati su tutti i nodi del cluster, nel caso in cui uno dei nodi
dovesse momentaneamente rendersi indisponibile.
In questi sistemi la caratteristica di alta velocità è spesso trascurabile
perché un cluster progettato per l’High Avaiability è spesso adibito
all’erogazione di servizi e non al calcolo intensivo, per cui la mole di dati
da dover gestire e memorizzare può essere relativamente ridotta.
Le soluzioni che consentono l’implementazione di uno storage
distribuito e affidabile si basano essenzialmente sul modello definito ―un
server-un disco‖ il quale stabilisce che ogni nodo del cluster esporta un
proprio quantitativo di spazio disco, facendo in modo che ogni altro nodo
76
—————————————————————— REALIZZAZIONE DEL PROGETTO
del cluster vi possa accedere. Viene in questo modo costruito un device
astratto che comprende i diversi dischi esportati dai vari nodi e che viene
considerato a tutti gli effetti uno storage condiviso.
Un file system così costruito si definisce file system parallelo e
presenta il suo vantaggio più evidente nella suddivisione dei compiti di
lettura/scrittura dei dati ai diversi dispositivi presenti. Un altro evidente
vantaggio, decisamente non trascurabile, risiede nell’alta affidabilità,
fornita grazie al fatto che questa tecnica può incorporare strategie di
ridondanza sui vari dischi basate su RAID, eliminando un ulteriore single
point of failure rappresentato dal file system di ogni specifico nodo.
Le alternative possibili e maggiormente diffuse per la realizzazione
di un file system basato su dischi interni sono:

Network Block Device (NBD) e RAID software. La combinazione
di queste due tecnologie infatti consente di soddisfare le esigenze
tipiche di un file system per cluster. Il network block device infatti
è un dispositivo che viene aggiunto agli altri già gestiti dal kernel.
Consente di montare un device remoto attraverso la rete per fare
in modo che venga trattato come un dispositivo locale. Tutto il
traffico dati relativo al dispositivo viene pertanto passato
attraverso la connessione di rete.
Per consentire la replica dei dati necessaria per assolvere alle
caratteristiche di disponibilità viene installato un RAID software
fra il dispositivo remoto (NBD) e quello logico gestendo poi
77
—————————————————————— REALIZZAZIONE DEL PROGETTO
opportunamente le diverse situazioni che richiedono l’accesso ai
dati sull’uno o sull’altro dispositivo. A prima vista potrebbe
sembrare che la tecnologia basata su NBD sia molto simile ad
NFS13 ma la differenza è radicale e determinante ai fini della
disponibilità e della capacità di recupero dei dati.
Rispetto ad NFS, la tecnologia NBD sposta la centralizzazione del
sistema distribuendola ai vari nodi della rete. Praticamente NFS è
basato su un server che esporta una certa quantità di spazio disco
e ogni client che ne fa uso comunica direttamente al server le
modifiche che vuole fare sui dati esportati. Ciò significa che se il
server si blocca nessuno dei client è in grado di usare lo spazio
esportato e quindi bisogna provvedere anche alla ridondanza del
server.
Con NBD invece ogni macchina esporta una certa quantità di
spazio disco che risulta disponibile ad ogni client, il quale
attraverso la propria copia del software NBD monta il dispositivo
di rete e lo gestisce. Non vi sono quindi richiesta da dover essere
processate a carico di un server come in NFS, richieste che
potrebbero essere innumerevoli e mettere in crisi il server stesso.
Generalmente grazie a questa capacità le prestazioni di NBD sono
sensibilmente migliori rispetto ad NFS.
13
NFS: Network File System. Un server NFS esporta una certa quantità di spazio disco
locale renderlo accessibile a tutti gli host presenti sulla rete i quali possono montarlo
come un file system locale.
78
—————————————————————— REALIZZAZIONE DEL PROGETTO

GPFS (General Parallel File System). Questo file system è stato
sviluppato da IBM e reso disponibile gratuitamente agli ambienti
accademici, viene invece fornito unicamente dietro licenza
proprietaria per le realtà commerciali.
Le caratteristiche che rendono appetibile un file system come
GPFS riguardano le performance, la possibilità di eseguire
operazioni di amministrazione da ogni nodo del cluster e la
possibilità di recuperare i dati in caso di errori. GPFS utilizza
infatti una tecnica detta di striping per consentire l’incremento
delle performance e si basa sul fatto che un’operazione di
scrittura/lettura viene svolta parallelamente da tutte le unità disco
presenti nel file system, in quanto ognuna tratta un frammento
differente dei dati; la capacità di recovery è invece garantita dal
fatto che ogni frammento di dato viene scritto su più dispositivi
diversi a seconda della capacità di recupero che si vuole garantire.
Maggiore ridondanza genera chiaramente maggiore traffico di
rete, ed è proprio per questo motivo che GPFS è ottimizzato per
soluzioni di rete ad alta velocità.

DRBD (Distributed Replicated Block Device). Sviluppato da
Philipp Resiner è attualmente disponibile sotto licenza GPL e
quindi liberamente distribuibile e modificabile. DRBD è un
dispositivo a blocchi creato esclusivamente per risolvere problemi
tipici inerenti cluster in alta disponibilità. Si basa sul meccanismo
79
—————————————————————— REALIZZAZIONE DEL PROGETTO
della replicazione dei dati fra due dispositivi a blocchi residenti su
due nodi differenti, attraverso una connessione di rete privata.
Semanticamente il suo funzionamento è simile al RAID-1 attuato
però fra dispositivi remoti [28].
Dopo aver analizzato e preso in considerazione le alternative offerte dal
mercato e sin qui menzionate, per il setup del cluster costruito in questo
progetto di tesi la scelta finale è ricaduta sulla tecnologia denominata
DRBD.
Si è ritenuto che DRBD, poiché ideato esclusivamente per risolvere i
problemi di cluster in alta disponibilità, rappresenti il miglior
compromesso fra semplicità di utilizzo e potenza delle funzioni
implementate.
Nonostante le qualità di GPFS queste introducono una complessità
decisamente non giustificata in cluster con solo due nodi. Altre
caratteristiche favorevoli all’uso di DRBD sono il ridotto calo di
performance che il suo utilizzo introduce e la sua completa integrabilità
con la suite Heartbeat,
fondamentale per far sì che la gestione di
eventuali failure del file system sia completamente automatizzata. Infine
si deve sottolineare il fatto che DRBD è open source e gratuito,
caratteristica cruciale per lo sviluppo e la messa in opera di questo
progetto.
80
—————————————————————— REALIZZAZIONE DEL PROGETTO
4.3.2 Caratteristiche di DRBD
DRBD si basa su di un modulo del kernel presente in entrambi i nodi. I
due lavorano in stretta sincronia tra loro ed a dimostrazione di ciò il file
di configurazione, che verrà illustrato più avanti, risulta identico in tutte
le macchine.
Nel momento in cui si decide di costruire un block device basato su
DRBD, ognuno dei due nodi mette a disposizione una partizione del
proprio disco locale che ovviamente non va configurata per un mounting
automatico attraverso il file /etc/fstab.
Leggendo il proprio file di configurazione (/etc/drbd.conf) ogni
copia di DRBD imposta la partizione fisica ivi specificata e la fa entrare
a far parte del block device specificato (/dev/drbd0). Successivamente,
attraverso il canale di comunicazione privato bond1 (che nel setup
corrente è il channel bonding tra eth0 e eth1), si sincronizza con il
modulo DRBD presente nell’altro nodo ed esegue le medesime
operazioni
A questo punto è disponibile il block device /dev/drbd0 sull’intero
sistema. formato dai due nodi del cluster. Tale block device, gestito da
DRBD in sincronia sui due nodi, è composto dalle due partizioni messe a
disposizione da ciascun nodo.
Il block device, pur presente e sincronizzato, non è ancora
disponibile per le normali operazioni di input/output eseguite dal kernel
81
—————————————————————— REALIZZAZIONE DEL PROGETTO
in quanto va inizializzato e poi montato dopo aver creato su di esso il
file-system desiderato.
L’inizializzazione
del
block
device
/dev/drbd0
prevede
l’assegnazione ad uno dei due nodi della capacità di scrittura. Con DRBD
infatti solo un nodo alla volta è in grado di operare attivamente sul block
device onde evitare inconsistenze negli accessi agli stessi dati da parte
dei due nodi. Per questo motivo rispetto a un dato block device, ogni
nodo può assumere il ruolo di primary se possiede la capacità di scrivervi
e secondary nel caso non gli venga accordata. Se un nodo assume il ruolo
di primary, avrà la possibilità di modificare il contenuto del block device
ed il modulo DRBD si occuperò di trasferire e replicare le modifiche
sull’altro nodo. Il trasferimento avviene attraverso la rete privata e sarò il
nodo secondary il responsabile di effettuare le modifiche sulla partizione
destinata a far parte del block device DRBD.
Tutto questo avviene in modo del tutto trasparente per l’utente che
non è in grado di entrare nel merito della gestione delle partizione
destinate al block device, questo perché l’eventuale tentativo di montare
tali partizioni in modo manuale potrebbe produrre errori di grave entità
che potrebbero indurre la perdita della sincronizzazione fra i nodi e
quindi ad inconsistenze nei dati.
82
—————————————————————— REALIZZAZIONE DEL PROGETTO
4.3.2.1
I protocolli di sincronizzazione
DRBD è basato su di un collegamento attraverso il protocollo TCP fra i
due nodi del cluster, tale scelta è stata dettata da questioni di praticità e
per l’affidabilità del protocollo stesso. TCP è infatti incluso nel kernel
Linux, quindi pienamente supportato, ed integra inoltre tra le sue
specifiche funzionalità di riordinamento dei pacchetti e di controllo di
flusso. Queste caratteristiche rendono possibile la dislocazione remota
dei due nodi per consentire capacità di recupero dei dati estreme, che
possono coprire fino all’ultimo livello di disponibilità, ovvero il disaster
recovery, attraverso la dislocazione geografica della ridondanza.
Il collegamento fra i due nodi può essere reso più o meno
interdipendente in base alla relazione tra la stabilità dell’hardware e
l’affidabilità che si vuole raggiungere. A tale scopo vengono utilizzati tre
differenti protocolli che definiscono al loro interno le caratteristiche che
regolano il funzionamento di DRBD:

Protocollo A. Questo metodo di connessione tra i due nodi
consente il massimo grado di indipendenza. Se il nodo primario
esegue un operazione di I/O14, invia al secondario il comando di
eseguire la stessa operazione. Non appena termina la scrittura sul
dispositivo locale, il nodo primario invia al suo sistema operativo
il segnale di aver terminato l’operazione senza considerare cosa è
avvenuto sul nodo secondario.
83
—————————————————————— REALIZZAZIONE DEL PROGETTO
Risulta evidente che se il primario va in crash dopo aver
segnalato la fine di una scrittura, ma prima che il secondo abbia
effettivamente ricevuto tutti i dati relativi all’operazione di
scrittura, allora la replica dei dati non può essere considerata
speculare e si potrebbero verificare perdite di dati. A volte
tuttavia questo protocollo può rendersi estremamente necessario
nei casi in cui il collegamento alla rete interna presenti un’elevata
latenza. Se non vi fosse questo protocollo, il nodo primario
sarebbe costretto ad attendere il segnale di termine delle
operazioni di sincronizzazione attraverso la rete e ciò
pregiudicherebbe l’efficienza computazionale dell’intero sistema.

Protocollo B. Questo protocollo favorisce una maggiore sicurezza
nella replica dei dati. Il funzionamento del DRBD è simile a
quanto specificato per il protocollo A con l’unica, ma cruciale,
differenza che il nodo primario segnala al proprio sistema
operativo (attraverso il quale un’applicazione
sta richiedendo
operazioni di I/O) il termine dell’operazione stessa, solo quando
ha ricevuto dal secondario il pacchetto di risposta al comando di
scrittura. Questo pacchetto viene inviato dal secondario al
primario non appena egli riceve il comando di scrittura, comando
che provvederà successivamente ad eseguire.
14
I/O: forma abbreviata per indicare Input/Output. Generalmente si riferisce ad
operazioni eseguite su memorie coinvolgenti un flusso di dati.
84
—————————————————————— REALIZZAZIONE DEL PROGETTO
In effetti, pur fornendo una certa sicurezza in più, il protocollo B
è una via di mezzo tra il già citato A ed il successivo C che
garantisce il massimo livello di affidabilità.

Protocollo C. Questo protocollo è il massimo dell’affidabilità
ottenibile da DRBD. Tale affidabilità è garantita dal fatto che il
segnale di termine dell’operazione di I/O, che il nodo primario
invia al suo sistema operativo, è mandata solo quando si ha la
garanzia che il nodo secondario abbia terminato la sua operazione
di scrittura, ovvero quando i dati sono stati fisicamente replicati.
E’ evidente che il tempo di attesa da parte del sistema operativo
del nodo primario in questo caso comprende sia il tempo di
scrittura sul nodo locale che sul nodo secondario oltre ovviamente
al tempo di latenza del sistema di connessione di rete necessario
al trasporto dei segnali di sincronizzazione relativi alle operazioni
eseguite.
4.3.3 Installazione e configurazione di DRBD
La procedura di installazione del software DRBD segue le classiche
consuetudini sulla compilazione di un pacchetto nei i sistemi linux.
Dopo
aver
navigato
fino
al
sito
internet
del
software
(http://www.drbd.org), scaricare l’ultima versione disponibile, nel caso
85
—————————————————————— REALIZZAZIONE DEL PROGETTO
specifico drbd-0.7.23.tar.gz, copiarla nella directory scelta per la
compilazione e scompattare il contenuto del pacchetto.
alpha:~# cd /usr/local/src
alpha:~# wget http://oss.linbit.com/drbd/0.7/drbd-0.7.23.tar.gz
alpha:~# tar –zxvf drbd-0.7.23.tar.gz
bravo:~# cd /usr/local/src
bravo:~# wget http://oss.linbit.com/drbd/0.7/drbd-0.7.23.tar.gz
bravo:~# tar –zxvf drbd-0.7.23.tar.gz
Una volta decompresso il file si deve entrare nella cartella appena creata
e lanciare i comandi di make per generare i moduli e gli eseguibili. Per
evitare errori di compilazione è importante controllare che nel sistema
siano presenti i sorgenti del kernel (tipicamente un pacchetto denominato
kernel-source).
alpha:~#
alpha:~#
alpha:~#
alpha:~#
cd drbd-0.7.23
make clean all
make tools
make install
bravo:~#
bravo:~#
bravo:~#
bravo:~#
cd drbd-0.7.23
make clean all
make tools
make install
Per completare l’installazione DRBD va aggiunto all’elenco dei
programmi lanciati durante la fase di avvio della macchina. Il wrapper
DRBD è stato inserito, dal processo di installazione, direttamente
all’interno della directory /etc/init.d, per cui è sufficiente eseguire il
comando sysv-rc-conf ed impostarne l’avvio nei runlevel di default
per completare questa fase dell’installazione.
86
—————————————————————— REALIZZAZIONE DEL PROGETTO
Figura 4-4 Impostazione di DRBD per l’avvio al boot.
Come già accennato nei paragrafi precedenti DRBD necessita di un
canale di comunicazione, preferibilmente diretto, tra i due nodi per poter
funzionare correttamente. A questo proposito, come già visto nel
paragrafo 4.2.1, si possono migliorare le performance e il throughtput
attraverso l’adozione di un channel bonding. Anche in questo caso,
quindi, si configurerà un interfaccia di bonding adibita unicamente alla
sincronizzazione dei block device, andando nuovamente a modificare il
file /etc/network/interfaces e restartando successivamente lo stack
di rete per rendere effettive le modifiche.
# Per il nodo Alpha
auto bond1
iface bond1 inet static
address 192.168.1.23
netmask 255.255.255.0
post-up ifenslave bond1 eth0 eth1
pre-down ifenslave -d bond1 eth0 eth1
87
—————————————————————— REALIZZAZIONE DEL PROGETTO
# Per il nodo Bravo
auto bond1
iface bond1 inet static
address 192.168.1.24
netmask 255.255.255.0
post-up ifenslave bond1 eth0 eth1
pre-down ifenslave -d bond1 eth0 eth1
alpha:~# /etc/init.d/networking restart
* Reconfiguring network interfaces... [ ok ]
bravo:~# /etc/init.d/networking restart
* Reconfiguring network interfaces... [ ok ]
La fase conclusiva per il funzionamento di DRBD riguarda la
configurazione del file /dev/drbd.conf, al suo interno sono specificate
le risorse che devono essere utilizzate e le modalità con cui DRBD dovrà
utilizzarle.
4.3.3.1
Il file di configurazione “drbd.conf”
Il file /etc/drbd.conf è formato da diverse sezioni, una per ogni risorsa
configurata, o meglio, per ogni block device che si desidera aggiungere
al cluster.
Ogni riga che inizia con la parola chiave resource indica che si sta
configurando un nuovo block device identificato dal nome che segue la
parola stessa. Per ogni risorsa configurata ci sono poi diverse sottosezioni
che definiscono le varie caratteristiche di ogni singolo block device.
Tra le prime direttive da configurare si trova protocol che illustra il
tipo di protocollo con cui DRBD deve effettuare la sincronizzazione sul
device. Nel cluster che si sta costruendo, si utilizza il protocollo C per il
88
—————————————————————— REALIZZAZIONE DEL PROGETTO
particolare orientamento all’alta affidabilità già esposto nel paragrafo
4.3.2.1.
Nell’elenco seguente vengono illustrate le principali sezioni del file
di configurazione, ognuna caratterizzata da una serie di parametri:

startup: qui si definiscono le impostazioni relative all’avvio del
demone. Particolare attenzione meritano il parametro wfc-timeout,
che specifica quanti secondi si deve attendere in fase di boot per
avere un contatto dall’altro nodo e degr-wfc-timeout che specifica
quanti secondi si devono attendere prima di riavviare il nodo in
caso di isolamento dal cluster.

disk: specifica quale comportamento deve tenere DRBD in caso
di errore I/O a basso livello nel device disco.

net: in questa sezione vengono impostati tutti i parametri relativi
alla connessione di rete, come ad esempio on-disconnect per il
comportamento in caso di disconnessione della rete oppure pingint
che specifica l’intervallo di tempo tra i controlli di
connettività.

syncer: riporta i parametri inerenti la sincronizzazione con
particolare riferimento a rate che imposta il limite massimo di
occupazione di banda sulla connessione di rete.
L’ultima parte della sezione resource è quella più importante perché
configura le risorse utilizzate da ogni nodo, identificando le partizioni
fisiche e le interfacce di rete impiegate nel sistema. A tale proposito si
89
—————————————————————— REALIZZAZIONE DEL PROGETTO
noti che durante la fase di installazione del sistema operativo, si è
provveduto a riservare alcune partizioni per la creazione dei block device
DRBD. Tali partizioni hanno tutte la dimensione di 10 GB e sia sulla
macchina denominata alpha che su quella bravo corrispondono ai device
/dev/md6
e /dev/md7.
Di seguito il dettaglio delle due risorse configurate per questo
progetto:
resource drbd0 {
[...]
on alpha {
device
/dev/drbd0;
disk
/dev/md6;
address
192.168.1.23:7788;
meta-disk internal;
}
on bravo {
device
/dev/drbd0;
disk
/dev/md6;
address
192.168.1.24:7788;
meta-disk internal;
}
}
resource drbd1 {
[...]
on alpha {
device
/dev/drbd1;
disk
/dev/md7;
address
192.168.1.23:7789;
meta-disk internal;
}
on bravo {
device
/dev/drbd1;
disk
/dev/md7;
address
192.168.1.24:7789;
meta-disk internal;
}
}
All’interno di ogni sottosezione, che inizia con la parola on seguita dal
nome del nodo che esporta le risorse, si trova innanzitutto la definizione
del device che viene configurato, definito dai file /dev/drbd0 e
90
—————————————————————— REALIZZAZIONE DEL PROGETTO
/dev/drbd1.
Con l’attributo disk viene specificata quale sarà la
partizione reale che deve essere esportata dallo specifico nodo per andare
a far parte del block device condiviso.
L’attributo address si riferisce invece alla configurazione del
modulo DRBD che verrà eseguito su ogni nodo e che, per la
sincronizzazione fra i nodi, utilizzerà l’indirizzo IP 192.168.1.23 su
alpha e 192.168.1.24 su bravo. In entrambi i nodi sarà in ascolto sulla
porta 7788 per il device drbd0 e 7789 per quello drbd1. Come si può
notare per ogni risorsa aggiuntiva eventualmente configurata (relativa ad
altri block-device) è necessario specificare una porta differente.
Terminata la fase di configurazione del servizio, si può procedere
con il suo avvio, verificando a posteriori che quanto sin qui realizzato
funzioni in modo corretto e soprattutto che venga effettuata
adeguatamente la sincronizzazione delle partizioni tra i nodi.
Per prima cosa si procede con lo start del demone in entrambi i nodi
attraverso lo script che l’installazione ha posizionato in /etc/init.d e si
controlli tramite lo stesso script lo stato del modulo.
alpha:~#/etc/init.d/drbd start
Starting DRBD resources:
[ d0 d1 s0 s1 n0 n1 ].
alpha:~#/etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 0.7.23 (api:79/proto:74)
SVN Revision: 2686 build by root@alpha, 2007-01-15 13:08:27
0: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
1: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
bravo:~#/etc/init.d/drbd start
Starting DRBD resources:
[ d0 d1 s0 s1 n0 n1 ].
91
—————————————————————— REALIZZAZIONE DEL PROGETTO
bravo:~#/etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 0.7.23 (api:79/proto:74)
SVN Revision: 2686 build by root@bravo, 2007-01-15 13:12:29
0: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
1: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
Come si può notare dall’output del comando /etc/init.d/drbd
status,
entrambi i nodi vengono considerati in stato Secondary e la
risorsa risulta Inconsistent; ciò sta ad indicare che la sincronizzazione
non è ancora attiva, questo perché non è stato definito quale delle
partizioni assegnate alla risorsa (e quindi quale nodo) sia da considerare
come master tra le due.
Lanciando il comando di seguito riportato, si imposta il nodo
relativo come primario ed è possibile, controllando lo stato delle risorse,
verificare che sia partita la sincronizzazione [30].
alpha:~# drbdadm -- --do-what-I-say primary drbd0
alpha:~# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 0.7.23 (api:79/proto:74)
SVN Revision: 2686 build by root@alpha, 2007-01-15 13:08:27
0: cs:SyncSource st:Primary/Secondary ld:Consistent
ns:36 nr:0 dw:0 dr:38 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
[==>.................] sync'ed:13.7% (8127/9402)M
finish: 0:03:15 speed: 42,580 (38,416) K/sec
1: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
bravo:~# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 0.7.23 (api:79/proto:74)
SVN Revision: 2686 build by root@bravo, 2007-01-15 13:12:29
0: cs:SyncTarget st:Secondary/Primary ld:Consistent
ns:0 nr:16 dw:16 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
[===>................] sync'ed: 16.7% (7840/9402)M
finish: 0:02:46 speed: 48,044 (38,084) K/sec
1: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
92
—————————————————————— REALIZZAZIONE DEL PROGETTO
bravo:~# drbdadm -- --do-what-I-say primary drbd1
bravo:~# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 0.7.23 (api:79/proto:74)
SVN Revision: 2686 build by root@bravo, 2007-01-15 13:12:29
0: cs:Connected st:Secondary/Primary ld:Consistent
ns:0 nr:84 dw:84 dr:0 al:0 bm:76 lo:0 pe:0 ua:0 ap:0
1: cs:SyncSource st:Primary/Secondary ld:Consistent
ns:0 nr:24 dw:24 dr:0 al:0 bm: 1 lo:0 pe:9 ua:0 ap:0
[>...................] sync'ed: 0.7% (9347/9402)M
finish: 0:02:47 speed: 56,924 (56,924) K/sec
alpha:~# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 0.7.23 (api:79/proto:74)
SVN Revision: 2686 build by root@bravo, 2007-01-15 13:08:27
0: cs:Connected st:Primary/Secondary ld:Consistent
ns:0 nr:84 dw:84 dr:0 al:0 bm:76 lo:0 pe:0 ua:0 ap:0
1: cs:SyncTarget st:Secondary/Primary ld:Consistent
ns:88 nr:0 dw:0 dr:48 al:0 bm:8 lo:1 pe:7 ua:90 ap:0
[>...................] sync'ed: 3.6% (9073/9402)M
finish: 0:04:07 speed: 37,500 (37,500) K/sec
Terminata la sincronizzazione tra i due nodi si può controllare lo stato
finale, verificando che le risorse siano connesse e consistenti.
alpha:~# /etc/init.d/drbd start
Starting DRBD resources:
[ d0 d1 s0 s1 n0 n1 ].
alpha:~# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 0.7.23 (api:79/proto:74)
SVN Revision: 2686 build by root@alpha, 2007-01-15 13:08:27
0: cs:Connected st:Primary/Secondary ld:Consistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
1: cs:Connected st:Secondary/Primary ld:Consistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
A questo punto della configurazione si può procedere con la creazione
del file system sulle risorse, si utilizza il comando mkfs.ext3
/dev/drbd0
per il nodo alpha e mkfs.ext3 /dev/drbd1 per il nodo
bravo. Ultimata la scrittura del file system si può procedere con un test
sul mounting per verificare che tutto funzioni correttamente, ma anche
per accertarsi che se si tenta di utilizzare una risorsa da un nodo
secondary questo viene correttamente impedito dal modulo DRBD.
93
—————————————————————— REALIZZAZIONE DEL PROGETTO
alpha:~# mkfs.ext3 /dev/hda9
[...]
alpha:~# mount /dev/drbd1 /mnt
alpha:~# df -k
Filesystem 1K-blocks Used
Available Use% Mounted on
[...]
/dev/drbd0
9477056 8677256
318384
97% /mnt
bravo:~# mount -t ext3 /dev/drbd0 /mnt/
mount: block device /dev/drbd0 is write-protected,
mounting read-only
mount: /dev/drbd0 already mounted or /mnt/ busy
A questo punto si è conclusa definitivamente la configurazione del
sistema DRBD e si può visionare nello schema seguente lo stato di
avanzamento del progetto di tesi.
INTERNET / INTRANET
3C16794
Port Status
3C16794
Port Status
ä
Power
1
2
3
4
5
6
7
8
Green = 100M, Yellow = 10M, Flash = Activity
CHANNEL
bond0
BONDING eth2
ä
Power
Office Connect Switch 8
Office Connect Switch 8
CHANNEL
bond0 141.250.199.24
eth3
eth2 BONDING
141.250.199.23
eth3
/dev/drbd0
/dev/drbd1
eth0
eth0
bond1
DRBD
bond1
192.168.1.23
CHANNEL
BONDING
192.168.1.24
eth1
RAID 1 Software
1
2
3
4
5
6
7
8
Green = 100M, Yellow = 10M, Flash = Activity
eth1
RAID 1 Software
ALPHA
(KUBUNTU 6.06.1)
BRAVO
(KUBUNTU 6.06.1)
Figura 4-5 Schema del progetto dopo l’installazione di DRBD.
94
—————————————————————— REALIZZAZIONE DEL PROGETTO
4.4 Configurazione di Heartbeat
In questo paragrafo si analizza la configurazione e i meccanismi su cui si
basa Heartbeat. Tale software caratterizza il funzionamento di buona
parte del cluster realizzato in questo progetto, in quanto tiene traccia del
funzionamento dei singoli nodi e prende le decisioni opportune laddove
si verifichi un malfunzionamento.
Come ogni software sviluppato per gli ambienti di tipo Unix, ed in
particolare Linux, è una suite composta da un insieme di piccoli moduli
altamente specializzati in una particolare funzione, che interagiscono
costantemente tra loro per raggiungere un obiettivo finale.
Questo stile volto alla modularizzazione consente di rendere molto
snello ed efficiente lo sviluppo del software, in quanto in caso di
manutenzione o aggiunta di nuove funzionalità, le modifiche
coinvolgeranno solo i moduli direttamente interessati e non l’intera suite.
4.4.1 La struttura di Heartbeat
La figura 4.6 mostra che Heartbeat ha un’architettura multiprocesso,
questo è derivato non solo da ragioni storiche, ma anche da motivazioni
95
—————————————————————— REALIZZAZIONE DEL PROGETTO
riconducibili alla sicurezza. Il fatto che ogni processo gestisca
separatamente un particolare aspetto della suite evita che il crash di una
certa funzionalità coinvolga le altre.
Dalla figura si evincono quattro tipologie di processi: primo e più
importante è il Master Control Process (MCP), vengono poi i processi di
lettura (read) e scrittura (write) e il processo di lettura FIFO (FIFO
reader). Oltre a quelli già citati ci sono poi altri processi che possono
essere considerati client, in quanto eseguono speciali operazioni e
chiedono al Master Control Process di reagire conseguentemente. Tra
questi i più importanti sono ipfail e Consensus Cluster Membership
(CCM).
READ
ucast
(eth0)
WRITE
ucast
(eth0)
READ
serial
WRITE
serial
(/dev/ttyS0)
(/dev/ttyS0)
Master Control
Process
FIFO Reader
Client Child
Process
(ipfail)
Client Child
Process
(ccm)
Client Child
Process
(watchdog)
Figura 4-6 Schema dei moduli di Heartbeat.
96
—————————————————————— REALIZZAZIONE DEL PROGETTO
Il Master Control Process è il cuore del sistema di monitoraggio. Ha il
controllo dell’intera attività della suite e si interfaccia con gli altri
processi relativi ad Heartbeat, a cui invia e da cui riceve i dati necessari a
prendere eventuali decisioni in caso di malfunzionamenti sui nodi.
Scendendo nel dettaglio MCP provvede all’invio dei segnali di
heartbeat attraverso i canali configurati per il collegamento tra i nodi del
cluster, gestisce i time-out sui segnali di heartbeat, attraverso i quali
stabilire se un nodo è effettivamente funzionate, invia pacchetti firmati e
autentica pacchetti ricevuti utilizzando gli appositi algoritmi crittografici
e si occupa infine di avviare o riavviare i diversi processi della suite
relativi alle diverse funzionalità implementate.
Il processo FIFO reader ha l’unico scopo di leggere la coda
attraverso la quale comunicano i diversi processi di Heartbeat accessibili
attraverso il file system al percorso /var/lib/heartbeat/fifo. La
comunicazione fra i processi, attraverso la coda First-In-First-Out, è
utilizzata quando i processi risiedono sulla stessa macchina ed è
implementata aprendo in lettura o scrittura esclusiva la stessa coda. Il
modulo FIFO reader evita che la gestione di tale comunicazione venga
eseguita all’interno del MCP evitandogli inutili sovraccarichi.
I read processes sono processi adibiti esclusivamente alla lettura di
messaggi da sottoporre al Master Control Process. Il loro funzionamento
è molto simile al FIFO reader tranne per il fatto che i dati letti vengono
ricevuti dall’esterno attraverso i canali di comunicazione fra i nodi.
97
—————————————————————— REALIZZAZIONE DEL PROGETTO
Poiché i canali di comunicazione possono essere differenti per tipologia e
funzione, è necessario che ci sia un processo di lettura per ogni tipo di
canale da cui ricevere i dati.
I write processes hanno le stesse caratteristiche dei read processes
ma sono adibiti alla trasmissione di dati all’esterno. Anche in questo caso
si hanno processi di scrittura differenti in funzione del canale di
comunicazione utilizzato.
I client processes eseguono operazioni che si possono definire
esterne all’attività del Master Control Process: ad esempio ipfail che
esegue un monitoraggio della connessione fra i nodi e stabilisce quando è
necessario eseguire il failover del gruppo di servizi, richiedendo al MCP
di eseguire materialmente questa operazione. CCM invece, acronimo di
Consensus Cluster Membership, è un client process che svolge la
funzione di monitorare lo stato del cluster per fornire in ogni momento,
al Master Control Process, le informazioni relative ai nodi del cluster
effettivamente connessi e pienamente funzionanti. Ogni nodo, grazie al
CCM, è consapevole del fatto di essere o meno membro del cluster ed i
nodi parzialmente collegati (per un interruzione dei canali ridondati) non
vengono considerati membri del cluster e non possono accogliere un
eventuale failover. È evidente che questo componente assume
un’importanza crescente all’aumentare del numero dei nodi che
compongono il cluster benché la sua funzione rimane indispensabile
anche con cluster formati da due soli nodi[4].
98
—————————————————————— REALIZZAZIONE DEL PROGETTO
4.4.1.1
I plugin di Heartbeat
I moduli sin qui descritti costituiscono il nucleo della suite e assolvono le
funzioni primarie necessarie al funzionamento del cluster. Questo nucleo
centrale non implementa però alcune funzionalità esterne ed orientate al
contesto operativo in cui verrà collocato il cluster.
Al fine di interfacciarsi con il mondo esterno Heartbeat si appoggia a
dei plugin che vengono utilizzati in modo opportuno in funzione del tipo
di ambiente in cui opera, come illustrato nella figura 4.7 questi possono
essere classificati in tre categorie: plugin di STONITH, plugin di
comunicazione, plugin di autenticazione.
Heartbeat
Heartbeat Plugin Infrastructure
Communication
Plugin
STONITH
Plugin
Heartbeat Client Process
(ccm, ipfail, etc.)
Authentication
Plugin
Resource Script
Figura 4-7 Moduli esterni di Heartbeat.
I plugin di STONITH implementano tutte le funzioni necessarie per far
fronte al problema del brain-splitting. STONITH è l’acronimo di Shoot
99
—————————————————————— REALIZZAZIONE DEL PROGETTO
The Other Node In The Head ed è un meccanismo che si occupa di
disattivare istantaneamente un nodo del cluster quando se ne presenta la
necessità, in particolare quando uno stesso gruppo di servizi è erogato da
più di un nodo per via di un failover sbagliato, causato per esempio
dall’interruzione simultanea di tutti i canali di comunicazione interna.
Questo plugin sfrutta un dispositivo hardware collegato al cluster,
attraverso la rete ehternet oppure le porte seriali, che è in grado di
comunicare con Heartbeat e ricevere comandi. Tale dispositivo gestisce
l’erogazione di energia elettrica a ciascuno dei nodi del cluster cosicché,
in caso di brain-splitting è in grado di bloccare istantaneamente il
funzionamento di uno dei nodi. In questo progetto essendo l’erogazione
dell’energia elettrica della sala macchine fornita da un unico gruppo di
continuità non è possibile utilizzare questa funzionalità.
Tutte le comunicazioni verso l’esterno, eseguite da Heartbeat sono
gestite da plugin, i canali supportati per questi scambi di informazioni
comprendono UDP di tipo broadcast, multicast e unicast e le
comunicazioni attraverso porte seriali. Tali plugin si occupano di inviare
al kernel le richieste necessarie all’invio dei segnali generati dai vari
moduli del nucleo della suite o alla ricezione di quelli provenienti
dall’esterno.
I plugin di autenticazione forniscono tutte le funzionalità riguardanti
la sicurezza delle comunicazioni fra i nodi del cluster. Tutti i messaggi
scambiati dai nodi sono accompagnati da chiavi di autenticazione che
100
—————————————————————— REALIZZAZIONE DEL PROGETTO
consentono ai nodi che li ricevono di stabilire se un certo segnale
ricevuto sia autentico ed effettivamente proveniente da un certo nodo.
Tre sono gli algoritmi di crittografia implementi, utilizzabili a seconda
del livello di sicurezza ed il consumo di CPU che si vuole ottenere: il
primo è il CRC semplice ma anche meno sicuro, il secondo è l’algoritmo
MD5 mentre il terzo è SHA1 che offre una codifica difficilmente
reversibile ma richiede un carico di lavoro decisamente supplementare e
superfluo a meno di una comunicazione di sincronizzazione che passi
attraverso segmenti di rete non esclusivamente ad utilizzo dei nodi del
cluster.
I resource script sono componenti esterni di Heartbeat e sono file
eseguibili
in
formato
testo
che
possono
essere
modificati
dall’amministratore di sistema per essere adattati alle specifiche esigenze
e vengono invocati automaticamente da Heartbeat per svolgere funzioni
particolari oppure richiamati dall’amministratore per gestire alcuni
aspetti della suite.
4.4.2 Il Resource Group
Nella logica di Heartbeat si definisce risorsa ogni entità del sistema che
Heartbeat gestisce [29]. Una risorsa può essere ad esempio un indirizzo
101
—————————————————————— REALIZZAZIONE DEL PROGETTO
IP, un servizio come Apache o MySQL, un componente hardware come
un unità disco, una risorsa del kernel come un file system.
Per ogni risorsa gestita da Heartbeat esiste uno script in grado di
eseguirne lo start e lo stop analogamente a quanto succede con gli script
presenti in /etc/init.d.
Si parla di Resource Group per via del fatto che l’operazione di takeover, da un nodo all’altro, interessa tutte le risorse che un certo nodo del
cluster gestisce. Per esempio il resource group di un dato nodo potrebbe
essere composto da un indirizzo IP sul quale fornisce dei servizi, una
certa partizione di disco affidata a DRBD sulla quale ad esempio svolge
un ruolo primario ed i servizi forniti sull’indirizzo specificato all’inizio.
Nel momento in cui il nodo dovesse cadere, il resource group viene
interamente migrato sull’altro nodo e le risorse trasferite vengono attivate
così com’erano sul nodo caduto.
4.4.3 Installazione e configurazione di Heartbeat
La procedura di installazione di Heartbeat segue le classiche
consuetudini sulla compilazione di un pacchetto nei i sistemi linux.
Dopo
aver
navigato
fino
al
sito
internet
del
software
(http://www.linux-ha.org), scaricare l’ultima versione disponibile, nel
102
—————————————————————— REALIZZAZIONE DEL PROGETTO
caso specifico heartbeat-2.0.8.tar.gz, copiarla nella directory scelta
per la compilazione e scompattare il contenuto del pacchetto.
alpha:~# cd /usr/local/src
alpha:~# wget http://linux-ha.org/download/heartbeat-2.0.8.tar.gz
alpha:~# tar –zxvf heartbeat-2.0.8.tar.gz
bravo:~# cd /usr/local/src
bravo:~# wget http://linux-ha.org/download/heartbeat-2.0.8.tar.gz
bravo:~# tar –zxvf heartbeat-2.0.8.tar.gz
Prima di effettuare la compilazione è necessario eseguire alcune
operazioni
a livello di sistema operativo per preparare l’ambiente:
Heartbeat richiede infatti che siano presenti in entrambi i nodi un utente
ed un gruppo ad esso dedicati.
alpha:~# groupadd hacluster
alpha:~# useradd -g hacluster -d /nonexistent -m hacluster
bravo:~# groupadd hacluster
bravo:~# useradd -g hacluster -d /nonexistent -m hacluster
Una volta creato l’utente e decompresso il file si deve entrare nella
cartella appena creata e lanciare gli opportuni comandi necessari alla
compilazione.
alpha:~#
alpha:~#
alpha:~#
alpha:~#
cd /usr/local/src/heartbeat-2.0.8
./ConfigureMe configure
make
make install
bravo:~#
bravo:~#
bravo:~#
bravo:~#
cd /usr/local/src/heartbeat-2.0.8
./ConfigureMe configure
make
make install
Per completare l’installazione di Heartbeat il suo script di avvio va
aggiunto all’elenco dei programmi lanciati durante la fase di avvio della
macchina. Lo script di avvio di Heartbeat è stato inserito, dal processo di
installazione, direttamente all’interno della directory /etc/init.d, per
103
—————————————————————— REALIZZAZIONE DEL PROGETTO
cui è sufficiente eseguire il comando sysv-rc-conf ed impostarne
l’avvio nei runlevel di default.
Figura 4-8 Impostazione di Heartbeat per l’avvio al boot.
Anche Heartbeat, come ogni software per piattaforma *nix, si configura
attraverso determinati file di configurazione. Nel caso specifico prima di
poterli modificare a piacimento, i file vanno copiati dalla cartella
contenente i documenti in /usr/share/doc/heartbeat-2.0.8/ alla
/etc/ha.d.
alpha:~# cd /usr/share/doc/heartbeat-2.0.8/
alpha:~# cp ha.cf haresources authkeys /etc/ha.d/
alpha:~# chmod 600 authkeys
bravo:~# cd /usr/share/doc/heartbeat-2.0.8/
bravo:~# cp ha.cf haresources authkeys /etc/ha.d/
bravo:~# chmod 600 authkeys
La configurazione di
questi tre file evidenzia le politiche di gestione
delle risorse decise in fase di progetto e le funzioni di recovery e
104
—————————————————————— REALIZZAZIONE DEL PROGETTO
monitoraggio che si è scelto di attivare. Si tenga presente che i file di
configurazione debbono essere identici in entrambi i nodi.
IL FILE “HARESOURCES”
Nel file haresources vengono configurati i resource group per ciascuno
dei nodi coinvolti nel cluster. Questo progetto utilizza una configurazione
Active/Active ed il file conterrà quindi due righe, una per nodo, con
definiti i servizi che dovranno essere erogati da ognuno.
All’inizio di ogni riga si trova l’hostname del nodo (come
specificato dall’output del comando uname -n) che è destinato ad
ospitare inizialmente il resource group.
Per i servizi che si devono erogare, come mostrato nei paragrafi
precedenti, si sono già configurati due device DRBD denominati drbd0 e
drbd1.
Con lo script drbddisk Heartbeat è in grado di dare al nodo il
ruolo di primario per il device specificato, provvedendo inoltre a montare
attraverso lo script Filesystem il device nel percorso definito.
Accertata l’esistenza della cartella per il mounting, ed eventualmente
creandola con il comando mkdir in caso negativo, si può procedere alla
stesura del file utilizzando le seguenti righe di configurazione.
alpha drbddisk::drbd0
Filesystem::/dev/drbd0::/var/lib/vmware/VirtualMachinesALPHA::ext3
bravo drbddisk::drbd1
Filesystem::/dev/drbd1::/var/lib/vmware/VirtualMachinesBRAVO::ext3
In particolare lo script drbddisk esegue il comando drbdadm primary
drbdX
per rendere primario il nodo e montare il dispositivo, drbdadm
105
—————————————————————— REALIZZAZIONE DEL PROGETTO
secondary drbdX
per rendere il nodo secondario dopo aver smontato il
device ed eseguire eventualmente il takeover del resource group.
A questo punto si possono inserire, di seguito nella riga, i wrapper
dei servizi che si vogliono erogare, ma si vedrà questa fase più avanti nel
capitolo
nella
parte
relativa
all’installazione
del
software
di
virtualizzazione.
IL FILE “HA.CF”
Il file ha.cf viene letto da Heartbeat nel momento in cui se ne effettua
l’avvio attraverso il comando /etc/init.d/heartbeat start.
Tale file contiene le impostazioni necessarie affinché la suite sia
configurata per adattarsi alle specifiche del sistema che si vuole
realizzare e per soddisfare le politiche di gestione che si sono stabilite in
fase di progetto.
Di seguito si analizzerà questo file, contenuto integralmente in
appendice, illustrandone le principali opzioni utilizzate.

keepalive 2
– specifica il tempo in secondi che intercorre tra
due segnali di heartbeat inviati ai nodi;

deadtime 5
– indica quanto tempo in secondi si deve attendere
dall’ultimo segnale di heartbeat ricevuto per poter dichiarare il
nodo definitamene non funzionante;

initdead 120
– imposta un timing in secondi per il bypass del
parametro di deadtime ed è valido solamente all’avvio del
106
—————————————————————— REALIZZAZIONE DEL PROGETTO
servizio di Heatbeat. Questo è studiato dare tempo al demone di
stabilire le connessioni ed inizializzare i diversi plugin, al fine di
evitare un takeover delle risorse prima ancora che il sistema si sia
completamente inizializzato su tutti i nodi;

auto_failback on
– definisce un particolare comportamento del
cluster in caso di failure di un nodo. Secondo la configurazione
scelta se un nodo rientra nel cluster dopo esserne uscito per un
malfunzionamento o per una eventuale manutenzione, il resource
group configurato per default su tale nodo viene automaticamente
riportato su di esso. È evidente che i servizi torneranno ad essere
erogati da tale nodo solo dopo che il file system condiviso è stato
risincronizzato, ma sarà compito di DRBD verificare il corretto
andamento di questo processo.

baud 19200
e serial /dev/ttyS0 – questi parametri vengono
utilizzati nel caso si decida, per ulteriori motivi di sicurezza, di
utilizzare anche la connessione seriale per il sottosistema di
comunicazione. Questa configurazione prevede che le due
macchine siano collegate tra loro, sulle rispettive porte seriali,
mediante un cavo di tipo null modem. La verifica del corretto
funzionamento del cavo e delle porte è possibile tramite alcuni
semplici comandi riportati di seguito:
bravo:~# cat </dev/ttyS0
alpha:~# echo "Hello World" >/dev/ttyS0
107
—————————————————————— REALIZZAZIONE DEL PROGETTO
nella console della macchina bravo dovrebbe apparire la scritta
"Hello
World",
segnale che la comunicazione si è svolta
correttamente.

bcast bond0
e bcast bond1 – specifica gli altri canali utilizzati
per il segnale di sincronizzazione ridondando quello seriale ed
evitando così l’introduzione di single point of failure.
Si noti che i due canali bond0 e bond1 sono di per sé già ridondati
per i motivi spiegati nel paragrafo 4.2.1;

watchdog /dev/watchdog
– watchdog è uno strumento atto al
reboot del sistema qualora qualcosa non funzioni correttamente.
Ad esempio nel caso in cui il kernel risponda in modo anomalo,
oppure qualche programma occupi il 100% dei cicli di cpu.
L’idea è quella di avere un device /dev/watchdog in cui il sistema
operativo si preoccupi di scrivere ad intervalli di tempo regolari e
ben definiti. Se una delle scritture fallisce il computer viene
riavviato.
Per rendere operativa questa funzionalità è necessario prima
apportare alcune modifiche al sistema operativo, ed in particolare
aggiungere
la
voce
softdog
al
file
/etc/modules
e
successivamente inserire nel file /etc/modprobe.d/arch/i386
la seguente riga:
options softdog nowayout=0
108
—————————————————————— REALIZZAZIONE DEL PROGETTO
L’opzione nowayout=0 indica che il computer non deve essere
rebottato anche nel momento in cui il device viene chiuso. Questo
per evitare noiosi riavvii anche quanto, per esempio, viene fatto lo
shutdown del servizio Heartbeat [31][33];

node alpha
e node bravo – indica i nomi dei nodi del cluster
così come risulta dall’output del comando uname -n;

respawn hacluster /usr/lib/heartbeat/ipfail
– Questa
riga, ed in generale quelle di questo tipo, sono di particolare
importanza in quanto provvedono a far eseguire ad Heartbeat
comandi corrispondenti a plugin appartenenti alla suite o comandi
esterni, che vengono lanciati come processi figli dello stesso
Heartbeat.
Il comando respawn all’inizio della riga, indica che Heartbeat si
occuperà di monitorare costantemente il funzionamento del
processo, preoccupandosi di rilanciarlo nel caso in cui venga
interrotto.
In questo caso, come utente hacluster, viene eseguito il plugin
ipfail che si occupa di monitorare costantemente il collegamento
del nodo con l’esterno. Se il nodo dovesse risultare isolato ed
evidentemente non nelle condizioni di erogare il servizio ipfail
richiederà un failover del resource group;

ping
141.250.199.62
– l’ultima riga analizzata configura
l’indirizzo IP verso cui eseguire il comando ping utilizzato da
109
—————————————————————— REALIZZAZIONE DEL PROGETTO
ipfail per verificare il collegamento del nodo con l’esterno. È
evidente che tale IP deve corrispondere a un host sicuro e sempre
funzionante ed in questo caso è stato scelto il gateway della rete
esterna [32].
IL FILE “AUTHKEYS”
Come analizzato nel paragrafo 4.4.1.1, tutte le comunicazioni che
avvengono fra i nodi sono cifrate e autenticate al fine di evitare problemi
di sicurezza che potrebbero falsare il corretto funzionamento di
Heartbeat.
Attraverso i plugin di autenticazione, Heartbeat consente l’utilizzo di
algoritmi crittografici più o meno sicuri affinché si renda possibile un
corretto bilanciamento fra prestazioni e sicurezza in relazione
all’ambiente operativo del cluster[4].
Nel file authkeys si configura appunto l’algoritmo crittografico per
le comunicazioni fra i nodi ed in particolare attraverso le seguenti righe,
si specifica al cluster di utilizzare l’algoritmo SHA1.
auth 2
2 sha1 pwd!hacluster
Questa scelta è dovuta al fatto che le comunicazioni fra i nodi avvengono
anche attraverso un canale di rete insicuro ed oltretutto l’overhead
computazionale introdotto dalla codifica con SHA1 rispetto al CRC o
MD5 è assolutamente irrilevante per la potenza di calcolo dell’hardware
in uso.
110
—————————————————————— REALIZZAZIONE DEL PROGETTO
A questo punto può dirsi conclusa anche l’installazione e la
configurazione di Heartbeat, si può avere un quadro complessivo di
quanto realizzato sin qui attraverso la figura 4.9.
INTERNET / INTRANET
3C16794
Port Status
3C16794
Port Status
ä
Power
1
2
3
4
5
6
7
8
Green = 100M, Yellow = 10M, Flash = Activity
CHANNEL
bond0
BONDING eth2
ä
Power
Office Connect Switch 8
141.250.199.23
Office Connect Switch 8
CHANNEL
bond0 141.250.199.24
eth3
eth2 BONDING
IPFAIL
eth3
1
2
3
4
5
6
7
8
Green = 100M, Yellow = 10M, Flash = Activity
ttys0
ttys0
HEARTBEAT
/dev/drbd0
/dev/drbd1
eth0
0001
bond1
DRBD
bond1
192.168.1.23
CHANNEL
BONDING
192.168.1.24
eth1
WATCHDOG
eth0
0001
eth1
WATCHDOG
RAID 1 Software
RAID 1 Software
ALPHA
BRAVO
(KUBUNTU 6.06.1)
(KUBUNTU 6.06.1)
UPS SYSTEM
Figura 4-9 Schema del progetto dopo l’installazione di Heartbeat.
111
—————————————————————— REALIZZAZIONE DEL PROGETTO
4.5 Configurazione delle Virtual Machines
Dopo aver configurato lo storage condiviso tramite DRBD ed aver messo
in opera l’alta affidabilità tramite la suite Heartbeat, si può procedere
all’installazione del software necessario per far girare le macchine
virtuali.
Il prodotto scelto per questa fase, come già descritto nei paragrafi
precedenti, è la suite VMware Server, un prodotto gratuito che ha preso il
posto della versione GSX Server. La versione 1.0.1 rilasciata da pochi
mesi ha stupito per le notevoli potenzialità: non si tratta infatti solo di un
prodotto per l’utilizzo di virtual machine in ambito server, ma anche una
soluzione estremamente interessante per chi vuole avvicinarsi al mondo
della virtualizzazione sfruttando un prodotto gratuito.
Anche se non dispone di tutte le funzionalità avanzate offerte dagli
altri prodotti della stessa software house, come Workstation o ESX, offre
certamente grande flessibilità, in particolare per l’utilizzo all’interno di
gruppi di lavoro, grazie soprattutto alle funzionalità di controllo remoto e
di monitoring attraverso la rete.
VMware Server deve essere installato come demone su una
macchina che svolga funzioni di server e che sia dotata di adeguate
risorse hardware. Le macchine virtuali create sfruttano le risorse del
server, questo da il vantaggio di poterle controllare anche da un client
con limitate capacità di calcolo. L’accesso al server ed alle altre funzioni
112
—————————————————————— REALIZZAZIONE DEL PROGETTO
offerte dal prodotto della casa californiana, richiedono ovviamente una
autenticazione che VMware Server permette di integrare con permessi e
criteri di protezione per le macchine virtuali disponibili.
Il client per l’accesso al server è VMware Server Console, un
pacchetto separato ed indipendente, disponibile anch’esso gratuitamente
sul sito di VMware. La console viene utilizzata per gestire le vm presenti
su una qualsiasi macchina dotata di VMware Server, e si può farlo
direttamente dallo stesso server oppure da una qualsiasi workstation
remota. Una feature molto interessante è la possibilità, per diverse
console, di connettersi contemporaneamente ad una virtual machine,
permettendo a più utenti di avere un accesso concorrente.
VMware Server è dotato anche di una interfaccia di gestione via
web, denominata VMware Management Interface (MUI), che non è un
alternativa alla server console, ma offre strumenti di controllo sull’uso
delle risorse da parte delle virtual machine in esecuzione [41][42].
4.5.1 Installazione e configurazione di VMWare
Come illustrato nel paragrafo precedente l’installazione della suite
VMware Server prevede l’utilizzo di tre pacchetti. Dopo aver provveduto
al download dell’ultima versione per Linux dei package, dal sito della
software house (http://www.vmware.com) si può procedere con la loro
113
—————————————————————— REALIZZAZIONE DEL PROGETTO
installazione e configurazione. Tutte le fasi si intendono, dove non
esplicitamente specificato, speculari per entrambi i nodi del cluster.
VMWARE SERVER
Dopo aver scaricato il file VMware-server-1.0.1-29996.tar.gz nella
directory prescelta, si è provveduto alla decompressione dello stesso ed
al posizionamento nella cartella che ha creato.
alpha:~# cd /usr/local/src
alpha:~# tar zxvf VMware-server-1.0.1-29996.tar.gz
alpha:~# cd vmware-server-distrib
All’interno della cartella vmware-server-distrib si trova lo script che
è necessario eseguire per avviare l’installazione, tale file è scritto in Perl
ed è quindi indispensabile, per proseguire, che tutti i package relativi a
questo linguaggio siano installati nel sistema operativo.
alpha:~# ./vmware-install.pl
Lo script, nel corso dell’esecuzione, pone alcune domande in relazione ai
path in cui posizionare i vari componenti del programma. Conclusa la
fase di copia dei file viene automaticamente avviato un secondo script
(/usr/bin/vmware-config.pl) per l’impostazione dei parametri di
avvio del programma. È importante ricordare che questo comando sarà
utilizzabile anche in un secondo momento per qualsiasi eventuale
modifica alle configurazioni di VMware Server.
La prima cosa richiesta da vmware-config.pl è l’accettazione della
licenza d’uso del programma mentre la seconda è l’ubicazione dei
sorgenti del kernel.
114
—————————————————————— REALIZZAZIONE DEL PROGETTO
Questo perché il Virtual Machine Monitor, già ampliamente
descritto nel capitolo 3 e che VMware chiama vmmon, viene compilato
appositamente per il kernel in uso in base alla macchina su cui dovrà
andare in esecuzione.
Proseguendo nella configurazione ci si addentra in una delle parti
più cruciali per la virtualizzazione di macchine server: il networking.
Dopo aver risposto in modo affermativo alla domanda sull’utilizzo della
rete da parte della macchine virtuali, si deve scegliere come mappare le
interfacce di rete utilizzate da vmmon, a questo scopo si possono
scegliere tre differenti modalità di funzionamento:

bridged:
è la configurazione di default, oltre che quella
maggiormente utilizzata, con questo sistema la scheda di rete
della macchina virtuale appare come un clone di quella reale e la
vm è come se fosse direttamente connessa alla stessa sottorete
della macchina che la ospita;

host only:
ogni macchina è dotata di una scheda di rete virtuale.
Si realizza in tal modo una sottorete indipendente tra le macchine
virtuali e la macchina host. Con questa modalità, nel caso si
desideri far navigare le vm, è necessario configurare il sistema
operativo ospite come gateway della sottorete attraverso adeguate
regole di routing;

NAT:
questa opzioni è del tutto simile alla host only con l’unica
differenza che la macchina host si occupa automaticamente di
115
—————————————————————— REALIZZAZIONE DEL PROGETTO
effettuare il natting dei pacchetti provenienti dalla sottorete
virtuale.
In questo caso si è scelta l’opzione bridged in modo da poter assegnare
alle macchine virtuali, che fungeranno da server, un indirizzo IP pubblico
attraverso il quale offrire i loro servizi. La scheda di rete reale scelta per
il bridge è chiaramente l’interfaccia bond0.
Terminata la compilazione del modulo kernel relativo all’interfaccia
di rete vmnet0, corrispondente alla scheda virtuale di tipo bridged, va
impostata la porta sulla quale è in ascolto VMware Server ed attraverso
la quale VMware Server Console accede alle macchine virtuali.
Nella parte conclusiva della configurazione viene chiesto in quale
cartella si desidera memorizzare le macchine virtuali, per questa opzione
le soluzioni adottate sono differenti per i due nodi. Essendo il cluster in
configurazione Active/Active, in caso di crash di un nodo l’altro
prenderebbe in carico tutti i servizi, montando di conseguenza tutti i file
system condivisi. Non potendo per ovvi motivi effettuare il mounting di
due device sulla stessa cartella, si ha la necessità di definire un mount
point differente per ogni nodo. Questo ha portato alla scelta della cartella
/var/lib/vmware/VirtualMachinesALPHA
per il nodo alpha e la
directory /var/lib/vmware/VirtualMachinesBRAVO per il nodo bravo.
L’ultima operazione necessaria per finire l’installazione del prodotto
è l’inserimento di un numero seriale. VMware Server rimane comunque
un prodotto gratuito, ma per utilizzarlo liberamente richiede un serial
116
—————————————————————— REALIZZAZIONE DEL PROGETTO
number che la società fornisce gratuitamente dietro la compilazione di un
form informativo presente sul sito web di VMware all’indirizzo
http://register.vmware.com/content/registration.html.
Il messaggio finale di avvio dei servizi sulla macchina host,
garantisce che tutta la procedura si è conclusa correttamente e si può
procedere con l’installazione degli altri componenti.
[...]
Starting VMware services:
Virtual machine monitor
Virtual Ethernet
Bridged networking on /dev/vmnet0
done
done
done
The configuration of VMware Server 1.0.1 build-29996 for
Linux for this running kernel completed successfully.
VMWARE MANAGEMENT INTERFACE
In modo analogo a quanto già fatto per la parte server, dopo aver
scaricato il file VMware-mui-1.0.1-29996.tar.gz in /usr/local/src
si procede alla decompressione e all’avvio dello script di installazione.
alpha:~# cd /usr/local/src
alpha:~# tar -zxvf VMware-mui-1.0.1-29996.tar.gz
alpha:~# cd vmware-mui-distrib
alpha:~#./vmware-install.pl
Viene richiesta l’accettazione della licenza d’uso e quali cartelle
utilizzare per i file del pacchetto dopodiché si avvia automaticamente lo
script di configurazione /usr/bin/vmware-config.pl.
Diversamente dal pacchetto Server, la Management Interface non ha
molti parametri di configurazione, è sufficiente definire il solo timeout
delle sessioni web per terminare le impostazioni. L’output finale del
comando ci comunica che tutto si è svolto in modo corretto.
117
—————————————————————— REALIZZAZIONE DEL PROGETTO
[...]
Starting httpd.vmware:
The
configuration
of
completed successfully.
done
VMware
Management
Interface
Anche se tutto è andato a buon fine lo script non si occupa di impostare
l’avvio automatico al boot del sistema del demone relativo alla
Management Interface. Per questo motivo, come già accaduto per DRBD
ed Heartbeat, si deve agire in modo autonomo sul demone
httpd.vmware
tramite il comando sysv-rc-conf.
A questo punto si può aprire un browser qualunque e puntare
all’indirizzo di uno dei nodi, sulla porta 8222 oppure 8333, per
verificarne il funzionamento. Per ovvi motivi di sicurezza il sito utilizza
il protocollo HTTPS e di conseguenza al primo accesso verrà chiesto di
accettare il certificato SSL, che VMware a generato autonomamente,
solo dopo si potrà accedere alla maschera di login.
Figura 4-10 La finestra di login di VMware Management Interface.
VMWARE SERVER CONSOLE
L’ultimo
strumento
che
è
necessario
installare
per
rendere
completamente operativo il nostro virtual server, è anche il più facile e
118
—————————————————————— REALIZZAZIONE DEL PROGETTO
veloce. Per l’installazione è infatti sufficiente effettuare il download del
package necessario nella solita cartella /usr/local/src, decomprimere
il pacchetto e lanciare lo script di installazione vmware-install.pl.
Dopo aver indicato le cartelle di default per la copia dei file ed aver
accettato la licenza d’uso, si avvierà automaticamente lo script
/usr/bin/vmware-config-server-console.pl
che senza porre alcuna
domanda concluderà la configurazione della console.
4.5.2 Installazione delle Virtual Machines
Con l’installazione delle macchine virtuali si entra nel vivo del progetto e
si cominciano a rendere produttivi i software configurati fino ad ora. Nel
corso del paragrafo si mostreranno i passi per la messa in opera di una
macchina virtuale. Nel caso specifico si installerà una distribuzione
SUSE Linux Enterprise Server 9 sul nodo alpha.centrale.unipg.it,
ma è evidente che la medesima procedura può essere adottata per
l’installazione delle altre vm di cui si ha necessità.
La prima cosa da fare è avviare la VMware Server Console la quale
chiede subito se ci si vuole collegare alla macchina locale (localhost)
oppure ad un server remoto tramite autenticazione, avendo effettuato il
login direttamente sul server, in questa situazione, si sceglie la prima
opzione.
119
—————————————————————— REALIZZAZIONE DEL PROGETTO
Appare cosi l’interfaccia della console dalla quale si può partire per
creare una nuova Virtual Machine. Il pulsante al centro ―Create a new
virtual machine‖ è quello da premere per iniziare l’inserimento dei
parametri.
Figura 4-11 La schermata iniziale di VMware Server Console.
Le prime informazioni richieste riguardano la tipologia di sistema
operativo che dovrà essere ospitato (Red Hat, Suse, Windows XP,
Windows 2000 solo per citarne alcuni) e la posizione in cui si desidera
salvare i file. In questo caso la cartella scelta è ovviamente
/var/lib/vmware/VirtualMachinesALPHA
ma poiché il nome scelto
per la VM è echo.centrale.unipg.it ed il sistema operativo è SUSE, la
sottocartella in cui andremo a posizionare i file si chiamerà EchoSUSE.
Questa sequenza di passaggi sono visibili in modo dettagliato negli
snapshot riportati in figura 4.12.
120
—————————————————————— REALIZZAZIONE DEL PROGETTO
Figura 4-12 Fasi iniziali della configurazione di una vm con VMware Server Console.
La parte successiva della configurazione si occupa dei device che il
Virtual Machine Monitor deve emulare, ed in particolare:

il numero dei processori: VMWare Server supporta infatti anche
un’emulazione biprocessore molto utile nei casi di vm con grande
carico di lavoro ed hardware reale compatibile.

la RAM: cruciale per il buon funzionamento di tutte le macchine,
nel caso di una vm deve essere adeguatamente calibrata per
evitare di lasciare l’host oppure la vm a corto di risorse.
In questo caso per definire il quantitativo giusto di RAM si
debbono tenere in considerazione due fattori: il primo riguarda
l’alta affidabilità, nel senso che in caso di crash di un nodo il
rimanente dovrà prendere in carico tutte le macchine virtuali e
121
—————————————————————— REALIZZAZIONE DEL PROGETTO
dovrà quindi essere in grado di offrire sufficiente memoria. Il
secondo riguarda il fatto che alcune delle macchine virtuali che
andremo ad installare, non hanno grandi richieste e si
accontentano di 64 MB di RAM. Alla luce di quanto esposto e
considerando che entrambi i nodi hanno 1 GB di RAM, si è
deciso di assegnare alla macchina echo un quantitativo di RAM
pari 256 MB.

i dischi: considerando lo spazio a disposizione sullo storage
condiviso e lo scopo per cui vengono utilizzate le macchine
virtuali, si è quantificato che 4 GB siano sufficienti per un
corretto funzionamento. È importante notare che è stata
selezionata l’opzione ―Allocate all disk space now‖ per
ottimizzare il traffico sullo storage condiviso, evitando successivi
comandi di ampliamento dei file disco della macchina virtuale.

la rete: fondamentale per far comunicare le virtual machines con
l’esterno, va configurata in modalità bridged sull’interfaccia
bond0
per le motivazioni già spiegate nel paragrafo precedente.
Inserite tutte le informazioni necessarie al processo di creazione, si può
cliccare sul tasto ―Finish‖ e VMWare Server Console provvederà alla
creazione dei dischi virtuali. Conclusa l’allocazione dello spazio
necessario si tornerà alla schermata principale dalla quale premendo il
tasto ―Power On‖ si può avviare la macchina virtuale e procedere con
l’installazione del sistema operativo.
122
—————————————————————— REALIZZAZIONE DEL PROGETTO
Figura 4-13 Configurazione hardware di una vm con VMware Server Console.
Figura 4-14 Installazione del sistema operativo in una macchina virtuale.
Riutilizzando in modo iterativo la procedura descritta in questo
paragrafo, si sono successivamente installate un totale di due macchine
123
—————————————————————— REALIZZAZIONE DEL PROGETTO
virtuali per ogni nodo, secondo le caratteristiche sintetizzate nella tabella
seguente.
Nome Virtual Machines
charlie.centrale.unipg.it
(141.250.199.36)
delta.centrale.unipg.it
(141.250.199.37)
echo.centrale.unipg.it
(141.250.199.38)
foxtrot.centrale.unipg.it
(141.250.199.39)
S.O.
RAM
Disco
Nodo
Windows XP
64
4 GB
alpha
Kubuntu 6.10
256
4 GB
bravo
SUSE ES 9
256
4 GB
alpha
Windows 2000 AS
128
4 GB
bravo
Tabella 4-1 Caratteristiche delle macchine virtuali installate nei nodi.
VMWARE TOOLS
Dopo aver installato il sistema operativo su un qualsiasi computer, la
prima cosa da fare è ovviamente caricare i driver della scheda madre e
delle principali periferiche utilizzate. Allo stesso modo, al termine
dell’installazione di un sistema operativo all’interno di una macchina
virtuale, è quasi sempre necessario installare i driver forniti dal
produttore del software di virtualizzazione, che in questo caso si
chiamano VMware Tools. Questi tools possono essere caricati sul
sistema attraverso una delle voci di menu della console che simulerà
l’inserimento di un CD, con il software da installare, all’interno della
virtual machines.
Sarà sufficiente seguire le semplici indicazioni riportate sul video,
senza la necessità di impostare alcun parametro particolare, per portare a
124
—————————————————————— REALIZZAZIONE DEL PROGETTO
termine l’installare dei driver ed ottenerne i relativi vantaggi nella
compatibilità e nelle prestazioni.
Figura 4-15 Le fasi di installazione dei VMware Tools in una macchina virtuale.
4.6 Integrazione di tutto il sistema
Tutti i software necessari sono stati installati e ciò di cui si ha bisogno a
questo punto del progetto, è una loro corretta integrazione finalizzata al
raggiungimento degli scopi che ci si è prefissati sin dall’inizio.
Per integrare il sistema è necessario fare in modo che heartbeat non
si preoccupi solo di gestire il mounting delle partizioni, come ha fatto
125
—————————————————————— REALIZZAZIONE DEL PROGETTO
fino ad ora, ma sia in grado anche di avviare ed arrestare le macchine
virtuali del cluster.
Come
mostrato
nel
paragrafo
relativo
all’installazione
e
configurazione di heartbeat, per ogni risorsa che deve essere gestita viene
utilizzato
un
apposito
/etc/ha.d/resource.d/.
script
ubicato
nella
cartella
Nella stessa cartella, il pacchetto originale di
heartbeat, fornisce alcuni script preconfigurati per lo start e lo stop dei
servizi maggiormente utilizzati, tra questi si trovano quelli relativi a drbd,
raid ed lvm. In questa cartella, e nella documentazione di heartbeat, non
si fa però alcun riferimento all’utilizzo di questo software in
combinazione con macchine virtuali. Questa mancanza si verifica
principalmente per due motivazioni: la prima per la recente uscita in
versione gratuita di VMware Server e la seconda per l’assoluta novità
che il suo utilizzo con heartbeat rappresenta.
Nel corso di questo paragrafo si descriverà la realizzazione di uno
script apposito per il management delle risorse virtuali, da utilizzare
all’interno di heartbeat. Questo script rappresenta di fatto il fulcro di tutto
il progetto ed il punto di congiunzione di tutti i software di cui si è
parlato sin ora.
Prima di iniziare con la stesura del codice è bene comprendere quali
sono gli strumenti di cui si avrà bisogno. Andando ad operare con le
macchine virtuali di VMware Server è indispensabile avere a
disposizione un comando che consenta di agire direttamente sulle vm in
126
—————————————————————— REALIZZAZIONE DEL PROGETTO
esecuzione. Proprio per venire in contro a queste esigenze, la software
house ha inserito nel suo pacchetto server una serie di comandi, tra i
quali il più interessante è vmware-cmd. Questo eseguibile si occupa di
interfacciarsi con il demone server e di svolgere determinate operazioni
sulle virtual machines, si riportano qui di seguito le principali opzioni
utilizzate nel corso della stesura dello script [39]:

getstate:
restituisce lo stato di esecuzione di una macchina
virtuale, i possibili valori sono on, off, suspended, stuck che
identifica uno stato in cui si richiede l’intervento dell’utente per
l’immissione di un determinato input oppure unknown;

start:
avvia un macchina virtuale precedentemente posta in stato
power-off oppure ne ripristina una sospesa;

suspend:

answer:
sospende una virtual machine;
permette all’utente di rispondere ad eventuali domande
poste dal software di virtualizzazione, relativamente ad una
macchina virtuale che è in attesa di avere informazioni;

getconfig:
restituisce il valore di un determinato parametro
relativo al file di configurazione della vm specificata;

getuptime:
accede alla varibile di uptime del sistema operativo
della macchina virtuale.
Chiarite le opzioni del commando che si andrà ad utilizzare, si può
iniziare la stesura dello script. Al fine di realizzare una procedura in
grado di adattarsi alla maggior parte delle situazioni, si è cercato di
127
—————————————————————— REALIZZAZIONE DEL PROGETTO
renderla il più possibile parametrica sia riguardo alle informazioni di
input che alle funzionalità supportate, in previsione dei possibili utilizzi
all’interno di heartbeat.
Come in qualsiasi listato di un programma, nella parte iniziale si
sono definite ed impostate le variabili. Avendo pensato di introdurre un
certo livello di parametrizzazione si è deciso che la prima informazione
fornita debba indicare il file con estensione vmx associato alla macchina
virtuale sulla quale si vuole operare, mentre la seconda l’obiettivo che si
vuole raggiungere attraverso l’esecuzione dello script. Questi due
parametri sono stati rispettivamente associati alle variabili RISORSA e
COMANDO.
Contestualmente alle variabili associate ai parametri verranno
impostate anche tre costanti VMWARECMD, VM_PATH e ADMIN_MAIL che
identificano rispettivamente il path del comando vmware-cmd, il path
base in cui si trovano tutte le macchine virtuali e l’indirizzo degli
amministratori per i messaggi di notifica che lo script invierà.
VMWARECMD="/usr/bin/vmware-cmd"
VM_PATH="/var/lib/vmware/VirtualMachines"
RES="$1"
CMD="$2"
ADMIN_MAIL="[email protected]"
In funzione dell’operazione che si vuole eseguire sulla virtual machine
passata come parametro, si eseguiranno differenti procedure, è per questo
che il contenuto della variabile COMANDO verrà valutato da un ciclo di tipo
case
in base a due possibilità start oppure stop.
128
—————————————————————— REALIZZAZIONE DEL PROGETTO
Nella fase di start si avvierà la macchina virtuale specificata nella
variabile RISORSA attraverso il comando $VMWARECMD $RISORSA start.
Questo comando non risolve però tutte le problematiche inerenti l’avvio
di una macchina virtuale. In alcuni test di funzionamento dello script
infatti, si sono evidenziate alcune difficoltà che è stato indispensabile
risolvere mediante l’aggiunta di ulteriori istruzioni.
Durante la fase di takeover del cluster, quando cioè le macchine
virtuali passano da un nodo all’altro, VMware Server segnala un errore
relativo all’uuid (Universally Unique Identifier). L’uuid è un codice
univoco che viene generato dal demone VMware ed assegnato ad una vm
sulla base dell’hardware utilizzato della macchina host, serve da un lato
ad identificare in modo univoco la macchina guest e dall’altro per la
creazione di codici unovoci relativi all’harware virtuale, come il MAC
address della schede di rete.
Con il cambio di nodo, l’uuid ricalcolato per la macchina virtuale
ovviamente cambia e VMware si accorge che il codice non è più
corrispondente. Per questo motivo vuole sapere se deve essere mantenuto
oppure si desidera generare un nuovo codice basandosi sull’hardware
della nuova macchina host. Poiché questo tipo di errore è bloccante,
ovvero non permette alla fase di start di procedere in modo autonomo
senza ottenere una risposta, si deve intervenire per risolverlo. La
soluzione adottata è quella di modificare il file di configurazione di ogni
129
—————————————————————— REALIZZAZIONE DEL PROGETTO
virtual machines (il file con estensione vmx) aggiungendo o modificando
il parametro uuid.action nel modo seguente:
[...]
uuid.action = "keep"
L’adozione di questa impostazione fa in modo che l’uuid delle machine
virtuali non venga mai cambiato indipendentemente dalla macchina host
che si occupa della sua esecuzione, un ulteriore vantaggio derivante da
questa scelta è il mantenimento dello stesso MAC address indispensabile
per non pertere le connessioni attive in caso di un takeover graceful.
Un ulteriore problematica riscontrata in questo progetto, ma che si
verifica unicamente in presenza di nodi non perfettamente speculari dal
punto di vista hardware, riguarda il resume di una macchina virtuale
precedentemente sospesa su un nodo con processore differente. Al
verificarsi di questa situazione VMware Server avverte della possibilità
di malfunzionamenti dovuti alle differenze architetturali dei due
processori. Questa difficoltà è stata superata grazie all’opzione answer
del comando vmware-cmd che consente, con gli opportuni accorgimenti,
di rispondere alle eventuali domande poste dal demone. Poiché questa
situazione si verifica solamente in presenza di uno stato stuck della
macchina virtuale, la procedura di risposta è stata inserita in una struttura
condizionale if-fi, in modo da eseguire i comandi solo se richiesto.
if [ $($VMWARECMD $VM_PATH$RES getstate 2>&1 \
| sed 's/getstate() =//g') = "stuck" ]; then
echo 0 | $VMWARECMD $VM_PATH$RES answer
fi
130
—————————————————————— REALIZZAZIONE DEL PROGETTO
Le configurazioni e le scelte si qui effettuate hanno permesso di generare
un ottima procedura per lo start, ma ulteriori test supplementari hanno
messo in evidenza una difficoltà oggettiva imputabile alla potenza dei
nodi.
Quando heartbeat prende in carico le risorse ed avvia gli script
associati, questi vengono lanciati in successione secondo l’elenco
definito nel file haresources. Una macchina virtuale impiega diverso
tempo per portare a termine la fase di boot, ma poichè lo script non
attende la fine di questo processo per passare il controllo allo script
successivo, può accadere che alcune virtual machines vengano avviate
praticamente in contemporanea. Tale situazione mette decisamente in
crisi le non eccessive risorse dei nodi, aumentando in modo significativo
il tempo totale di avvio delle macchine.
Questo problema è stato superato grazie all’idea di non terminare lo
script fino a quando la vm, per la quale è stato mandato in esecuzione,
non abbia completamente terminato la fase di boot. Per fare ciò si è
creato un sistema di attesa attiva, controllando lo stato del parametro
getuptime,
che conclude lo script solamente dopo un determinato lasso
di tempo calcolato sulla base dello stato precedente della macchina
virtuale. È evidente infatti che una macchina in stato suspended
impiegherà di certo meno tempo ad avviarsi di una macchina in stato
off.
131
—————————————————————— REALIZZAZIONE DEL PROGETTO
if [ ${STARTUP_STATE//getstate() =/} = "off" ]; then
TIMER=60
elif [ ${STARTUP_STATE//getstate() =/} = "on" ]; then
TIMER=0
elif [ ${STARTUP_STATE//getstate() =/} = "suspended" ]; then
TIMER=`expr $($VMWARECMD $VM_PATH$RES getuptime 2>&1 \
| sed 's/getuptime() =//g') + 15`
fi
while [
$($VMWARECMD $VM_PATH$RES getuptime 2>&1 \
| sed 's/getuptime() =//g') –l t $TIMER ]; do
wait
done
Concluso lo sviluppo dello script nella parte di start si è passati ad
analizzare quella di stop, che ha come scopo primario quello di arrestare
le macchine virtuali in caso di takeover graceful.
Al fine di velocizzare il più possibile la transizione delle risorse da
un nodo all’altro e per fare in modo che il takeover non provochi la
perdita delle sessioni stabilite dagli utenti con la macchina virtuale, si è
deciso di adottare la sospensione della virtual machines e non il loro
arresto.
Prima di procedere all’esecuzione del comando per l’ibernazione
della vm è indispensabile, onde evitare errori nell’esecuzione, controllare
che la macchina virtuale sia effettivamente in eseuzione. Questo è
attuabile attraverso un semplice controllo all’interno della cartella
/var/run
utilizzata dal sistema operativo per memorizzare i processi in
esecuzione.
if [ -d /var/run/vmware/`echo $VM_PATH$RES \
| sed 's/\//%2F/g' | sed 's/\./%2E/g'` ]; then
$VMWARECMD $VM_PATH$RES suspend
fi
132
—————————————————————— REALIZZAZIONE DEL PROGETTO
Al termine del ciclo case si è pensato di inviare un messaggio di posta
elettronica agli indirizzi specificati nella variabile ADMIN_MAIL per
inviare alcune informazioni e notificare l’avvenuto avvio o sospensione
delle macchine virtuali sul nodo .
mailx -s "Virtual machine `$VMWARECMD $VM_PATH$RES \
getconfig displayName|sed 's/getconfig(displayName) \
=//g'` $CMD on `hostname`" $ADMIN_MAIL << EOF
Virtual Machine: `$VMWARECMD $VM_PATH$RES getconfig \
displayName | sed 's/getconfig(displayName) =//g'`
Status: `$VMWARECMD $VM_PATH$RES getstate \
| sed 's/getstate() =//g'`
Uptime: `$VMWARECMD $VM_PATH$RES getuptime \
| sed 's/getuptime() =//g'`
Config $VM_PATH$RES
EOF
Terminato lo script necessario all’integrazione tra heartbeat e VMware
Server, è indispensabile apportare alcune modifiche ai file di
configurazione di heartbeat stesso, questo per fare in modo che il codice
realizzato venga utilizzato e che le macchine virtuali possano entrare a
far parte, come risorse attive, del cluster in alta affidabilità scopo di
questo progetto.
Come prima cosa è necessario arrestare manualmente tramite
vmware-server-console
le macchine virtuali eventualmente avviate e
successivamente provvedere all’arresto di heartbeat su entrambi i nodi
del cluster.
alpha:~# /etc/init.d/heartbeat stop
Stopping High-Availability services:
Done.
bravo:~# /etc/init.d/heartbeat stop
Stopping High-Availability services:
Done.
133
—————————————————————— REALIZZAZIONE DEL PROGETTO
A questo punto si deve aprire il file /etc/ha.d/haresources in
entrambi i nodi e modificare le righe relative alle risorse assegnate nel
modo seguente:
alpha drbddisk::drbd0 \
Filesystem::/dev/drbd0::/var/lib/vmware/VirtualMachinesALPHA::ext3 \
vmmanager::ALPHA/CharlieXP/CharlieXP.vmx \
vmmanager::ALPHA/EchoSUSE/EchoSUSE.vmx
bravo drbddisk::drbd1 \
Filesystem::/dev/drbd1::/var/lib/vmware/VirtualMachinesBRAVO::ext3 \
vmmanager::BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx \
vmmanager::BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx
Concluse le modifiche al file, si può riavviare heartbeat e verificare,
come mostrato nella figura 4.16, che tutte le macchine virtuali
configurate si siano avviate in modo corretto e che i relativi messaggi di
posta elettronica siano stati spediti ai destinatari.
Figura 4-16 Avvio di heartbeat e test di funzionalità dello script realizzato.
134
—————————————————————— REALIZZAZIONE DEL PROGETTO
Con queste ultime operazioni si può dire terminata la realizzazione dello
script per la gestione delle macchine virtuali e contestualmente si può
ritenere concluso anche il progetto sperimentale di integrare l’alta
affidabilità di heartbeat con il sistema di virtualizzazione di VMware
Server.
Nelle due figure seguenti si può osservare lo schema completo del
progetto e la foto delle macchine nella loro configurazione definitiva.
INTERNET / INTRANET
3C16794
Port Status
3C16794
Port Status
ä
Power
CHANNEL
bond0
BONDING eth2
ä
Power
1
2
3
4
5
6
7
8
Green = 100M, Yellow = 10M, Flash = Activity
Office Connect Switch 8
141.250.199.23
Office Connect Switch 8
CHANNEL
bond0 141.250.199.24
eth3
eth2 BONDING
IPFAIL
eth3
1
2
3
4
5
6
7
8
Green = 100M, Yellow = 10M, Flash = Activity
VM
VM
Windows XP
ttys0
ttys0
Kubuntu 6.10
(DELTA)
(CHARLIE)
VM
VM
HEARTBEAT
Suse 10.2
Windows 2000
(ECHO)
(FOXTROT)
/dev/drbd0
/dev/drbd1
eth0
0001
eth0
bond1
DRBD
bond1
192.168.1.23
CHANNEL
BONDING
192.168.1.24
eth1
WATCHDOG
0001
eth1
WATCHDOG
RAID 1 Software
RAID 1 Software
ALPHA
BRAVO
(KUBUNTU 6.06.1)
(KUBUNTU 6.06.1)
UPS SYSTEM
Figura 4-17 Schema finale del progetto.
135
—————————————————————— REALIZZAZIONE DEL PROGETTO
Figura 4-18 Foto del cluster nella configurazione definitiva.
4.7 Testing del progetto
La fase di testing del progetto consiste nel simulare due potenziali
situazioni critiche e verificare a posteriori che il comportamento del
cluster configurato sia adeguato alle aspettative.
Nel primo esperimento si effettuerà un takeover graceful, ovvero si
sposteranno tutte le risorse su un unico nodo, imitanto un caso tipico di
intervento programmato da parte dell’amministratore. Nel secondo test
verrà invece simulato un crash completo del sistema, attraverso un
intervento diretto sul cavo di alimentazione di uno dei nodi.
136
—————————————————————— REALIZZAZIONE DEL PROGETTO
TAKEOVER GRACEFUL
Uno spostamento dei resource group effettuato in modo controllato,
prevede l’arresto su uno dei nodi del demone heartbeat, il quale
chiudendosi richiama lo script vmmanager per la sospensione delle
macchine virtuali. Per controllare in modo attento l’evolversi della
situazione e verificarne il corretto andamento, è necessario monitorare in
entrambe le macchine i log generati da heartbeat all’interno del file
/var/log/ha-log.
I comandi ping e ssh possono essere invece
utilizzati per definire l’ammontare del downtime subito dagli utenti nel
corso dell’intervento e per verificare che le sessioni aperte con le
macchine virtuali prima della migrazione non siano andate perdute ma
siano ancora attive e funzionanti.
Come prima cosa si apra una shell sul nodo bravo e si esegua lo
shutdown di heartbeat:
bravo:~# /etc/init.d/heartbeat stop
Stopping High-Availability services:
Done.
Analizzando dettagliatamente i log del nodo bravo riportati nella pagina
seguente, si può notare come le operazioni di rilascio delle risorse
avvengano in sequenza: prima la sospensione delle virtual machines a
carico del nodo tramite vmmanager, successivamente l’unmounting del
file system utilizzato per la memorizzazione delle macchine virtuali, poi
l’arrestato del demone di DRBD ed infine il killing di tutti i processi
heartbeat ancora rimasti.
137
—————————————————————— REALIZZAZIONE DEL PROGETTO
info: Heartbeat shutdown in progress. (6134)
info: Giving up all HA resources.
[...]
info: Releasing resource group: bravo drbddisk::drbd1
Filesystem::/dev/drbd1::/var/lib/vmware/VirtualMachinesBRAVO:
:ext3 vmmanager::BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx
vmmanager::BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx
info: Running /etc/ha.d/resource.d/vmmanager
BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx stop
info: Running /etc/ha.d/resource.d/vmmanager
BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx stop
info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd1
/var/lib/vmware/VirtualMachinesBRAVO ext3 stop
INFO: Running stop for /dev/drbd1 on
/var/lib/vmware/VirtualMachinesBRAVO
INFO: Trying to unmount /var/lib/vmware/VirtualMachinesBRAVO
INFO: unmounted /var/lib/vmware/VirtualMachinesBRAVO successfully
INFO: Success
info: Running /etc/ha.d/resource.d/drbddisk drbd1 stop
info: All HA resources relinquished.
info: killing /usr/lib/heartbeat/ipfail process group 6158 with
signal 15
info: killing HBWRITE process 6138 with signal 15
[...]
info: bravo Heartbeat shutdown complete.
Una successiva analisi dei log di alpha, mostra invece la segnalazione
dello shutdown di heartbeat dall’altro nodo e il conseguente inizio delle
operazioni per la presa in carico delle risorse. Nelle ultime righe si può
notare come la macchina bravo non risponda più ad alcun segnale e
venga pertanto dichiarata dead.
info:
info:
[...]
info:
info:
info:
info:
INFO:
INFO:
info:
Received shutdown notice from 'bravo'.
Resources being acquired from bravo.
Taking over resource group drbddisk::drbd1
Acquiring resource group: bravo drbddisk::drbd1
Filesystem::/dev/drbd1::/var/lib/vmware/VirtualMachinesBRAVO:
:ext3 vmmanager::BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx
vmmanager::BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx
Running /etc/ha.d/resource.d/drbddisk drbd1 start
Running /etc/ha.d/resource.d/Filesystem /dev/drbd1
/var/lib/vmware/VirtualMachinesBRAVO ext3 start
Running start for /dev/drbd1 on
/var/lib/vmware/VirtualMachinesBRAVO
Success
Running /etc/ha.d/resource.d/vmmanager
BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx start
138
—————————————————————— REALIZZAZIONE DEL PROGETTO
info: Running /etc/ha.d/resource.d/vmmanager
BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx start
info: /usr/lib/heartbeat/mach_down: nice_failback: foreign resources
acquired
info: mach_down takeover complete for node bravo.
info: mach_down takeover complete.
WARN: node bravo: is dead
info: Dead node bravo gave up resources.
info: Link bravo:bond0 dead.
info: Link bravo:bond1 dead.
info: Link bravo:/dev/ttyS0 dead.
Come già accennato ad inizio paragrafo, nel corso del takeover si sono
tenute sotto controllo le macchine virtuali del nodo bravo mediante il
comando ping. Come mostra l’output qui di seguito, lo spostamento
delle risorse ha impiegato solo pochi secondi per concludersi ed inoltre le
sessioni aperte dagli utenti prima della sospensione, siano esse ssh, http
oppure ftp, sono rimaste intatte dopo il ripristino, chiaro indice della
totale trasparenza dell’operazione.
[mirco@lillo ~]$ ping -i 5 delta.centrale.unipg.it
PING delta.centrale.unipg.it (141.250.199.37) 56(84) bytes of data.
64 bytes from 141.250.199.37: icmp_seq=1 ttl=64 time=0.911 ms
64 bytes from 141.250.199.37: icmp_seq=2 ttl=64 time=0.285 ms
From 141.250.199.20 icmp_seq=5 Destination Host Unreachable
From 141.250.199.20 icmp_seq=6 Destination Host Unreachable
From 141.250.199.20 icmp_seq=7 Destination Host Unreachable
From 141.250.199.20 icmp_seq=8 Destination Host Unreachable
64 bytes from 141.250.199.37: icmp_seq=9 ttl=64 time=0.298 ms
64 bytes from 141.250.199.37: icmp_seq=10 ttl=64 time=0.381 ms
[mirco@lillo ~]$ ping -i 5 foxtrot.centrale.unipg.it
PING foxtrot.centrale.unipg.it (141.250.199.39) 56(84) bytes of data.
64 bytes from 141.250.199.39: icmp_seq=1 ttl=128 time=1.10 ms
64 bytes from 141.250.199.39: icmp_seq=2 ttl=128 time=0.313 ms
From 141.250.199.20 icmp_seq=5 Destination Host Unreachable
From 141.250.199.20 icmp_seq=6 Destination Host Unreachable
From 141.250.199.20 icmp_seq=7 Destination Host Unreachable
From 141.250.199.20 icmp_seq=8 Destination Host Unreachable
From 141.250.199.20 icmp_seq=9 Destination Host Unreachable
64 bytes from 141.250.199.39: icmp_seq=10 ttl=128 time=1008 ms
64 bytes from 141.250.199.39: icmp_seq=11 ttl=128 time=0.295 ms
139
—————————————————————— REALIZZAZIONE DEL PROGETTO
Figura 4-19 La MUI mostra lo stato delle quattro macchine virtuali sul nodo alpha .
Verificato che il takeover si è svolto correttamente e che le risorse sono
migrate in maniera trasparente per l’utente, si può ripristinare lo stato
iniziale riavviando heartbeat sul nodo bravo. In questo caso il demone
richiede immediatamente le sue risorse ad alpha, il quale, resosi conto
dello stato attivo dell’altro nodo, rilascia il resource group permettendo a
bravo
alpha,
di riportare la
situazione allo stato originale. I log del nodo
qui sotto riportati, mostrano la sequenza degli eventi appena
descritta.
info:
info:
info:
info:
info:
info:
info:
info:
info:
info:
info:
info:
info:
Heartbeat restart on node bravo
Link bravo:/dev/ttyS0 up.
Status update for node bravo: status init
Link bravo:bond0 up.
Link bravo:bond1 up.
Status update for node bravo: status up
all clients are now paused
Status update for node bravo: status active
remote resource transition completed.
alpha wants to go standby [foreign]
all clients are now resumed
standby: bravo can take our foreign resources
give up foreign HA resources (standby).
140
—————————————————————— REALIZZAZIONE DEL PROGETTO
info: Releasing resource group: bravo drbddisk::drbd1
Filesystem::/dev/drbd1::/var/lib/vmware/VirtualMachinesBRAVO:
:ext3 vmmanager::BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx
vmmanager::BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx
info: Running /etc/ha.d/resource.d/vmmanager
BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx stop
info: Running /etc/ha.d/resource.d/vmmanager
BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx stop
info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd1
/var/lib/vmware/VirtualMachinesBRAVO ext3 stop
INFO: Running stop for /dev/drbd1 on
/var/lib/vmware/VirtualMachinesBRAVO
INFO: Trying to unmount /var/lib/vmware/VirtualMachinesBRAVO
INFO: unmounted /var/lib/vmware/VirtualMachinesBRAVO successfully
INFO: Success
info: Running /etc/ha.d/resource.d/drbddisk drbd1 stop
info: foreign HA resource release completed (standby).
info: Local standby process completed [foreign].
WARN: 1 lost packet(s) for [bravo] [51:53]
info: remote resource transition completed.
info: No pkts missing from bravo!
info: Other node completed standby takeover of foreign resources.
Tutti i passaggi inerenti le macchine virtuali sono visualizzabili sul client
di posta elettronica degli amministratori ove ogni operazione di avvio e
arresto delle macchine virtuali è debitamente segnalato da un messaggio
di posta elettronica inviato dallo script vmmanager.
Figura 4-20 Il client Kmail mostra la sequenza di messaggi di up e down delle vm.
141
—————————————————————— REALIZZAZIONE DEL PROGETTO
CRASH DEL SISTEMA
Questa simulazione è abbastanza dura ma mette realmente alla prova il
cluster che è stato realizzato permettendo di verificarne il funzionamento
in situazioni critiche. Scollegando, a sistema attivo, il cavo di
alimentazione del nodo bravo si simulerà un malfunzionamento
hardware fatale, che costringerà alpha ad accorgersi autonomamente del
problema ed a ripristinare le macchine virtuali nel minor tempo possibile.
WARN:
WARN:
info:
info:
info:
info:
info:
info:
info:
info:
info:
info:
INFO:
INFO:
info:
info:
info:
info:
info:
node bravo: is dead
No STONITH device configured.
Resources being acquired from bravo.
Link bravo:/dev/ttyS0 dead.
Link bravo:bond0 dead.
Link bravo:bond1 dead.
Running /etc/ha.d/rc.d/status status
Taking over resource group drbddisk::drbd1
Acquiring resource group: bravo drbddisk::drbd1
Filesystem::/dev/drbd1::/var/lib/vmware/VirtualMachinesBRAVO:
:ext3 vmmanager::BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx
vmmanager::BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx
Local Resource acquisition completed.
Running /etc/ha.d/resource.d/drbddisk drbd1 start
Running /etc/ha.d/resource.d/Filesystem /dev/drbd1
/var/lib/vmware/VirtualMachinesBRAVO ext3 start
Running start for /dev/drbd1 on
/var/lib/vmware/VirtualMachinesBRAVO
Success
Running /etc/ha.d/resource.d/vmmanager
BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx start
Running /etc/ha.d/resource.d/vmmanager
BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx start
/usr/lib/heartbeat/mach_down: nice_failback: foreign resources
acquired
mach_down takeover complete for node bravo.
mach_down takeover complete.
Nonostante il test effettuato sia un pò drastico, il nodo alpha ha reagito
secondo le aspettative avviando correttamente tutte le macchine virtuali,
mostrando inoltre l’effettiva forza e potenzialità del progetto. I tempi di
ripristino sono leggermente più lunghi rispetto ad un takeover graceful,
142
—————————————————————— REALIZZAZIONE DEL PROGETTO
ma questo è comprensibile trattandosi di un boot della macchina virtuale
a seguito di crash di sistema e non di un meno complesso resume.
Lo schema riportato nella figura di seguito mostra infine lo stato del
progetto in caso di takeover delle risorse sia esso graceful o dovuto ad al
crash di uno dei nodi.
Figura 4-21 Schema del progetto a seguito del crash simulato.
143
————————————————————————————— CONCLUSIONI
Conclusioni
Il presente lavoro di tesi, sviluppato presso la Ripartizione Servizi
Informatici e Statistici dell’Università degli Studi di Perugia, è stato
realizzato con l’obiettivo di migliorare l’efficienza, l’affidabilità e
l’ottimizzazione delle risorse presenti nella sala server attraverso
l’integrazione sperimentale di vari sistemi software.
Molte della macchine utilizzate come server dall’Ateneo, risultano
sovradimensionate rispetto alla potenza di calcolo richiesta dagli
applicativi in esse installati. Questa situazione rappresenta di fatto un
dispendio da vari punti di vista: dal lato economico per gli ingenti
investimenti immobilizzati, da quello delle risorse umane per la necessità
da parte degli amministratori di monitorare numerose macchine ed infine
dal punto di vista dell’utente che, in caso di malfunzionamenti hardware
delle macchine, deve subire fastidiose e spesso prolungate interruzioni
dei servizi.
Tutte queste motivazioni hanno condotto verso la decisione di
sperimentare
un
sistema
che
consentisse
la
virtualizzazione
dell’hardware al fine di ottimizzare le risorse. Nel contempo si è anche
cercato di migliorare il più possibile l’affidabilità complessiva dei sistemi
144
————————————————————————————— CONCLUSIONI
riconfigurati per diminuire di conseguenza l’eventuale discontinuità dei
servizi.
Le diverse problematiche emerse sono state tutte risolte mediante
l’utilizzo di vari software, ognuno dei quali specializzato in un
particolare ambito del progetto: DRBD per la realizzazione e la gestione
dello storage condiviso, Heartbeat per il management dell’alta
affidabilità e VMware Server per la virtualizzazione dell’hardware. Alla
configurazione e messa in funzione dei software si è aggiunto poi un
notevole lavoro di integrazione degli stessi, che ha portato alla
progettazione e alla realizzazione di uno script per la gestione delle
macchine virtuali indispensabile per il corretto funzionamento di tutto il
lavoro.
Ritengo che quanto svolto in questa tesi sia un interessante ed
innovativo
esempio
di
come
l’utilizzo
di
diverse
tecnologie,
adeguatamente integrate tra loro, possa migliorare la qualità e
l’affidabilità dei servizi di rete all’interno di una struttura, garantendo
una relativamente modesta difficoltà di configurazione ed un
considerevole risparmio economico.
Vorrei inoltre aggiungere che l’esperienza acquisita nel corso della
realizzazione di questo lavoro, ha posto le basi per l’avvio di un nuovo
progetto di sperimentazione analogo ma basato su ambiente Microsoft
che porterà alla messa in opera di un secondo cluster.
145
————————————————————————————— CONCLUSIONI
Ciò che tengo infine a sottolineare è che l’implementazione
dell’ambiente oggetto di questa tesi, attraverso l’utilizzo di software
completamente gratuiti, rappresenta forse la prima installazione coerente
e funzionante di cui si abbia una traccia evidente; in altre parole, ad oggi
non si hanno analoghi feedback in internet e nella comunità scientifica di
progetti analoghi che utilizzino gli stessi strumenti.
146
———————————————— APPENDICE A – I FILE DEL SISTEMA OPERATIVO
Appendice A
I file del Sistema Operativo
A-1 I file /etc/network/interfaces
# ALPHA
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
address 127.0.0.1
netmask 255.0.0.0
# The primary network interface
auto bond0
iface bond0 inet static
address 141.250.199.23
netmask 255.255.255.192
gateway 141.250.199.62
post-up ifenslave bond0 eth2 eth3
pre-down ifenslave -d bond0 eth2 eth3
# The secondary network interface
auto bond1
iface bond1 inet static
address 192.168.1.23
netmask 255.255.255.0
network 192.168.1.0
post-up ifenslave bond1 eth0 eth1
pre-down ifenslave -d bond1 eth0 eth1
147
———————————————— APPENDICE A – I FILE DEL SISTEMA OPERATIVO
# BRAVO
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
address 127.0.0.1
netmask 255.0.0.0
# The primary network interface
auto bond0
iface bond0 inet static
address 141.250.199.24
netmask 255.255.255.192
gateway 141.250.199.62
post-up ifenslave bond0 eth2 eth3
pre-down ifenslave -d bond0 eth2 eth3
# The secondary network interface
auto bond1
iface bond1 inet static
address 192.168.1.24
netmask 255.255.255.0
network 192.168.1.0
post-up ifenslave bond1 eth0 eth1
pre-down ifenslave -d bond1 eth0 eth1
148
———————————————— APPENDICE A – I FILE DEL SISTEMA OPERATIVO
A-2 Il file /etc/modprobe.d/arch/i386
alias parport_lowlevel parport_pc
alias binfmt-0064 binfmt_aout
alias binfmt-332 iBCS
alias bond0 bonding
alias bond1 bonding
options bonding mode=3 max_bonds=2 miimon=100 downdelay=200
updelay=200
options softdog nowayout=0
149
———————————————— APPENDICE A – I FILE DEL SISTEMA OPERATIVO
A-3 Elenco dei pacchetti installati
acpi
acpi-support
acpid
adduser
adept
akregator
alsa-base
alsa-utils
amarok
amarok-xine
anacron
apmd
app-install-data
appres
apt
apt-utils
aptitude
ark
arts
artsbuilder
aspell
aspell-en
at
autoconf
automake1.4
autotools-dev
base-files
base-passwd
bash
bc
beforelight
belocs-locales-bin
bicyclerepair
bind9-host
binutils
binutils-static
bison
bitmap
blt
bluez-cups
bluez-pcmcia-support
bluez-utils
bogofilter
bogofilter-bdb
bogofilter-common
brltty
bsdmainutils
bsdutils
bsh
build-essential
busybox-initramfs
bzip2
ca-certificates
cdparanoia
cdrdao
cdrecord
console-common
console-data
console-tools
coreutils
cpio
cpp
cpp-4.0
cron
cupsys
cupsys-bsd
cupsys-client
cupsys-driver-gutenprint
dbus
dc
debconf
debconf-i18n
debianutils
debtags
defoma
dhcp3-client
dhcp3-common
dictionaries-common
diff
discover1
discover1-data
diveintopython
dmidecode
dmsetup
dnsutils
doc-base
doc-debian
docbook-xml
dosfstools
dpkg
dpkg-dev
dselect
dvd+rw-tools
e2fslibs
e2fsprogs
ed
editres
eject
enscript
esound-common
ethtool
evms
evms-ncurses
example-content
fastjar
fdutils
file
findutils
finger
firefox
firefox-themes-ubuntu
flex
fontconfig
foo2zjs
foomatic-db
foomatic-db-engine
foomatic-db-gutenprint
foomatic-db-hpijs
foomatic-filters
foomatic-filters-ppds
fortune-mod
fortunes-min
freeglut3
fstobdf
ftp
g++
g++-4.0
gamin
gcc
gcc-3.3-base
gcc-4.0
gcc-4.0-base
gcj-4.1-base
gettext
gettext-base
gij-4.1
gnupg
grep
grepmap
groff-base
grub
gs-common
gs-esp
gsfonts
gtk2-engines-gtk-qt
gwenview
gzip
hal
hdparm
hicolor-icon-theme
hostname
hotkey-setup
hpijs
hplip
hplip-data
hplip-ppds
hwdata
iceauth
ico
ifenslave
ifenslave-2.6
ifupdown
ijsgutenprint
imagemagick
imake
info
initramfs-tools
initscripts
inputattach
installation-report
intltool-debian
iproute
iptables
iputils-arping
iputils-ping
iputils-tracepath
irssi
java-common
java-gcj-compat
jfsutils
k3b
kaddressbook
kaffeine
kaffeine-xine
kamera
karm
katapult
kate
kaudiocreator
kcontrol
kcron
kde-guidance
kde-i18n-it
kde-style-lipstik
kde-systemsettings
150
———————————————— APPENDICE A – I FILE DEL SISTEMA OPERATIVO
kdeadmin-kfile-plugins
kdebase-bin
kdebase-data
kdebase-kio-plugins
kdebluetooth
kdegraphics-kfile-plugins
kdelibs-bin
kdelibs-data
kdelibs4c2a
kdemultimedia-kfile-plugins
kdemultimedia-kio-plugins
kdenetwork-filesharing
kdenetwork-kfile-plugins
kdepasswd
kdepim-kio-plugins
kdepim-kresources
kdepim-wizards
kdeprint
kdesktop
kdm
kdnssd
keep
kfind
kghostview
khelpcenter
kicker
kio-apt
kio-locate
klaptopdaemon
klibc-utils
klipper
klogd
kmail
kmailcvt
kmenuedit
kmilo
kmix
kmplayer-base
kmplayer-konq-plugins
knetworkconf
knotes
koffice-data
koffice-libs
konq-plugins
konqueror
konqueror-nsplugins
konsole
kontact
konversation
kooka
kopete
korganizer
kpdf
kpf
kppp
krdc
krfb
krita
krita-data
kscd
kscreensaver
ksmserver
ksnapshot
ksplash
ksplash-engine-moodin
ksvg
ksysguard
ksysguardd
ksystemlog
ksysv
ktorrent
kubuntu-artwork-usplash
kubuntu-default-settings
kubuntu-desktop
kubuntu-docs
kubuntu-konqueror-shortcuts
kwalletmanager
kwin
kwin-style-crystal
landscape-client
language-pack-en
language-pack-en-base
language-pack-kde-en
language-pack-kde-en-base
language-pack-kde-it
language-pack-kde-it-base
language-selector-common
language-selector-qt
language-support-en
laptop-detect
laptop-mode-tools
less
lftp
libacl1
libadns1
libakode2
libao2
libapm1
libart-2.0-2
libarts1-akode
libarts1c2a
libartsc0
libasound2
libaspell15
libatk1.0-0
libatm1
libattr1
libaudio2
libaudiofile0
libavahi-client3
libavahi-common-data
libavahi-common3
libavahi-qt3-1
libbind9-0
libblkid1
libblockfile1
libbluetooth1
libbrlapi1
libbz2-1.0
libbz2-dev
libc6
libc6-dev
libc6-i686
libcairo2
libcap1
libcdparanoia0
libcomerr2
libconsole
libcupsimage2
libcupsys2
libcurl3
libcurl3-gnutls
libcurses-perl
libcurses-ui-perl
libdb2
libdb4.3
libdbus-1-2
libdbus-glib-1-2
libdbus-qt-1-1c2
libdevmapper1.02
libdiscover1
libdmx1
libdns21
libdrm2
libedit2
libelfg0
libesd-alsa0
libevms-2.5
libexif12
libexpat1
libflac++5c2
libflac7
libfontconfig1
libfontenc1
libfreetype6
libfribidi0
libfs6
libgadu3
libgamin0
libgc1c2
libgcc1
libgcj-common
libgcj7
libgcj7-jar
libgcrypt11
libgcrypt11-dev
libgd2-noxpm
libgdbm3
libgdk-pixbuf2
libgeoip1
libgl1-mesa
libgl1-mesa-dri
libglade0
libglade2-0
libglib1.2
libglib2.0-0
libglib2.0-dev
libglu1-mesa
libglut3
libgmp3c2
libgnucrypto-java
libgnutls-dev
libgnutls12
libgpg-error-dev
libgpg-error0
libgpgme11
libgphoto2-2
libgphoto2-port0
libgpmg1
libgpod0
libgsl0
libgstreamer-pluginsbase0.10-0
libgstreamer0.10-0
libgtk1.2
libgtk1.2-common
libgtk2.0-0
libgtk2.0-bin
libgtk2.0-common
libgutenprint2
libhal-storage1
libhal1
libhsqldb-java
libice6
libicu34
libid3-3.8.3c2a
libidl0
libidn11
libieee1284-3
libifp4
151
———————————————— APPENDICE A – I FILE DEL SISTEMA OPERATIVO
libijs-0.35
libisc11
libisccc0
libisccfg1
libiw28
libjasper-1.701-1
libjasper-runtime
libjaxp1.2-java
libjessie-java
libjline-java
libjpeg-progs
libjpeg62
libk3b2
libkcal2b
libkcddb1
libkdepim1a
libkipi0
libkleopatra1
libklibc
libkmime2
libkonq4
libkpimexchange1
libkpimidentities1
libkrb53
libkscan1
libksieve0
libktnef1
liblcms1
libldap2
liblocale-gettext-perl
liblockdev1
libltdl3
libltdl3-dev
liblwres9
liblzo1
libmagic1
libmagick9
libmdbtools
libmimelib1c2a
libmng1
libmodplug0c2
libmpcdec3
libmusicbrainz4c2a
libmysqlclient15off
libncurses5
libncurses5-dev
libncursesw5
libneon25
libnet1
libnet1-dev
libnetcdf3
libnewt0.51
libnspr4
libnss-mdns
libnss3
libogg0
liboggflac3
libopencdk8
libopencdk8-dev
libopenexr2c2a
libopenobex-1.0-0
liborbit2
libpam-foreground
libpam-modules
libpam-runtime
libpam0g
libpam0g-dev
libpango1.0-0
libpango1.0-common
libpaper1
libparted1.6-13
libpcap0.8
libpcre3
libperl5.8
libpisock8
libpng12-0
libpoppler1
libpoppler1-qt
libpopt-dev
libpopt0
libportaudio0
libpq4
libpythonize0
libqt3-mt
libraptor1
librasqal0
libraw1394-5
librdf0
libreadline5
librecode0
librsync1
libruby1.8
libsamplerate0
libsane
libsasl2
libsasl2-modules
libscim8c2a
libscrollkeeper0
libsdl1.2debian
libsdl1.2debian-alsa
libselinux1
libsensors3
libsepol1
libservlet2.3-java
libsigc++-2.0-0c2a
libskim0
libslang2
libslp1
libsm6
libsmbclient
libsndfile1
libsnmp-base
libsnmp9
libspeex1
libsqlite0
libsqlite3-0
libss2
libssl0.9.8
libstartup-notification0
libstdc++5
libstdc++6
libstdc++6-4.0-dev
libstlport4.6c2
libsysfs2
libtag1c2a
libtasn1-2
libtasn1-2-dev
libtdb1
libterm-readkey-perl
libtext-charwidth-perl
libtext-iconv-perl
libtext-wrapi18n-perl
libtheora0
libtiff4
libtool
libtunepimp2c2a
libtunepimp3
libunicode-string-perl
libuniconf4.2
libusb-0.1-4
libuuid1
libvisual-0.4-0
libvorbis0a
libvorbisenc2
libvorbisfile3
libwpd8c2a
libwrap0
libwvstreams4.2-base
libwvstreams4.2-extras
libx11-6
libxalan2-java
libxau6
libxaw7
libxcomposite1
libxcursor1
libxdamage1
libxdmcp6
libxerces2-java
libxext6
libxfixes3
libxfont1
libxft2
libxi6
libxine-main1
libxinerama1
libxkbfile1
libxml1
libxml2
libxml2-dev
libxmlsec1
libxmlsec1-nss
libxmlsec1-openssl
libxmu6
libxmuu1
libxp6
libxplc0.3.13
libxpm4
libxrandr2
libxrender1
libxslt1.1
libxss1
libxt-java
libxt6
libxtrap6
libxtst6
libxv1
libxvmc1
libxxf86dga1
libxxf86misc1
libxxf86vm1
linux-386
linux-headers-2.6.15-27
linux-headers-2.6.15-27-386
linux-image-2.6.15-27-386
linux-image-386
linux-kernel-headers
linux-restricted-modules2.6.15-27-386
linux-restricted-modules-386
linux-restricted-modulescommon
linux-sound-base
listres
locales
login
logrotate
lsb-base
lsb-release
lshw
lshw-common
152
———————————————— APPENDICE A – I FILE DEL SISTEMA OPERATIVO
lsof
ltrace
lvm-common
lvm2
m4
mailx
make
makedepend
makedev
man-db
manpages
mawk
mcpp
mdadm
mdetect
memtest86+
menu-xdg
mesa-utils
mii-diag
mime-support
min12xxw
mkisofs
module-init-tools
mount
mozilla-firefox-locale-en-gb
mtr-tiny
myspell-en-gb
myspell-en-us
mysql-common
nano
ncurses-base
ncurses-bin
net-tools
netbase
netcat
nmap
ntpdate
nvidia-kernel-common
oclock
openoffice.org
openoffice.org-base
openoffice.org-calc
openoffice.org-common
openoffice.org-core
openoffice.org-draw
openoffice.org-help-en-us
openoffice.org-impress
openoffice.org-java-common
openoffice.org-kde
openoffice.org-l10n-common
openoffice.org-l10n-en-gb
openoffice.org-l10n-en-us
openoffice.org-l10n-en-za
openoffice.org-math
openoffice.org-thesaurus-enus
openoffice.org-writer
openssh-client
openssh-server
openssl
parted
passwd
patch
pciutils
pcmcia-cs
pcmciautils
perl
perl-base
perl-modules
perl-suid
pkg-config
pmount
pnm2ppa
po-debconf
poppler-utils
popularity-contest
poster
postfix
powermanagement-interface
powermgmt-base
powernowd
ppp
pppconfig
pppoeconf
procps
psmisc
psutils
pykdeextensions
python
python-adns
python-apt
python-cddb
python-clientcookie
python-crypto
python-egenix-mxproxy
python-egenix-mxstack
python-egenix-mxtexttools
python-egenix-mxtools
python-epydoc
python-eunuchs
python-examples
python-gadfly
python-gd
python-gdbm
python-genetic
python-geoip
python-glade-1.2
python-glade2
python-gnupginterface
python-gtk-1.2
python-gtk2
python-htmlgen
python-htmltmpl
python-id3lib
python-imaging
python-imaging-sane
python-jabber
python-kde3
python-kjbuckets
python-ldap
python-minimal
python-mysqldb
python-netcdf
python-newt
python-numeric
python-pam
python-parted
python-pexpect
python-pgsql
python-pisock
python-pqueue
python-pyao
python-pylibacl
python-pyogg
python-pyopenssl
python-pyorbit
python-pyvorbis
python-pyxattr
python-qt3
python-reportlab
python-simpletal
python-soappy
python-sqlite
python-stats
python-syck
python-tk
python-unit
python-uno
python-xdg
python-xml
python-xmpp
python2.4
python2.4-adns
python2.4-apt
python2.4-cairo
python2.4-clientcookie
python2.4-crypto
python2.4-dbus
python2.4-dev
python2.4-dictclient
python2.4-egenix-mxdatetime
python2.4-egenix-mxproxy
python2.4-egenix-mxstack
python2.4-egenix-mxtexttools
python2.4-egenix-mxtools
python2.4-epydoc
python2.4-eunuchs
python2.4-examples
python2.4-gadfly
python2.4-gd
python2.4-gdbm
python2.4-geoip
python2.4-glade2
python2.4-gobject
python2.4-gtk2
python2.4-htmlgen
python2.4-htmltmpl
python2.4-id3lib
python2.4-imaging
python2.4-imaging-sane
python2.4-jabber
python2.4-kde3
python2.4-kjbuckets
python2.4-ldap
python2.4-librdf
python2.4-libxml2
python2.4-libxslt1
python2.4-minimal
python2.4-mysqldb
python2.4-numeric
python2.4-pam
python2.4-pexpect
python2.4-pgsql
python2.4-pycurl
python2.4-pylibacl
python2.4-pyopenssl
python2.4-pyorbit
python2.4-pyxattr
python2.4-qt3
python2.4-reportlab
python2.4-simpletal
python2.4-sip4-qt3
python2.4-soappy
python2.4-sqlite
python2.4-syck
python2.4-tk
python2.4-unit
python2.4-xml
python2.4-xmpp
qca-tls
153
———————————————— APPENDICE A – I FILE DEL SISTEMA OPERATIVO
qobex
radeontool
rdiff-backup
readahead
readline-common
reiser4progs
reiserfsprogs
reportbug
rsync
ruby
ruby1.8
samba-common
scim-qtimm
screen
scrollkeeper
sed
sessreg
sgml-base
sgml-data
sip
skim
slocate
smartdimmer
smbclient
smproxy
speedcrunch
ssh
strace
sudo
swig
sysklogd
sysv-rc
sysv-rc-conf
sysvinit
tar
tcl8.4
tcpd
tcpdump
telnet
thunderbird-locale-en-gb
time
tk8.4
toshset
traceroute
ttf-arabeyes
ttf-arphic-uming
ttf-baekmuk
ttf-bengali-fonts
ttf-bitstream-vera
ttf-dejavu
ttf-devanagari-fonts
ttf-freefont
ttf-gentium
ttf-gujarati-fonts
ttf-indic-fonts
ttf-kannada-fonts
ttf-kochi-gothic
ttf-kochi-mincho
ttf-lao
ttf-malayalam-fonts
ttf-mgopen
ttf-opensymbol
ttf-oriya-fonts
ttf-punjabi-fonts
ttf-tamil-fonts
ttf-telugu-fonts
ttf-thai-tlwg
ubuntu-keyring
ubuntu-minimal
ubuntu-standard
ucf
udev
unzip
usbutils
usplash
util-linux
uuid-dev
vbetool
viewres
vim
vim-common
vim-runtime
vorbis-tools
w3m
wamerican
wbritish
wget
whiptail
wireless-tools
wlassistant
wpasupplicant
wvdial
x-ttcidfont-conf
x-window-system-core
x11-common
x11perf
xauth
xbase-clients
xbiff
xcalc
xclipboard
xclock
xconsole
xcursor-themes
xcursorgen
xditview
xdpyinfo
xdriinfo
xev
xeyes
xf86dga
xfd
xfonts-100dpi
xfonts-75dpi
xfonts-base
xfonts-scalable
xfonts-utils
xfontsel
xfsprogs
xgamma
xgc
xhost
xinetd
xinit
xkbutils
xkeyboard-config
xkill
xload
xlogo
xlsatoms
xlsclients
xlsfonts
xmag
xman
xmessage
xml-core
xmodmap
xmore
xpmutils
xprop
xrandr
xrdb
xrefresh
xresprobe
xrgb
xserver-xorg
xserver-xorg-core
xserver-xorg-driver-all
xserver-xorg-driver-apm
xserver-xorg-driver-ark
xserver-xorg-driver-ati
xserver-xorg-driver-chips
xserver-xorg-driver-cirrus
xserver-xorg-driver-cyrix
xserver-xorg-driver-dummy
xserver-xorg-driver-fbdev
xserver-xorg-driver-glint
xserver-xorg-driver-i128
xserver-xorg-driver-i740
xserver-xorg-driver-i810
xserver-xorg-driver-imstt
xserver-xorg-driver-mga
xserver-xorg-driver-neomagic
xserver-xorg-driver-newport
xserver-xorg-driver-nsc
xserver-xorg-driver-nv
xserver-xorg-driverrendition
xserver-xorg-driver-s3
xserver-xorg-driver-s3virge
xserver-xorg-driver-savage
xserver-xorg-driversiliconmotion
xserver-xorg-driver-sis
xserver-xorg-driver-sisusb
xserver-xorg-driver-tdfx
xserver-xorg-driver-tga
xserver-xorg-driver-trident
xserver-xorg-driver-tseng
xserver-xorg-driver-v4l
xserver-xorg-driver-vesa
xserver-xorg-driver-vga
xserver-xorg-driver-via
xserver-xorg-driver-vmware
xserver-xorg-driver-voodoo
xserver-xorg-input-all
xserver-xorg-inputelographics
xserver-xorg-input-evdev
xserver-xorg-input-kbd
xserver-xorg-input-mouse
xserver-xorg-input-synaptics
xserver-xorg-input-wacom
xset
xsetmode
xsetpointer
xsetroot
xsm
xstdcmap
xterm
xtrap
xutils
xvidtune
xvinfo
xwd
xwininfo
xwud
zip
zlib1g
zlib1g-dev
154
—————————————————————— APPENDICE B – I FILE DI DRBD
Appendice B
I file di DRBD
B-1 File drbd.conf
#
#
#
#
#
#
#
#
#
drbd.conf example
parameters you _need_ to change are the hostname, device, disk,
meta-disk, address and port in the "on <hostname> {}" sections.
you ought to know about the protocol, and the various timeouts.
you probably want to set the rate in the syncer sections
#
# NOTE common pitfall:
# rate is given in units of _byte_ not bit
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
increase timeout and maybe ping-int in net{}, if you see
problems with "connection lost/connection established"
(or change your setup to reduce network latency; make sure full
duplex behaves as such; check average roundtrip times while
network is saturated; and so on ...)
Upgrading from DRBD-0.6.x
Using the size parameter in the disk section (was disk-size) is
no longer valid. The agreed disk size is now stored
in DRBD's non volatile meta data files.
NOTE that if you do not have some dedicated partition to use for
the meta-data, you may use 'internal' meta-data.
155
—————————————————————— APPENDICE B – I FILE DI DRBD
#
THIS HOWEVER WILL DESTROY THE LAST 128M
#
OF THE LOWER LEVEL DEVICE.
#
# So you better make sure you shrink the filesystem by 128M FIRST!
# or by 132M just to be sure... :)
#
skip {
As you can see, you can also comment chunks of text
with a 'skip[optional nonsense]{ skipped text }' section.
This comes in handy, if you just want to comment out
some 'resource <some name> {...}' section:
just precede it with 'skip'.
The basic format of option assignment is
<option name><linear whitespace><value>;
It should be obvious from the examples below,
but if you really care to know the details:
<option name> :=
valid options in the respective scope
<value> := <num>|<string>|<choice>|...
depending on the set of allowed values
for the respective option.
<num>
:= [0-9]+, sometimes with an optional suffix of K,M,G
<string> := (<name>|\"([^\"\\\n]*|\\.)*\")+
<name> := [/_.A-Za-z0-9-]+
}
#
# At most ONE global section is allowed.
# It must precede any resource section.
#
# global {
# use this if you want to define more resources later
# without reloading the module.
# by default we load the module with exactly as many devices
# as configured mentioned in this file.
#
# minor-count 5;
#
#
#
#
#
#
#
#
The user dialog counts and displays the seconds it waited so
far. You might want to disable this if you have the console
of your server connected to a serial terminal server with
limited logging capacity.
The Dialog will print the count each 'dialog-refresh' seconds,
set it to 0 to disable redrawing completely. [ default = 1 ]
dialog-refresh 5; # 5 seconds
# You might disable one of drbdadm's sanity check.
# disable-ip-verification;
# }
#
156
—————————————————————— APPENDICE B – I FILE DI DRBD
# this need not be r#, you may use phony resource names,
# like "resource web" or "resource mail", too
#
resource drbd0 {
# transfer protocol to use.
# C: write IO is reported as completed, if we know it has
#
reached _both_ local and remote DISK.
#
* for critical transactional data.
#
* for most cases.
# B: write IO is reported as completed, if it has reached
#
local DISK and remote buffer cache.
# A: write IO is reported as completed, if it has reached
#
local DISK and local tcp send buffer. (see also sndbuf-size)
#
* for high latency networks
#
#**********
# uhm, benchmarks have shown that C is actually better than B.
# this note shall disappear, when we are convinced that B is
# the right choice "for most cases".
# Until then, always use C unless you have a reason not to.
#
--lge
#**********
#
protocol C;
# what should be done in case the cluster starts up in
# degraded mode, but knows it has inconsistent data.
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ;
halt -f";
startup {
# Wait for connection timeout.
# The init script blocks the boot process until the resources
# are connected. This is so when the cluster manager starts later,
# it does not see a resource with internal split-brain.
# In case you want to limit the wait time, do it here.
# Default is 0, which means unlimited. Unit is seconds.
#
# wfc-timeout 0;
# Wait for connection timeout if this node was a degraded cluster.
# In case a degraded cluster (= cluster with only one node left)
# is rebooted, this timeout value is used.
#
degr-wfc-timeout 120;
# 2 minutes.
}
disk {
# if the lower level device reports io-err you have the choice of
# "pass_on" -> Report the io-error to the upper layers.
#
Primary -> report it to the mounted f-system.
#
Secondary -> ignore it.
# "panic"
-> The node leaves the cluster doing kernel panic.
# "detach" -> The node drops its backing storage device, and
157
—————————————————————— APPENDICE B – I FILE DI DRBD
#
#
on-io-error
continues in disk less mode.
detach;
# In case you only want to use a fraction of the available space
# you might use the "size" option here.
#
# size 10G;
}
net
#
#
#
#
#
#
{
this is the size of the tcp socket send buffer
increase it _carefully_ if you want to use protocol A over a
high latency network with reasonable write throughput.
defaults to 2*65535; you might try even 1M, but if your kernel
or network driver chokes on that, you have been warned.
sndbuf-size 512k;
# timeout
# connect-int
# ping-int
60;
10;
10;
# 6 seconds (unit = 0.1 seconds)
# 10 seconds (unit = 1 second)
# 10 seconds (unit = 1 second)
#
#
#
#
#
#
#
Maximal number of requests (4K) to be allocated by DRBD.
The minimum is hardcoded to 32 (=128 kByte).
For high performance installations it might help if you
increase that number. These buffers are used to hold
datablocks while they are written to disk.
#
#
#
#
#
#
#
#
#
#
#
When the number of outstanding requests on a standby (secondary)
node exceeds unplug-watermark, we start to kick the backing
device to start its request processing. This is an advanced
tuning parameter to get more performance out of capable storage
controlers.
Some controlers like to be kicked often, other controlers
deliver better performance when they are kicked less frequently.
Set it to the value of max-buffers to get the least possible
number of run_task_queue_disk() / q->unplug_fn(q) calls.
max-buffers
2048;
unplug-watermark
128;
# The highest number of data blocks between two write barriers.
# If you set this < 10 you might decrease your performance.
# max-epoch-size 2048;
# if some block send times out this many times, the peer is
# considered dead, even if it still answers ping requests.
# ko-count 4;
#
#
#
#
#
if the connection
"reconnect" ->
"stand_alone" ->
"freeze_io" ->
to the peer is lost you have the choice of
Try to reconnect (AKA WFConnection state)
Do not reconnect (AKA StandAlone state)
Try to reconnect but freeze all IO until
the connection is established again.
158
—————————————————————— APPENDICE B – I FILE DI DRBD
# on-disconnect reconnect;
}
syncer {
# Limit the bandwith used by the resynchronisation process.
# default unit is kByte/sec; optional suffixes K,M are allowed.
#
# Even though this is a network setting, the units are based
# on _byte_ (octet for our french friends) not bit.
# We are storage guys.
#
# Note that on 100Mbit ethernet, you cannot expect more than
# 12.5 MByte total transfer rate.
# Consider using GigaBit Ethernet.
#
# rate 10M;
rate 256M;
# All devices in one group are resynchronized parallel.
# Resychronisation of groups is serialized in ascending order.
# Put DRBD resources which are on different physical disks in one
# group.
# Put DRBD resources on one physical disk in different groups.
#
group 1;
# Configures the size of the active set. Each extent is 4M,
# 257 Extents ~> 1GB active set size. In case your syncer
# runs @ 10MB/sec, all resync after a primary's crash will last
# 1GB / ( 10MB/sec ) ~ 102 seconds ~ One Minute and 42 Seconds.
# BTW, the hash algorithm works best if the number of al-extents
# is prime. (To test the worst case performace use a power of 2)
al-extents 257;
}
on alpha {
device
disk
address
meta-disk
#
#
#
#
#
#
#
#
#
#
#
/dev/drbd0;
/dev/md6;
192.168.1.23:7788;
internal;
meta-disk is either 'internal' or '/dev/ice/name [idx]'
You can use a single block device to store meta-data
of multiple DRBD's.
E.g. use meta-disk /dev/hde6[0]; and meta-disk /dev/hde6[1];
for two different resources. In this case the meta-disk
would need to be at least 256 MB in size.
'internal' means, that the last 128 MB of the lower device
are used to store the meta-data.
You must not give an index with 'internal'.
}
on bravo {
159
—————————————————————— APPENDICE B – I FILE DI DRBD
device
disk
address
meta-disk
/dev/drbd0;
/dev/hda8;
192.168.1.24:7788;
internal;
}
}
#
# yes, you may also quote the resource name.
# but don't include whitespace, unless you mean it :)
#
resource drbd1 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ;
halt -f";
startup {
degr-wfc-timeout 120;
}
disk {
on-io-error
}
# 2 minutes.
detach;
syncer {
rate 256M;
group 1;
al-extents 257;
}
on alpha {
device
disk
address
meta-disk
}
on bravo {
device
disk
address
meta-disk
}
/dev/drbd1;
/dev/md7;
192.168.1.23:7789;
internal;
/dev/drbd1;
/dev/hda9;
192.168.1.24:7789;
internal;
}
160
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
Appendice C
I file di Heartbeat
C-1 File haresources
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
This is a list of resources that move from machine to machine as
nodes go down and come up in the cluster. Do not include
"administrative" or fixed IP addresses in this file.
<VERY IMPORTANT NOTE>
The haresources files MUST BE IDENTICAL on all nodes of the cluster.
The node names listed in front of the resource group information
is the name of the preferred node to run the service. It is
not necessarily the name of the current machine. If you are running
auto_failback ON (or legacy), then these services will be started
up on the preferred nodes - any time they're up.
If you are running with auto_failback OFF, then the node information
will be used in the case of a simultaneous start-up, or when using
the hb_standby {foreign,local} command.
BUT FOR ALL OF THESE CASES, the haresources files MUST BE IDENTICAL.
If your files are different then almost certainly something
won't work right.
</VERY IMPORTANT NOTE>
We refer to this file when we're coming up, and when a machine is
being taken over after going down.
You need to make this right for your installation, then install in
/etc/ha.d
Each logical line in the file constitutes a "resource group".
A resource group is a list of resources which move together from
one node to another - in the order listed. It is assumed that there
161
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
# is no relationship between different resource groups. These
# resource in a resource group are started left-to-right, and stopped
# right-to-left. Long lists of resources can be continued from line
# to line by ending the lines with backslashes ("\").
#
# These resources in this file are either IP addresses, or the name
# of scripts to run to "start" or "stop" the given resource.
#
# The format is like this:
#
#node-name resource1 resource2 ... resourceN
#
#
# If the resource name contains an :: in the middle of it, the
# part after the :: is passed to the resource script as an argument.
# Multiple arguments are separated by the :: delimeter
#
# In the case of IP addresses, the resource script name IPaddr is
# implied.
#
# For example, the IP address 135.9.8.7 could also be represented
# as IPaddr::135.9.8.7
#
#
THIS IS IMPORTANT!!
#
# The given IP address is directed to an interface which has a route
# to the given address. This means you have to have a net route
# set up outside of the High-Availability structure. We don't set it
# up here -- we key off of it.
#
# The broadcast address for the IP alias that is created to support
# an IP address defaults to the highest address on the subnet.
#
# The netmask for the IP alias that is created defaults to the same
# netmask as the route that it selected in in the step above.
#
# The base interface for the IPalias that is created defaults to the
# same netmask as the route that it selected in in the step above.
#
# If you want to specify that this IP address is to be brought up
# on a subnet with a netmask of 255.255.255.0, you would specify
# this as IPaddr::135.9.8.7/24 .
#
# If you wished to tell it that the broadcast address for this subnet
# was 135.9.8.210, then you would specify that this way:
#
IPaddr::135.9.8.7/24/135.9.8.210
#
# If you wished to tell it that the interface to add the address to
# is eth0, then you would need to specify it this way:
#
IPaddr::135.9.8.7/24/eth0
#
# And this way to specify both the broadcast address and the
# interface:
#
IPaddr::135.9.8.7/24/eth0/135.9.8.210
#
# The IP addresses you list in this file are called "service"
162
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
# addresses, since they're they're the publicly advertised addresses
# that clients use to get at highly available services.
#
# For a hot/standby (non load-sharing) 2-node system with only
# a single service address,
# you will probably only put one system name and one IP address in
# here. The name you give the address to is the name of the default
# "hot" system.
#
# Where the nodename is the name of the node which "normally" owns the
# resource. If this machine is up, it will always have the resource
# it is shown as owning.
#
# The string you put in for nodename must match the uname -n name
# of your machine. Depending on how you have it administered, it
# could be a short name or a FQDN.
#
#------------------------------------------------------------------#
# Simple case: One service address, default subnet and netmask
#
No servers that go up and down with the IP address
#
#just.linux-ha.org 135.9.216.110
#
#------------------------------------------------------------------#
# Assuming the adminstrative addresses are on the same subnet...
# A little more complex case: One service address, default subnet
# and netmask, and you want to start and stop http when you get
# the IP address...
#
#just.linux-ha.org 135.9.216.110 http
#------------------------------------------------------------------#
# A little more complex case: Three service addresses, default subnet
# and netmask, and you want to start and stop http when you get
# the IP address...
#
#just.linux-ha.org 135.9.216.110 135.9.215.111 135.9.216.112 httpd
#------------------------------------------------------------------#
# One service address, with the subnet, interface and bcast addr
# explicitly defined.
#
#just.linux-ha.org 135.9.216.3/28/eth0/135.9.216.12 httpd
#
#------------------------------------------------------------------#
# An example where a shared filesystem is to be used.
# Note that multiple aguments are passed to this script using
# the delimiter '::' to separate each argument.
#
#node1 10.0.0.170 Filesystem::/dev/sda1::/data1::ext2
#
# Regarding the node-names in this file:
#
163
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
# They must match the names of the nodes listed in ha.cf, which in
# turn must match the `uname -n` of some node in the cluster. So they
# aren't virtual in any sense of the word.
#
#
#
#
#
alpha drbddisk::drbd0 \
Filesystem::/dev/drbd0::/var/lib/vmware/VirtualMachinesALPHA::ext3
bravo drbddisk::drbd1 \
Filesystem::/dev/drbd1::/var/lib/vmware/VirtualMachinesBRAVO::ext3
alpha drbddisk::drbd0 \
Filesystem::/dev/drbd0::/var/lib/vmware/VirtualMachinesALPHA::ext3 \
vmmanager::ALPHA/CharlieXP/CharlieXP.vmx \
vmmanager::ALPHA/EchoSUSE/EchoSUSE.vmx
bravo drbddisk::drbd1 \
Filesystem::/dev/drbd1::/var/lib/vmware/VirtualMachinesBRAVO::ext3 \
vmmanager::BRAVO/DeltaKUBUNTU/DeltaKUBUNTU.vmx \
vmmanager::BRAVO/Foxtrot2000AS/Foxtrot2000AS.vmx
164
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
C-2 File ha.cf
#
# There are lots of options in this file. All you have to have is a
# set of nodes listed {"node ...} one of {serial, bcast, mcast, or
# ucast}, and a value for "auto_failback".
#
#
ATTENTION: As the configuration file is read line by line,
#
THE ORDER OF DIRECTIVE MATTERS!
#
# In particular, make sure that the udpport, serial baud rate
# etc. are set before the heartbeat media are defined!
# debug and log file directives go into effect when they
# are encountered.
#
# All will be fine if you keep them ordered as in this example.
#
#
# Note on logging:
# If any of debugfile, logfile and logfacility are defined then they
# will be used. If debugfile and/or logfile are not defined and
# logfacility is defined then the respective logging and debug
# messages will be loged to syslog. If logfacility is not defined
# then debugfile and logfile will be used to log messges. If
# logfacility is not defined and debugfile and/or logfile are not
# defined then defaults will be used for debugfile and logfile as
# required and messages will be sent there.
#
# File to write debug messages to
debugfile /var/log/ha-debug
#
#
# File to write other messages to
#
logfile/var/log/ha-log
#
#
# Facility to use for syslog()/logger
#
logfacility local0
#
#
# A note on specifying "how long" times below...
#
# The default time unit is seconds
#
10 means ten seconds
#
# You can also specify them in milliseconds
#
1500ms means 1.5 seconds
#
#
# keepalive: how long between heartbeats?
#
keepalive 2
#
# deadtime: how long-to-declare-host-dead?
165
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
#
#
If you set this too low you will get the problematic
#
split-brain (or cluster partition) problem.
#
See the FAQ for how to use warntime to tune deadtime.
#
deadtime 30
#
# warntime: how long before issuing "late heartbeat" warning?
# See the FAQ for how to use warntime to tune deadtime.
#
warntime 10
#
#
# Very first dead time (initdead)
#
# On some machines/OSes, etc. the network takes a while to come up
# and start working right after you've been rebooted. As a result
# we have a separate dead time for when things first come up.
# It should be at least twice the normal dead time.
#
initdead 120
#initdead 60
#
#
# What UDP port to use for bcast/ucast communication?
#
udpport694
#
# Baud rate for serial ports...
#
baud 19200
#
# serial
serialportname ...
serial /dev/ttyS0
# Linux
#serial/dev/cuaa0
# FreeBSD
#serial /dev/cuad0
# FreeBSD 6.x
#serial/dev/cua/a
# Solaris
#
#
# What interfaces to broadcast heartbeats over?
#
bcast bond0
bcast bond1
#bcast eth0
# Linux
#bcast eth1 eth2
# Linux
#bcast le0
# Solaris
#bcast le1 le2
# Solaris
#
# Set up a multicast heartbeat medium
# mcast [dev] [mcast group] [port] [ttl] [loop]
#
# [dev]
device to send/rcv heartbeats on
# [mcast group]
multicast group to join (class D multicast
address
#
224.0.0.0 - 239.255.255.255)
# [port]
udp port to sendto/rcvfrom (set this value to the
166
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
#
same value as "udpport" above)
# [ttl]
the ttl value for outbound heartbeats. This effects
#
how far the multicast packet will propagate. (0-255)
#
Must be greater than zero.
# [loop]
toggles loopback for outbound multicast heartbeats.
#
if enabled, an outbound packet will be looped back and
#
received by the interface it was sent on. (0 or 1)
#
Set this value to zero.
#
#
#mcast eth0 225.0.0.1 694 1 0
#
# Set up a unicast / udp heartbeat medium
# ucast [dev] [peer-ip-addr]
#
# [dev]
device to send/rcv heartbeats on
# [peer-ip-addr]
IP address of peer to send packets to
#
#ucast eth2 141.250.199.24
#ucast bond0 192.168.1.24
#ucast eth0 192.168.1.2
#
#
# About boolean values...
#
# Any of the following case-insensitive values will work for true:
#
true, on, yes, y, 1
# Any of the following case-insensitive values will work for false:
#
false, off, no, n, 0
#
#
#
# auto_failback: determines whether a resource will
# automatically fail back to its "primary" node, or remain
# on whatever node is serving it until that node fails, or
# an administrator intervenes.
#
# The possible values for auto_failback are:
#
on
- enable automatic failbacks
#
off
- disable automatic failbacks
#
legacy - enable automatic failbacks in systems
#
where all nodes do not yet support
#
the auto_failback option.
#
# auto_failback "on" and "off" are backwards compatible with the old
#
"nice_failback on" setting.
#
# See the FAQ for information on how to convert
#
from "legacy" to "on" without a flash cut.
#
(i.e., using a "rolling upgrade" process)
#
# The default value for auto_failback is "legacy", which
# will issue a warning at startup. So, make sure you put
# an auto_failback directive in your ha.cf file.
# (note: auto_failback can be any boolean or "legacy")
#
167
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
auto_failback on
#
#
# Basic STONITH support
# Using this directive assumes that there is one stonith
# device in the cluster. Parameters to this device are
# read from a configuration file. The format of this line is:
#
#
stonith <stonith_type> <configfile>
#
# NOTE: it is up to you to maintain this file on each node in the
#
cluster!
#
#stonith baytech /etc/ha.d/conf/stonith.baytech
#
# STONITH support
# You can configure multiple stonith devices using this directive.
# The format of the line is:
# stonith_host <hostfrom> <stonith_type> <params...>
# <hostfrom> is the machine the stonith device is attached
#
to or * to mean it is accessible from any host.
# <stonith_type> is the type of stonith device (a list of
#
supported drives is in /usr/lib/stonith.)
# <params...> are driver specific parameters. To see the
#
format for a particular device, run:
# stonith -l -t <stonith_type>
#
#
# Note that if you put your stonith device access information in
# here, and you make this file publically readable, you're asking
# for a denial of service attack ;-)
#
# To get a list of supported stonith devices, run
#
stonith -L
# For detailed information on which stonith devices are supported
# and their detailed configuration options, run this command:
#
stonith -h
#
#stonith_host *
baytech 10.0.0.3 mylogin mysecretpassword
#stonith_host ken3 rps10 /dev/ttyS1 kathy 0
#stonith_host kathy rps10 /dev/ttyS1 ken3 0
#
# Watchdog is the watchdog timer. If our own heart doesn't beat for
# a minute, then our machine will reboot.
# NOTE: If you are using the software watchdog, you very likely
# wish to load the module with the parameter "nowayout=0" or
# compile it without CONFIG_WATCHDOG_NOWAYOUT set. Otherwise even
# an orderly shutdown of heartbeat will trigger a reboot, which is
# very likely NOT what you want.
#
watchdog /dev/watchdog
#
# Tell what machines are in the cluster
# node nodename ... -- must match uname -n
#node ken3
#node kathy
168
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
node alpha
node bravo
#
# Less common options...
#
# Treats 10.10.10.254 as a psuedo-cluster-member
# Used together with ipfail below...
# note: don't use a cluster node as ping node
#
#ping 10.10.10.254
ping 141.250.199.62
#
# Treats 10.10.10.254 and 10.10.10.253 as a psuedo-cluster-member
# called group1. If either 10.10.10.254 or 10.10.10.253 are up
# then group1 is up
# Used together with ipfail below...
#
#ping_group group1 10.10.10.254 10.10.10.253
#
# HBA ping derective for Fiber Channel
# Treats fc-card-name as psudo-cluster-member
# used with ipfail below ...
#
# You can obtain HBAAPI from http://hbaapi.sourceforge.net. You need
# to get the library specific to your HBA directly from the vender
# To install HBAAPI stuff, all You need to do is to compile the common
# part you obtained from sourceforge. This will produce libHBAAPI.so
# which you need to copy to /usr/lib. You need also copy hbaapi.h to
# /usr/include.
#
# The fc-card-name is the name obtained from the hbaapitest program
# that is part of the hbaapi package. Running hbaapitest will produce
# a verbose output. One of the first line is similar to:
#
Apapter number 0 is named: qlogic-qla2200-0
# Here fc-card-name is qlogic-qla2200-0.
#
#hbaping fc-card-name
#
#
# Processes started and stopped with heartbeat. Restarted unless
#
they exit with rc=100
#
#respawn userid /path/name/to/run
respawn hacluster /usr/lib/heartbeat/ipfail
#
# Access control for client api
#
default is no access
#
#apiauth client-name gid=gidlist uid=uidlist
#apiauth ipfail gid=haclient uid=hacluster
#crm yes
###########################
#
#
Unusual options.
169
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
#
###########################
#
# hopfudge maximum hop count minus number of nodes in config
#hopfudge 1
#
# deadping - dead time for ping nodes
#deadping 30
#
# hbgenmethod - Heartbeat generation number creation method
#
Normally these are stored on disk and incremented as needed.
#hbgenmethod time
#
# realtime - enable/disable realtime execution (high priority, etc.)
#
defaults to on
#realtime off
#
# debug - set debug level
#
defaults to zero
#debug 1
#
# API Authentication - replaces the fifo-permissions-based system
#
#
# You can put a uid list and/or a gid list.
# If you put both, then a process is authorized if it qualifies under
# either the uid list, or under the gid list.
#
# The groupname "default" has special meaning. If it is specified,
# then this will be used for authorizing groupless clients, and any
# client groups not otherwise specified.
#
# There is a subtle exception to this. "default" will never be used
# in the following cases (actual default auth directives noted in
# brackets)
#
ipfail
(uid=HA_CCMUSER)
#
ccm
(uid=HA_CCMUSER)
#
ping
(gid=HA_APIGROUP)
#
cl_status (gid=HA_APIGROUP)
#
# This is done to avoid creating a gaping security hole and matches
# the most likely desired configuration.
#
#apiauth ipfail uid=hacluster
#apiauth ccm uid=hacluster
#apiauth cms uid=hacluster
#apiauth ping gid=haclient uid=alanr,root
#apiauth default gid=haclient
# message format in the wire, it can be classic or netstring,
# default: classic
#msgfmt classic/netstring
# Do we use logging daemon?
# If logging daemon is used, logfile/debugfile/logfacility in this
170
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
# file are not meaningful any longer. You should check the config file
# for logging daemon (the default is /etc/logd.cf)
# more infomartion can be fould
# in http://www.linux-ha.org/ha_2ecf_2fUseLogdDirective
# Setting use_logd to "yes" is recommended
#
# use_logd yes/no
#
# the interval reconnect to log daemon if the prev connection failed
# default: 60 seconds
#conn_logd_time 60
#
#
# Configure compression module
# It could be zlib or bz2, depending on whether u have corresponding
# library in the system.
#compression bz2
#
# Confiugre compression threshold
# This value determines the threshold to compress a message,
# e.g. if the threshold is 1, then any message with size greater
# than 1 KB will be compressed, the default is 2 (KB)
#compression_threshold 2
171
———————————————————— APPENDICE C – I FILE DI HEARTBEAT
C-3 File authkeys
#
# Authentication file. Must be mode 600
#
#
# Must have exactly one auth directive at the front.
# auth send authentication using this method-id
#
# Then, list the method and key that go with that method-id
#
# Available methods: crc sha1, md5. Crc doesn't need/want a key.
#
# You normally only have one auth method-id listed in this file
#
# Put more than one to make a smooth transition when changing auth
# methods and/or keys.
#
#
# sha1 is believed to be the "best", md5 next best.
#
# crc adds no security, except from packet corruption.
#
Use only on physically secure networks.
#
auth 2
#1 crc
2 sha1 pwd!hacluster
#3 md5 pwd!hacluster
172
————————————————————— APPENDICE D – I FILE DI PROGETTO
Appendice D
I file di progetto
D-1 Lo script vmmanager
#!/bin/bash
# # # # # # # #
# Written by Mirco PERINI <[email protected]>
# Date February 2007
# Ripartizione Servizi Informatici e Statistici
# Area Servizi Tecnico-Sistemistici
# Universita' degli Studi di Perugia
# Script utilizzato per la gestione delle risorse
# VMware Server all'interno di Heartbeat
# # # # # # # #
VMWARECMD="/usr/bin/vmware-cmd"
VM_PATH="/var/lib/vmware/VirtualMachines"
RES="$1"
CMD="$2"
ADMIN_MAIL="[email protected]"
# Controlla se il file di configurazione della macchina
# virtuale di VMWare Server esiste sul file system del nodo
if [ -e ${VM_PATHRES} ]; then
case "$CMD" in
start)
STARTUP_STATE=$($VMWARECMD $VM_PATH$RES getstate 2>&1)
# Avvio della macchina virtuale
$VMWARECMD $VM_PATH$RES start;
173
————————————————————— APPENDICE D – I FILE DI PROGETTO
if [ $($VMWARECMD $VM_PATH$RES getstate 2>&1 \
| sed 's/getstate() =//g') = "stuck" ]; then
#
#
#
#
#
#
#
#
#
#
Question (id = 994407981) :The features supported by
the processor(s) in this machine are different from
the features supported by the processor(s) in the
machine on which the snapshot was saved. You may
continue to resume this virtual machine, but doing so
may result in unpredictable behavior. Do you wish to
continue resuming this virtual machine?
0) Yes
1) No
Select. Press enter for default <0> : selected 0 : Yes
echo 0 | $VMWARECMD $VM_PATH$RES answer
fi
if [ ${STARTUP_STATE//getstate() =/} = "off" ]; then
# Effettua attesa attiva sulla macchina virtuale pari
# a 60 secondi se lo stato precedente era "off"
TIMER=60
elif [ ${STARTUP_STATE//getstate() =/} = "on" ]; then
TIMER=0
elif [ ${STARTUP_STATE//getstate() =/} = "suspended" ]; then
# Effettua attesa attiva sulla macchina virtuale pari
# a 15 secondi se lo stato precedente era "suspended"
TIMER=`expr $($VMWARECMD $VM_PATH$RES getuptime 2>&1 \
| sed 's/getuptime() =//g') + 15`
fi
# Attende finchè la macchina virtuale non ha finito lo start
while [ $($VMWARECMD $VM_PATH$RES getuptime 2>&1 \
| sed 's/getuptime() =//g') -lt $TIMER ]; do
wait
done
;;
stop)
# Verifica che la macchina virtuale sia attiva
# controllando l'esistenza della cartella ad essa associata
# in /var/run
174
————————————————————— APPENDICE D – I FILE DI PROGETTO
if [ -d /var/run/vmware/`echo $VM_PATH$RES \
| sed 's/\//%2F/g' | sed 's/\./%2E/g'` ]; then
# Sospensione della macchina virtuale
$VMWARECMD $VM_PATH$RES suspend
fi
;;
*)
# Se non viene fornita nessuna opzione mostra le possibilità
echo "Usage: vmmanager [resource] {start|stop}"
exit 1
;;
esac
# Invia una mail riepilogativa agli amministratori sullo
# stato della macchina virtuale
mailx -s "Virtual machine `$VMWARECMD $VM_PATH$RES \
getconfig displayName|sed 's/getconfig(displayName) \
=//g'` $CMD on `hostname`" $ADMIN_MAIL << EOF
Virtual Machine: `$VMWARECMD $VM_PATH$RES getconfig \
displayName| sed 's/getconfig(displayName) =//g'`
Status: `$VMWARECMD $VM_PATH$RES getstate \
| sed 's/getstate() =//g'`
Uptime: `$VMWARECMD $VM_PATH$RES getuptime \
| sed 's/getuptime() =//g'`
Config $VM_PATH$RES
EOF
fi
exit 0
175
————————————————————— APPENDICE D – I FILE DI PROGETTO
D-2 Storyboard
176
————————————————————————————— BIBLIOGRAFIA
Bibliografia
[1]
Pradeep K. Sinha, Distributed Operating Systems: concept and
design, IEEE Press New York (1997)
[2]
L. Fereira, G. Kettmann, A. Thomasch, E. Silcocks, J. Chen, J.C.
Daunois, J. Ihamo, M. Harada, S. Hill, W. Bernocchi, E. Ford,
Linux HPC Cluster Installation, IBM Redbooks
http://www.ibm.com/redbooks/
[3]
P. Coddington, Distributed High-Performance Computing (2000)
http://www.dhpc.adelaide.edu.au/education/CS7933/2000/distributed.pdf
[4]
S. Calò, Un cluster in alta disponibilità in ambiente linux (2004)
http://www.drbd.org/fileadmin/drbd/publications/HAcluster.pdf
[5]
M. Davini, I. Lisi, Cluster – Linux & C. n.14 Piscopo Editore
[6]
C. Manuali, Implementazione di un ambiente Grid per il calcolo ad
alte prestazioni (2002)
http://www.unipg.it/carlo/Tesi.pdf
[7]
C. Zoffoli, Progettazione, realizzazione ed ottimizzazione di un
cluster ibrido 32/64 bit per HPC altamente affidabile (2005)
http://www.cs.unibo.it/~roffilli/thesis/ZOFFOL05.pdf
177
————————————————————————————— BIBLIOGRAFIA
[8]
A. Singh, An introduction to virtualization (2004)
http://www.kernelthread.com/publications/virtualization
[9]
D.
Sgandurra,
Architetture
di
sicurezza
e
tecnologie
di
virtualizzazione: rilevamento intrusioni con introspezione (2006)
http://www.serra.unipi.it/sicurezza/tesi1.pdf
[10] A. Urbini, Modelli e architetture per la virtualizzazione di sistemi
informatici (2005)
http://www.urbo.altervista.org/it/download/Tesi.pdf
[11] VMware Server
http://www.vmware.com/products/server/
[12] Microsoft Virtual PC
http://www.microsoft.com/windows/virtualpc/default.mspx
[13] PearPC – PowerPC Architecture Emulator
http://pearpc.sourceforge.net
[14] Xen Source
http://www.xensource.com
[15] Intel Virtualization Technology
http://www.intel.com/technology/virtualization/index.htm
[16] AMD Pacifica
http://www.amd.com/us-en/Corporate/VirtualPressRoom/0,,51_104_543~98372,00.html
[17] Denali
http://denali.cs.washington.edu/
178
————————————————————————————— BIBLIOGRAFIA
[18] Virtuozzo Server Virtualization
http://www.swsoft.com/products/virtuozzo/
[19] Parallels Workstation
http://www.parallels.com/
[20] Kubuntu
http://www.kubuntu.org
[21] Ubuntu
http://www.ubuntu.org
[22] Comunità italiana Ubuntu
http://www.ubuntu-it.org
[23] J. Gifford, How to setup ethernet bonding with LFS (2003)
http://www.linuxfromscratch.org/hints/downloads/files/ethernet-bonding.txt
[24] P. De Bruijn, Ubuntu Bonding (2006)
http://pmjdebruijn.blogspot.com/2006/04/ubuntu-bonding.html
[25] A. Benokraitis, Red Hat ES 4: Parametri Ethernet (2005)
http://www.redhat.com/docs/manuals/enterprise/RHEL-4Manual/it/ref-guide/s1-modules-ethernet.html
[26] Bonding: schede di rete ridondanti e load balancing
http://wiki.gentoo-italia.net/index.php/Bonding:_schede_
di_rete_ridondanti_e_load_balancing
[27] T. Davis, Linux Ethernet Bonding Driver mini-howto (2000)
http://www.kernel.org/pub/linux/kernel/people/marcelo/
linux-2.4/Documentation/networking/bonding.txt
179
————————————————————————————— BIBLIOGRAFIA
[28] DRBD Documentation
http://www.drbd.org/documentation.html
[29] A. Robertson, Linux-HA Heartbeat System Design (2000)
http://www.linuxshowcase.org/2000/2000papers/papers/robertson/robertson.pdf
[30] A. Camozzo, Installazione Cluster Vserver-drbd-heartbeat (2004)
http://homes.stat.unipd.it/mmzz/Papers/NewVserver/Cluster.html
[31] HOWTO Watchdog Timer
http://gentoo-wiki.com/HOWTO_Watchdog_Timer
[32] The High-Availability Linux Project
http://www.linux-ha.org
[33] M. Barr, Introduction to Watchdog Timers (2001)
http://www.embedded.com/columns/showArticle.jhtml?articleID=9900324
[34] Truelite srl, Configurazione di un Cluster HA (2006)
https://labs.truelite.it/truedoc/wiki/SetupClusterHA
[35] D. Krovich, DRBD HOWTO
http://www.slackworks.com/~dkrovich/DRBD/
[36] Alan Wood, Predicting Client/Server Availability – IEEE 1995
http://ieeexplore.ieee.org/iel1/2/8564/00375176.pdf?tp=&isnumber=&arnumber=375176
[37] K. Miers, High Availability with Linux (2004)
http://www.rhic.bnl.gov/hepix/talks/041020am/miers.pdf
[38] S. Reifschneider, Linux High Availability Clusters (2005)
http://www.samag.com/documents/s=9658/sam0505b/
180
————————————————————————————— BIBLIOGRAFIA
[39] VMware Inc, VMware Scripting API – User’s Manual (2006)
http://www.vmware.com/pdf/Scripting_API_23.pdf
[40] D. Diacono, Cluster in alta disponibilità in ambiente Linux (2006)
http://www.ba.infn.it/calcolo/documenti/Cluster.html
[41] F. Meriggia, Computer Virtuali – PC Professionale n.186
[42] VMware Inc, WMware Server Administration Guide (2006)
http://www.vmware.com/pdf/server_admin_manual.pdf
[43] Wei Hou, O. Geoffrey Okogbaa, Reliability and Availability Cost
Design Tradeoffs for HA Systems – IEEE 2005
http://ieeexplore.ieee.org/iel5/9660/30517/01408401.pdf?arnumber=1408401
181