TESI - DRBD
Transcript
TESI - DRBD
UNIVERSITA' DEGLI STUDI DI BARI FACOLTÀ DI SCIENZE MATEMATICHE, FISICHE E NATURALI CORSO DI LAUREA IN INFORMATICA TESI DI LAUREA IN SISTEMI PER L'ELABORAZIONE DELL'INFORMAZIONE: SISTEMI DISTRIBUITI UN CLUSTER IN ALTA DISPONIBILITÀ IN AMBIENTE LINUX RELATORI: Chiar.mo Prof. S. PIZZUTILO dott. D. DIACONO LAUREANDO: Sabino CALÒ ANNO ACCADEMICO 2003/2004 INDICE GENERALE INTRODUZIONE................................................................................4 CLUSTER: GENERALITA'..................................................................7 1.1 Architettura.................................................................................................. 8 1.2 High Performance Computer e High Availability.................................10 1.3 Il software libero....................................................................................... 12 1.4 Progetti Open-Source per cluster di calcolo.......................................... 13 1.5 Progetti Open-Source di cluster HA...................................................... 13 LINUX: INSTALLAZIONE KERNEL.............................................. 21 2.1 L'Hardware................................................................................................ 21 2.2 L'installazione del sistema operativo....................................................... 23 L'ALTA DISPONIBILITA' (HA)........................................................43 3.1 Livelli di disponibilità............................................................................... 3.2 Requisito dei cinque 9.............................................................................. 3.3 Le prestazioni............................................................................................ 3.4 Tipologie di cluster................................................................................... 44 46 48 49 IL CLUSTER REALIZZATO IN QUESTA INSTALLAZIONE......52 4.1 Elementi fondamentali: una visione panoramica.................................. 53 4.2 Schema di progetto................................................................................... 55 4.3 Heartbeat .................................................................................................. 60 L'INSTALLAZIONE E CONFIGURAZIONE DEL FILE-SYSTEM: DRBD...................................................................................................64 5.1 Tipologie di storage.................................................................................. 64 5.2 Il file-system utilizzato nel setup: motivi della scelta............................ 67 5.3 DRBD: caratteristiche e peculiarità........................................................ 70 5.4 Performance.............................................................................................. 83 5.5 Installazione e configurazione DRBD................................................. 101 5.6 Alta disponibilità della rete interna ...................................................... 104 2 HEARTBEAT: SUITE PER L'ALTA DISPONIBILITA'................ 108 6.1 La struttura modulare di Heartbeat...................................................... 108 6.2 Il Resource Group.................................................................................. 114 6.3 Installazione e configurazione............................................................... 115 6.4 Gratuitous ARP...................................................................................... 122 STRUMENTI DI MONITORAGGIO E TEST DEL SISTEMA..... 124 7.1 Mon.......................................................................................................... 7.2 Webmin................................................................................................... 7.3 Swatch...................................................................................................... 7.4 Test del sistema....................................................................................... 124 128 130 132 APPENDICE......................................................................................140 File di configurazione..........................................................................141 A1. /etc/fstab............................................................................................... 141 A2. /etc/make.conf...................................................................................... 141 A3. /etc/lilo.conf.......................................................................................... 144 A4. /usr/src/linux/.config.......................................................................... 144 A4 /etc/conf.d/net...................................................................................... 150 A5. /root/.bash_profile............................................................................... 150 A6. /root/.bashrc......................................................................................... 151 A7. /etc/drbd.conf....................................................................................... 151 A8. /etc/ha.d/haresources.......................................................................... 152 A9. /etc/ha.d/ha.cf...................................................................................... 152 A10. /etc/mon.d/mon.cf............................................................................ 152 A11. /etc/mon.d/auth.cf............................................................................. 153 A12. /root/.swatchrc................................................................................... 153 A13. Script mon http.alert........................................................................... 154 A14. Script mon stopha.alert....................................................................... 154 BIBLIOGRAFIA.................................................................................163 3 INTRODUZIONE Il lavoro di tesi è stato svolto all'interno di una collaborazione fra il Dipartimento di Informatica dell'Università degli Studi di Bari e l'Istituto Nazionale di Fisica Nucleare (INFN) sez. di Bari. Il lavoro di tesi ha avuto come scopo la ricerca lo studio di soluzioni open-source e quindi la realizzazione di un sistema distribuito (cluster) per l'erogazione di servizi di rete in Alta Disponibilità (HA). Il sistema distribuito è stato costruito su due macchine identiche con tecnologia non dedicata basate su CPU x86 di tipo Intel Pentium4 Xeon (cfr. cap. 2), fornite dall'INFN, per la propria rete dipartimentale. Entrambi i nodi del cluster hanno un sistema operativo Gentoo Linux e sono interconnessi al fine di fornire l'erogazione dei servizi in alta disponibilità in maniera distribuita. Il sistema di memorizzazione di massa è basato su un progetto open-source di recente introduzione, denominato DRBD (cfr. cap. 5), che consente di disporre di dispositivi condivisi astraendo i reali dispositivi hardware costituiti da generici dischi EIDE installati all'interno di ciascuno dei nodi del cluster. Il centro del sistema è costituito dalla suite Heartbeat (cfr. cap. 6), che ha il compito di gestire le risorse del cluster e di reagire ad eventuali malfunzionamenti, per evitare di interrompere l'erogazione dei servizi. 4 Nel capitolo 1, sono presentate le basi teoriche sui sistemi distribuiti, i diversi modelli teorici e le diverse tipologie di cluster, ponendo particolare attenzione alla distinzione fra cluster di calcolo a bilanciamento di carico e cluster per l'erogazione di servizi in alta disponibilità. Il capitolo 2, prende in considerazione il sistema distribuito dal punto di vista del singolo nodo. Dopo la descrizione dell'hardware, viene descritta l'installazione del sistema operativo, la configurazione del kernel e la configurazione delle partizioni del disco rigido nonché l'installazione dei programmi di utilità di sistema fra cui una utility di replicazione della riga di comando ai diversi nodi. Il capitolo 3, analizza i concetti teorici inerenti l'alta disponibilità: i livelli di disponibilità, i requisiti di un sistema distribuito in alta disponibilità e le tipologie di cluster per l'HA. Nel capitolo 4 è descritto schematicamente il cluster costruito in questo lavoro di tesi, le tipologie di collegamento fra i due nodi, in particolare l'installazione e configurazione del meccanismo di channel bonding necessario a ridondare il collegamento di rete inerno al cluster. Vengono inoltre presentati i primi concetti relativi ad Heartbeat e le soluzioni a problemi particolari, nello specifico il problema del “Brain-Splitting”. Il capitolo 5 è dedicato alla descrizione del modulo DRBD ed alla sua installazione e configurazione. DRBD fornisce al sistema operativo un dispositivo di memorizzazione condiviso e astratto costituito da partizioni reali residenti su entrambi i nodi del cluster. In tale capitolo si descrivono i requisiti software che DRBD fornisce e l'algoritmo alla base del sistema. Viene inoltre presentata l'analisi dei test sulle performance che sono stati eseguiti sui dispositivi DRBD nelle diverse configurazioni. Nel capitolo 6 viene analizzata nei minimi dettagli la suite Heartbeat, la sua struttura modulare e i meccanismi di funzionamento che rendono necessarie 5 alcune attenzioni sulla scelta di alcuni dispositivi hardware, in particolare lo switch a cui sono collegati i nodi, affinchè supporti i pacchetti di “gratuitousARP”. Il capitolo si conclude con la procedura di installazione e configurazione della suite. Il capitolo 7 riguarda invece gli strumenti di monitoraggio necessari a controllare costantemente il funzionamento del sistema. Vengono installati e configurati i software “mon”, “swatch” e “Webmin”. Alla fine del capitolo viene descritto un test per verificare le funzionalità del sistema. Tale descrizione è completata con alcuni screenshot che mostrano il comportamento del sistema durante il test eseguito. Chiude il lavoro di tesi un'appendice contenente alcuni file testuali di configurazione di diversi software: Sistema operativo, DRBD, Heartbeat, mon e swatch. 6 Capitolo 1 CLUSTER: GENERALITA' L'informatica è una scienza relativamente moderna nata contestualmente all'invenzione delle macchine in grado di eseguire calcoli in maniera automatica e rapidissima che sono state definite computer o calcolatori. Lo scopo dell'informatica è quello di rendere possibile la descrizione di un problema reale sotto forma di un procedimento fatto di passaggi elementari o “atomi” di ragionamento che prende il nome di algoritmo. Inizialmente i computer risolvevano problemi abbastanza semplici ma grazie alla ricerca nella scienza informatica, attualmente i computer risolvono problemi molto complessi e in alcuni casi sono in grado di prendere semplici decisioni, in relazione agli stimoli del mondo esterno, avvicinandosi così poco alla volta all'estrema complessità del ragionamento umano. Il progresso tecnologico nel campo dell'elettronica, sinergicamente generato dalla ricerca informatica, ha reso disponibili macchine di calcolo sempre più veloci e versatili tali da poter essere aggregate a costituire quasi una emulazione della rete neuronale del cervello umano. L'aggregazione di più computer, al fine di risolvere uno stesso problema comune, raggiungendo quindi lo stesso scopo, prende il nome di sistema distribuito o “cluster”. Il paradigma alla base di una sistema distribuito è assimilabile a “divide et impera”. Secondo questo paradigma di ragionamento ogni problema può essere risolto scomponendolo in tanti sottoproblemi più piccoli, la soluzione di ognuno dei quali genera la soluzione del problema primario. L'applicazione di questo schema di ragionamento incorpora il concetto di modularità che 7 caratterizza tutti i moderni sistemi di calcolo, in modo più evidente i sistemi distribuiti. Un sistema distribuito infatti è un sistema modulare perchè è composto da un insieme più o meno grande di calcolatori identici che si definiscono “nodi”. In un sistema distribuito si ha la possibilità di aggiungere o eliminare nodi dal sistema generando rispettivamente un aumento o una diminuzione nella capacità di calcolo dell'intero sistema. Questa caratteristica prende il nome di scalabilità. Si definisce che un sistema è molto scalabile quando l'aumento delle prestazioni di calcolo cresce più che proporzionalmente rispetto al numero dei nodi. 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 fra loro da una rete di comunicazione privata usata esclusivamente per la sincronizzazione e lo scambio di messaggi fra i processi che girano sul cluster e si condividono le risorse che possono essere locali o remote [1]. 1.1 Architettura Un sistema distribuito può distinguersi principalmente in due categorie relative essenzialmente al modo in cui sono disposte e gestite le risorse di sistema. Possiamo infatti distinguere sistemi cosiddetti “Tightly coupled” la cui caratteristica distintiva sta nel fatto che ogni nodo del cluster condivide la stessa memoria che utilizza anche per gli scopi di comunicazione fra i processi in esecuzione; al contrario, i sistemi definiti “Loosely coupled” si differenziano dai precedenti per il fatto che ogni nodo utilizza e gestisce la propria memoria mentre i processi in esecuzione sui vari nodi comunicano attraverso i messaggi utilizzando le tecniche cosiddette di “Message Passing”. I sistemi del tipo “loosely coupled” corrispondono più propriamente alla definizione di sistema distribuito. 8 I modelli in base ai quali è possibile costruire un sistema distribuito variano in base alla specializzazione dei diversi nodi all'interno del cluster. Il modello definito “minicomputer” caratterizza sistemi distribuiti essenzialmente “Tightly coupled” che condividono le stesse risorse centralizzate. Questo tipo di sistema in effetti è concettualmente simile ad un computer singolo anche se scalabile e modulare. Secondo il modello “workstation model” un sistema distribuito è di tipo “loosely coupled” in quanto formato da un insieme di workstation complete che gestiscono autonomamente le proprie risorse. I processi vengono opportunamente trasferiti ed eseguiti sulle workstation libere gestendo comunque la priorità dei processi locali e remoti. Il modello “workstation-server model” si applica a sistemi distribuiti formati da un insieme di workstation connesse inoltre a minicomputer specializzati in particolari servizi. Tipicamente un utente di un tale sistema svolge in locale le operazioni generiche, in remoto le operazioni specializzate per cui esiste un minicomputer dedicato. Questo modello fornisce alcuni vantaggi che nelle diverse situazioni applicative possono essere di grande importanza se non a volte richieste come scelta progettuale: è possibile ad esempio centralizzare le risorse di memorizzazione di massa costituendo appositamente un minicomputer come file-server, in modo da fornire prestazioni eccellenti nell'input-output dei dati, si centralizzerebbe così anche il lavoro di manutenzione e infine non si rende necessaria la migrazione dei processi dato che le elaborazioni remote vengono eseguite attraverso il protocollo clientserver. Il modello “processor pool model” caratterizza sistemi distribuiti formati da nodi generici non specializzati che vengono dinamicamente allocati dal sistema di gestione delle risorse e forniscono all'esterno l'immagine di sistema singolo. L'utente che deve eseguire i suoi processi si collega al cluster attraverso terminali remoti che non fanno parte del cluster e dunque non si 9 connette ad un nodo in particolare come nei modelli “workstation” e “workstation server”, ma concettualmente all'intero sistema. Questo modello è il più diffuso fra gli attuali cluster adibiti al calcolo massivo. Il sistema operativo di un sistema distribuito deve essere tale da consentire e favorire le operazioni tipiche di un cluster. Si possono innanzitutto distinguere due classi di sistemi operativi per cluster denominati “Network operating system” e “Distributed Operating System”. Le differenze fra le due tipologie risiedono principalmente nell'immagine del sistema che forniscono all'utente. Un “Network Operating system” infatti coordinando i diversi sistemi operativi presenti su ogni nodo e adibiti alla gestione delle risorse locali, dà all'utente la possibilità di conoscere quali sono i nodi del cluster il loro stato e gli consente inoltre di scegliere su quali nodi eseguire la sua computazione. D'altro canto un “Distributed Operating System” fornisce all'utente l'immagine di sistema singolo prendendosi in carico la gestione del carico di lavoro da assegnare ai diversi nodi del cluster. E' evidente che i malfunzionamenti di ciascun nodo sono nascosti all'utente in quanto egli stesso non è a conoscenza del modo in cui il sistema è costruito. Un sistema operativo distribuito è ovviamente complesso in quanto deve consentire performance e quindi scalabilità, affidabilità attraverso la gestione della ridondanza dei componenti più sensibili ed infine sicurezza dato che un sistema distribuito solitamente è usato da diversi utenti per ognuno dei quali si deve garantire riservatezza e permessi. 1.2 High Performance Computer e High Availability E’ doverosa ora un'altra distinzione fondamentale in merito alle tipologie di cluster che è possibile realizzare. Tale distinzione è legata essenzialmente all’utilizzo a cui il cluster è dedicato. Un cluster può essere un HPC (High Performance Computer), dedicato solitamente al calcolo massivo, tipico delle simulazioni scientifiche in cui sono in gioco diverse variabili. Questi sistemi sono assimilabili al modello 10 “processor pool” e sono quindi di tipo “loosely coupled” in quanto ogni nodo gestisce le proprie risorse. Forniscono all'utente l'immagine di sistema singolo e generalmente sono formati da almeno 32 nodi. L’altro tipo di cluster è definito “sistema ad alta disponibilità” (HA: High Availability) che ha come obbiettivo primario quello di garantire con ogni sforzo il requisito dell'affidabilità che generalmente caratterizza ogni sistema distribuito. I cluster per l'alta disonibilità hanno lo scopo di fornire servizi. Si adotta la soluzione cluster per far in modo che i servizi vengano erogati limitando al minimo le interruzioni e questo è possibile in quanto la struttura e gestione del cluster fa’ sì che nel caso di blocco del nodo che fisicamente sta erogando un servizio, un altro si faccia carico dell’intero gruppo di servizi forniti dal nodo caduto. Lo scopo che ci si prefigge nel progetto di un cluster per l'alta disponibilità è quello di eliminare i punti deboli del sistema definiti “single point of failure”, attraverso la ridondanza degli stessi. Generalmente un cluster HA è realizzato con soli due nodi, sia perché non è sottoposto a carichi di lavoro computazionale elevati, tipici degli HPC, sia per semplificare l’arbitraggio delle risorse condivise e limitare i fenomeni negativi ad esso legati, primo fra tutti il “Brain-splitting”, analizzato più avanti. E’ ovvio che anche in questo caso lo switching fra i processori è totalmente trasparente all’utente il quale ancora una volta ha l’immagine di un singolo sistema a cui richiedere servizi. Ci sono due modelli possibili per realizzare un cluster di questo tipo e sono definiti A-S (Active-Standby) e A-A (Active-Active). Nel modello A-S, i servizi offerti dal cluster sono residenti tutti su un nodo; vengono poi presi totalmente in carico dall’altro nodo precedentemente in standby, nel momento in cui il nodo attivo cade. 11 Nel modello A-A i servizi sono distribuiti su entrambi i nodi che si compensano a vicenda quando uno dei due cade. I modi per realizzare questi obiettivi sono diversi e verranno presi in considerazione quelli inerenti la piattaforma e l’ambiente operativo scelti per la realizzazione del cluster HA oggetto di studio di questa tesi. 1.3 Il software libero E' possibile realizzare un sistema in alta disponibilità attraverso l'utilizzo di tecnologie proprietarie che integrano gli strumenti necessari per poter installare e configurare un cluster HA. Tali soluzioni spesso molto costose, sono caratterizzate dal fatto che il codice sorgente non è accessibile per cui per ogni tipo di intervento inerente la manutenzione del sistema o la modifica della configurazione, è necessario ricorrere alla casa costruttrice del pacchetto software. Visto il fiorire di progetti sempre più sofisticati e maturi nel panorama dell'open-source, inerenti anche soluzioni riguardanti la realizzazione di cluster, si è scelto per lo studio di questa tesi, di realizzare un sistema distribuito per l'alta disponibilità, basato essenzialmente su software libero e gratuito. Il sistema operativo scelto per realizzare il cluster HA è GNU/Linux1. Questo sistema UNIX-like è notoriamente orientato alle reti e ha come vantaggio non trascurabile, oltre che la stabilità e l’efficienza tipica dei sistemi *NIX, il fatto che è Open-Source e generalmente gratuito. E’ evidente come la caratteristica Open-Source sia garanzia di trasparenza e stabilità, per il fatto che chiunque può analizzare, modificare e correggere il codice sorgente. 1 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ò essere 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. 12 Diversi progetti vengono attualmente sviluppati per la realizzazione di cluster di cui segue un’analisi sommaria delle relative caratteristiche. 1.4 Progetti Open-Source per cluster di calcolo La costruzione tipica di un cluster HPC basato su sistemi operativi Unix-like risponde alla tipologia denominata “Beowulf” la quale fa uso di librerie dedicate, principalmente PVM (Parallel Virtual Machine) e MPI (Message Passing Interface) [2]. Il software applicativo che deve essere eseguito su questo tipo di cluster deve essere ottimizzato per far uso esplicito delle librerie “Beowulf” affinchè il sistema realizzi un parallelismo puro nell'esecuzione del software. Esiste anche un progetto, denominato open-Mosix, che permette la realizzazione di cluster HPC senza la necessità di codice scritto opportunamente. Questo progetto che per altro fornisce anche utility di gestione e monitoraggio complete di GUI, è basato sulle strategie di migrazione dei processi che fanno in modo che il carico computazionale sia equilibrato e distribuito sui diversi nodi del cluster. E’ evidente però che se il sistema non è ben calibrato, la migrazione dei processi diventa proprio il collo di bottiglia dell’intero sistema, soprattutto per la quantità di dati che devono essere migrati con ogni processo. 1.5 Progetti Open-Source di cluster HA Un sistema in alta disponibilità è caratterizzato tipicamente da diversi componenti software intercomunicanti che sinergicamente permettono al sistema di lavorare e fornire servizi in alta disponibilità. Tale insieme di componenti nelle soluzioni proprietarie è spesso nascosto e l'utente/acquirente del sistema (che spesso comprende anche l'hardware), può non avere nessuna conoscenza di tali componenti, né di come essi interagiscono, né delle funzioni che essi svolgono. Questo modo di fare 13 ovviamente rende l'utente finale sempre in un certo senso dipendente dall'azienda fornitrice del sistema che si garantisce così un introito economico più o meno costante nei servizi post-vendita. Questo lavoro oggetto della tesi ha previsto per sommi capi la costruzione di un sistema cluster HA costituito da due nodi “Supermicro SuperServer 6023P-i”2, da inserire nella rete informatica della sezione di Bari dell'”Istituto Nazionale di Fisica Nucleare” (INFN). Tale sistema dovrà fornisce due servizi in alta disponibilità costituenti un server di posta basato su “sendmail”3 e un server DNS (Domain Name Service) basato su “bind”4. La soluzione realizzata prevede l'utilizzo di soli componenti software di tipo open-source che caratterizzati dalla licenza GPL5 sono generalmente gratuiti, a sorgente aperto e disponibile, quindi modificabili, ridistribuibili anche dietro pagamento nei termini previsti dalla licenza stessa. Risulta quindi evidente come ogni soggetto che voglia implementare una soluzione di cluster in alta disponibilità può sfruttare le proprie risorse interne per progettare il sistema in ogni sua parte o eventualmente accedere alla comunità open-source per acquisire le nozioni o le competenze necessarie per costruirsi il proprio sistema personalizzato. 1.5.1 Il sistema operativo Il componente del sistema più indispensabile è ovviamente il sistema operativo. Per la scelta di questo componente sono state valutate diverse alternative ognuna con le sue diverse peculiarità e lati negativi; comunque la 2 Per la descrizione completa dell'hardware si consulti il prossimo capitolo 3 Sendmail è un server di posta molto diffuso nei sistemi *NIX e caratterizzato dalla licenza GPL 4 bind è un server DNS open-source con licenza GPL diffuso su sistemi *NIX 5 General Public Licence: testo integrale in appendice 14 scelta ha escluso a priori sistemi proprietari e closed source primo fra tutti Microsoft Windows. Le alternative prese in considerazione sono state quindi di tipo open source e hanno visto coinvolti sistemi Linux, nelle sue diverse distribuzioni, e le diverse varianti di BSD. Si sono considerate le diverse caratteristiche positive riguardanti i sistemi BSD prima fra tutte la sicurezza, che caratterizza in particolare il sistema OpenBSD, ma sono state considerate anche situazioni negative, come il supporto della comunità open-source, molto più limitato rispetto ad un sistema Linux; inoltre da ricerche effettuate sulla rete si è riscontrato che ci sono già state esperienze riguardanti sistemi HA basati su Linux da cui eventualmente si potrebbe attingere o fare riferimento in caso di necessità future. La scelta finale è dunque caduta su un sistema Linux. Fra le diverse e numerosissime distribuzioni di Linux presenti nel panorama della comunità open-source è stata scelta la distribuzione Gentoo6. Rispetto alle altre, questa distribuzione ha la caratteristica di essere fornita in linea preferenziale in formato sorgente, il che implica che l'utente deve eseguire la compilazione dell'intero sistema prima di poterlo utilizzare7. Questa modalità ha come effetto negativo il fatto che spesso la compilazione, specie se di tutto il sistema, richiede molto tempo. Si intuisce però che è possibile ottenere un sistema operativo personalizzato per le proprie esigenze, nel senso che è possibile scegliere cosa compilare e installare. Un vantaggio ancora più grande è che il sistema risultante è specificamente creato per la macchina su cui gira, ed è quindi ottimizzato in termini di prestazioni e stabilità in quanto sfrutta tutte le caratteristiche dell’ hardware. Non si pensi però che Gentoo sia una distribuzione orientata specificamente ad utenti avanzati in quanto l'installazione del software non è più complicata che impartire da shell il comando emerge nome-pacchetto, dove nome-pacchetto è il 6 7 Gentoo: www.gentoo.org, www.gentoo.it Sono comunque disponibili versioni precompilate di tutto o parte del sistema per le architetture più diffuse. 15 9nome del software che si intende installare e presente nel portage8 di Gentoo. A corredo di tutto, sono inoltre disponibili numerosissime guide in lingua italiana presso www.gentoo.it. La descrizione di tale installazione per il sistema oggetto di questa tesi è dettagliata nel capitolo 2. 1.5.2 Gestore del File-system condiviso Altro elemento fondamentale di un sistema in HA è il file system. E' chiaro che un comune file system per sistemi singoli non è assolutamente appropriato in quanto per un cluster in HA il file system deve avere funzionalità avanzate e particolari, comunque non necessarie e non applicabili ai sistemi di elaborazione classici. Tipicamente un file-system dedicato a cluster in alta disponibilità deve essere tale da garantire funzionalità di “recovering” dei dati indispensabile nei casi in cui una situazione di crash si verifica in concomitanza con gli accessi alle memorie di massa. La politica di gestione di questa funzionalità è comunque differente a seconda delle tipologie dell'hardware che si intende acquistare/utilizzare. Il sistema di memorizzazione di massa infatti può essere di due tipi: possiamo avere un sistema di dischi centrale, separato dai due nodi ma al quale questi possono accedere contemporaneamente mediante canale SCSI o fiber-channel, oppure un sistema di memorizzazione distribuito sui vari nodi che utilizzi i dischi montati all’interno delle macchine coinvolte. Quest'ultimo tipo di memorizzazione di massa è quello utilizzato per questo cluster ed è basato sul software DRBD scritto da Philipp Reisner9. L'aspetto positivo principale di un file-system distribuito consiste nel fatto che i costi necessari per far sì che il file system non introduca nel sistema un single point of failure sono molto piccoli. Infatti un crash in un sistema di dischi 8 Portage è il database on-line delle applicazioni installabili automaticamente col comando emerge. Tale database comprende attualmente più di cinquemila pacchetti, per un totale di più di 9 Gb di dati, numero in rapida crescita considerando anche il tempo relativamente breve da quando Gentoo si è inserita nel panorama delle distribuzioni Linux 9 Philipp Reisner: [email protected] 16 centrale condiviso comprometterebbe l'intero sistema, e realizzare l’alta disponibilità di un array di dischi, seppure possibile, è molto costoso. L'aspetto negativo consiste in una riduzione delle prestazioni nell'input-output dei dati. Nel caso in esame questo limite non incide in modo significativo sulla bontà del sistema, in quanto non si dovrà gestire un flusso di dati molto oneroso. Tecnicamente DRBD è un modulo del kernel che mette a disposizione dei nodi, tipicamente due, uno (o più) “block device” distribuito su entrambi i nodi e quindi accessibile da entrambi. Ogni block device è formato da due partizioni residenti rispettivamente su entrambi i nodi nelle quali i dati vengono replicati. In tal modo anche se un nodo cade, l'altro ha comunque la possibilità di accedere ai dati replicati sulla sua partizione e quindi continuare a lavorare. Le politiche di replicazione dei dati sono gestite secondo tre protocolli che bilanciano più o meno prestazioni e affidabilità. La scelta di tali protocolli va fatta in base alle esigenze che si hanno e all'hardware che si dispone. Per quanto riguarda l'accesso ai dati consentito da DRBD, per garantire costantemente l'integrità dei dati i nodi non possono effettuare contemporaneamente operazioni di scrittura. Vengono perciò stabiliti dei ruoli fra i due nodi: il nodo abilitato alla scrittura viene definito primario mentre l'altro è detto secondario. Il nodo secondario non può comandare operazioni di scrittura sui block device ma solo scrivere sulla sua partizione la replica dei dati al comando del nodo primario. L'algoritmo del DRBD gestisce tutte le situazioni in cui si verificano crash dei nodi primario o secondario con opportuno cambio dei ruoli, al fine di garantire sempre l'integrità dei dati e limitare al minimo l'intervento dell'amministratore, favorendo per quanto possibile una fornitura pressoché continua dei servizi offerti dal cluster. 17 Le funzioni assolte da DRBD in un sistema di cluster HA sono principalmente quattro e cioè: · Garantisce che non ci sia nessuna perdita di dati in caso di caduta (crash) di un nodo. Questo è, anzi dovrebbe essere, un elemento obbligatorio in un sistema HA ma spesso viene trascurato per favorire un incremento in prestazioni. · Rende possibile aggiungere un nodo al cluster, ad esempio per rimpiazzare una macchina compromessa, senza interruzione dei servizi. Anche questo è un elemento importante che garantisce l'alta disponibilità in quanto l'obiettivo fondamentale è proprio quello di non interrompere la fornitura dei vari servizi. · Può determinare quale nodo possiede i dati più aggiornati. Dato che questo sistema è caratterizzato dalla replicazione dei dati sui diversi nodi, vi è dunque il problema di determinare quale dei nodi possiede i dati più aggiornati e quindi su quale di essi continuare a lavorare. · Con DRBD si può riavviare il cluster in modalità degradata10 senza l'intervento dell'amministratore. In alternativa a DRBD si potrebbe prevede l'uso di una soluzione ibrida formata dall'insieme di NBD+Raid 111. In questa soluzione le funzioni di esportazione dei dati vengono eseguite da NBD che rende disponibile un block-device di rete fra i due nodi sul quale opera il Raid 1 software per rendere disponibili i meccanismi di replicazione dei dati. Si è però preferito l’uso di DRBD sia perché creato specificatamente per cluster HA a due nodi, sia perché rende disponibili funzionalità di gestione e configurazione pensate proprio per cluster HA. A tal proposito si veda il file “drbd.conf”, presente in appendice, opportunamente creato per il sistema oggetto della tesi. 10 11 La modalità degradata è definita tale quando un cluster formato da due nodi continua a funzionare con un nodo solo. NBD: Network block device 18 1.5.3 Software di gestione del cluster Al fine della realizzazione specifica del cluster HA, questo elemento è il componente più importante del sistema in quanto è quello che rende l'insieme di componenti finora descritto un cluster HA. Esso si occupa della gestione delle risorse disponibili nel sistema e del controllo dei componenti finora descritti. Anche in questo caso le alternative disponibili sono state diverse e tutte le soluzioni offrivano più o meno le stesse caratteristiche, ma la scelta è stata operata tenendo in considerazione la piena compatibilità con DRBD, il gestore del file-system. I pacchetti considerati sempre ovviamente open-source sono stati Kimberlite, LinuxFailSafe ed HeartBeat. E' stato scelto quest'ultimo, in quanto in grado di operare in stretta combinazione con DRBD. HeartBeat si basa su un meccanismo molto semplice ma allo stesso tempo molto efficace. Attraverso il programma “heartbeat”, a brevi intervalli i nodi si scambiano messaggi di stato continuamente, come un battito cardiaco che interrompendosi denota la “morte” di uno dei nodi. Ovviamente HeartBeat è in grado di accorgersi di questo evento e agire di conseguenza. I nodi vengono connessi fra loro attraverso l'interfaccia ethernet per scambiare i messaggi di stato e per esigenze legate al funzionamento in cluster; le interfacce sono configurate con indirizzi IP privati destinati esclusivamente alla comunicazione interna12. I messaggi possono però essere inviati anche attraverso un'altra interfaccia ethernet o attraverso un collegamento seriale fra i nodi. La replicazione si rende necessaria per eliminare il single point of failure nel caso in cui ci fosse un unico collegamento interno e questo si interrompesse. Ad ognuno dei nodi risulterebbe essere 12 Per l'inetrfacciamento esterno i nodi sono forniti di un'altra interfaccia ethernet come si evince dalla descrizione dell'hardware presentata nel prossimo capitolo. 19 l'unico nodo rimasto del cluster e ognuno quindi comincerebbe a fornire esattamente gli stessi servizi, generando incongruenze nei dati e confusione generale. Questo è il cosiddetto fenomeno del “Brain-splitting”. Duplicando i canali di connessione interna attraverso cui scambiare i messaggi di stato si riduce la probabilità che si verifichi il brain-splitting perché diventa più difficile l'interruzione contemporanea di più canali di comunicazione specie se di natura diversa come l'ethernet e il collegamento seriale. 20 Capitolo 2 LINUX: INSTALLAZIONE KERNEL In questo secondo capitolo si analizza l'installazione del sistema. Come già specificato, il sistema operativo su cui verrà basato l'intero cluster in alta disponibilità è Linux e su di esso verranno installati i diversi pacchetti software che consentono lo svolgimento delle funzioni tipiche di un sistema in alta disponibilità. Prima di proseguire però è doveroso specificare le caratteristiche hardware delle macchine su cui il sistema verrà costruito. 2.1 L'Hardware Le due macchine, identiche, su cui il sistema viene installato sono basate sulla piattaforma intel e processori Pentium 4 Xeon. Nel “case” con fattore di forma 2U13, è montata una scheda madre basata sul chipset intel E7501 abilitata ad ospitare contemporaneamente due processori [5]. Per la configurazione utilizzata ne è stato montato soltanto uno, per il motivo che ad un cluster HA non è richiesta una eccessiva potenza di calcolo. Il processore utilizzato, come anticipato, è un pentium 4 xeon da 2 Ghz con tecnologia HyperTreading14 che consente al kernel del sistema operativo di 13 2U: indica 2 unità dove 1 unità è lo spessore standard dei case adatti al montaggio in rack. 14 HyperTreading(HT): tecnologia proprietaria sviluppata da intel che grazie ad una gestione intelligente della pipeline di esecuzione della CPU rende possibile l'esecuzione contemporanea di alcune istruzioni macchina. 21 operare in modalità SMP15. Tale processore è coadiuvato da una cache L2 di 512Kb ed è caratterizzato da un FSB16 funzionante a 400 Mhz. La memoria centrale RAM è costituita da 1GB di memoria DDR17 con tecnologia ECC18, sufficiente per gli scopi cui il cluster è destinato. Come tutte le unità di questo tipo la sezione grafica è ridotta all'indispensabile in quanto non sono necessarie funzionalità avanzate. Al contrario la connettività del sistema è garantita da due interfacce di rete ethernet con velocità di 1Gb/sec. direttamente integrate sulla scheda madre, presenti inoltre una porta seriale e una parallela, due porte USB oltre che le classiche porte per mouse e tastiera PS/2. Le periferiche di memorizzazione di massa comprendono un lettore CDROM, lettore di floppy-disks e 4 Hard-Disk EIDE da 60 Gb ciascuno. Tali Hard-disk sono collegati a un controller Adaptec 2400A che effettua il RAID hardware. Le quattro unità sono configurate in questo modo: tre dischi sono gestiti in Raid 5 mentre il quattro è in modalità hot-spare che il controller automaticamente inserisce nel raid quando uno dei tre va in errore. In tale evenienza, l'unità guasta viene esclusa automaticamente dal raid e viene chiesto l'intervento dell'amministratore per la sostituzione fisica del dispositivo guasto. Dopo la sostituzione la nuova unità viene configurata come unità di hot-spare. 15 SMP: (Simultaneous Multi Processing) consente l'esecuzione contemporanea di istruzioni nei diversi processori disponibili. 16 FSB: (Front Side Bus): canale di comunicazione fra il chipset della scheda madre e il processore. Più è alto la frequenza di funzionamento, più si riduce il collo di bottiglia che c'è nel flusso di dati fra il processore e il resto del sistema. 17 DDR: (Double Data Rate) tipo particolare di memoria sincrona che sfrutta il collegamento con il chipset a doppio fronte. In parole povere il flusso di dati è raddoppiato per ogni ciclo di clock rispetto alle vecchie memorie a singolo fronte. 18 ECC: (Error Correction Code) particolare tecnologia che caratterizza le memorie più costose. Riduce drasticamente gli errori di paginazione della memoria rendendo il sistema più stabile. 22 La dissipazione del calore interno al case è invece affidata a quattro ventole da 8 cm in costante rotazione a pieni giri. Sono presenti inoltre sensori termici che attivano allarmi luminosi e acustici in caso di guasti alle ventole e conseguente aumento della temperatura a salvaguardia dei componenti interni che si danneggerebbero in caso di surriscaldamento eccessivo. 2.2 L'installazione del sistema operativo Questa parte importante del processo di installazione del cluster è iniziata il 18 novembre 2003 data in cui l'ultima versione della distribuzione Linux scelta, Gentoo, era la 1.4. Si tenga comunque in considerazione il fatto che in ogni momento è possibile aggiornare l'intero sistema alle ultime versioni di tutti i pacchetti, presenti nel sito ufficiale www.gentoo.org e relativi mirror attraverso il comando emerge -Dup world19. Il processo di installazione del sistema può essere suddiviso in diverse fasi che possono essere assimilate ai diversi livelli di astrazione via via crescenti che si andranno a costruire. 2.2.1 Fase 1: avvio e creazione del file system Il processo di installazione di ogni distribuzione Linux può essere eseguito in diversi modi che fra gli altri comprendono l'installazione via rete (locale o Internet). Il metodo classico rimane comunque il più diffuso e semplice, e prevede l'utilizzo dei cd di installazione. Come già detto Gentoo è una distribuzione diversa dalle altre in quanto consente di installare il sistema compilando il software “ad hoc” sulla macchina stessa. Questa capacità rende necessario il concetto di “stage” di installazione descritto qui di seguito. L'installazione di Gentoo è suddivisa in tre fasi successive che vengono denominate “stage”. In ognuno di tali stage viene compilata e installata una 19 Eventualmente prima di tale comando si può aggiornare il database locale dei pacchetti della distribuzione con emerge sync. Tale aggiornamento può richiedere davvero molto tempo per cui siconsideri anche l'ipotesi di eseguire un aggiornamento manuale dei soli pacchetti per cui l'aggiornamento è indispensabile. 23 porzione di sistema, a partire dallo stage 1 in cui si compila lo stesso compilatore C e le relative librerie, fino allo stage 3 in cui è già tutto precompilato tranne le applicazioni particolari non indispensabili all'utilizzo di base del sistema operativo. Vengono pertanto forniti da Gentoo tre files relativi ai diversi stage, per cui nel file “stage1[...].tar.gz” è fornita una versione minimale del sistema operativo che consente di effettuare la compilazione dei componenti di base quali le librerie “glibc” usate dal compilatore C e lo stesso compilatore “gcc”20; nel file “stage2[...].tar.gz” si trovano invece le versioni precompilate del compilatore e relative librerie; il file “stage3[...].tar.gz comprende le versioni precompilate del compilatore, dei principali server fra cui Xfree, e dei diversi pacchetti applicativi che consentono di avere a disposizione un sistema operativo perfettamente funzionante e completo di applicazioni di base. Installando Gentoo quindi ci si trova nella condizione di dover scegliere da quale stage partire, tenendo presente che ogni file di stage contiene quello precedente in versione generica precompilata e considerando le potenzialità della macchina su cui si effettua l'installazione in relazione al tempo necessario a terminare il processo. Si consideri infatti che la compilazione delle “glibc” su una macchina di media potenza, basata ad esempio su un processore da 2 Ghz, richiede in media circa 4 ore di elaborazione. Nella installazione Gentoo Linux del sistema HA realizzato, si è scelto di partire dallo stage 1 e dunque di ricompilare per intero il sistema in quanto, come già descritto nel paragrafo relativo all'hardware, le capacità di elaborazione delle macchine sono tali da poter garantire tempi di compilazione non molto elevati. 3Inoltre, dato che le macchine sono collegate costantemente alla rete Internet con collegamento via cavo alla velocità di 16Mbit minimi fornita dal GARR, si è preferito sfruttare questa opportunità 20 La versione del compilatore installata è la recente 3.2 24 per installare le versioni più aggiornate dei pacchetti, scaricate direttamente dai mirror Gentoo. Il primo passo compiuto per iniziare il processo di installazione è stato quello di scaricare e masterizzare su un CD riscrivibile l'immagine del “liveCD”21 base avviabile (meno di 100 Mb) dal sito gentoo.org contenente il solo stage 1 del processo di installazione. Si tenga presente che il processo di installazione descritto di seguito è stato eseguito solo su una delle due macchine del cluster perchè, come sarà spiegato in seguito, l'intera installazione è stata poi replicata attraverso una copia fisica dei dati sull'altra macchina per avere così due installazioni praticamente identiche. Il disco avviabile creato è stato utilizzato nella fase di boot della macchina22 per avviare il sistema operativo (una Linux box essenziale) in esso presente. Prima del “bootstrap” del sistema operativo si è provveduto a passare al kernel alcune opzioni per informarlo di alcune caratteristiche peculiari del sistema in oggetto in modo tale da potersi adattare all'ambiente in cui si stava installando. Le opzioni passate al kernel sono: smp che specifica al kernel di usare la capacità di parallelismo dei processi per sfruttare la tecnologia Intel HTT23 presente nel processore installato; dokeymap necessaria per eseguire il mapping della tastiera in modo tale da poter specificare successivamente il codice 21 relativo alla tastiera italiana[8]. 21 LiveCD: termine per riferirsi a un CD contenente il sistema operativo Linux utilizzabile direttamente da CD senza la necessità di dover scrivere alcunchè su eventuali dischi rigidi presenti nella macchina. 22 Questa fase prevede l'inserimento del cd avviabile prima che la macchina si riavvii cosìcchè attivando opportunamente le opzioni del BIOS il boot del sistema viene eseguito direttamente da CD. 23 HTT: Hyper Threading Tecnology si veda il paragrafo relativo all'hardware. 25 A questo punto il sistema di installazione è attivo e si è provveduto a inizializzare la rete in modo tale da poter eseguire il download dei diversi pacchetti richiesti al sistema “portage”. La prima cosa da fare per procedere con l'installazione e terminare la fase 1 è preparare il “terreno” su cui andare a installare il nuovo sistema operativo. Per fare questo dunque si deve eseguire un partizionamento del disco24 secondo uno schema ben architettato che si analizzerà fra breve. Per eseguire il partizionamento si è usato il tool di sistema “cfdisk”[6], che è uno strumento interattivo funzionante all'interno della shell che consente la creazione, modifica o rimozione delle partizioni logiche e fisiche degli hard disk presenti nel sistema. Questo tool è molto simile al più famoso, “fdisk”, il quale però essendo più vecchio, è anche molto spartano in termini di usabilità, tale da poter indurre errori in questa fase importantissima quanto delicata. Lo schema di partizionamento è quello specificato nella seguente tabella: 24 Benchè nelle macchine sono presenti quattro dischi rigidi EIDE si parlerà comunque di unico disco in quanto il sistema di RAID hardware è configurato in modo tale da mostrare un unico disco e utilizzare invece il sistema di memorizzazione per assolvere alle funzioni di replicazione dovute alla configurazione particolare. Si veda il capitolo relativo all'hardware. 26 Nome Dimensione Mount point Tipo Opzioni ext2 noauto partizione (Mb) sda1 100 sda2 2000 sda3 10000 / ext3 noatime sda5 10000 /usr ext3 noatime sda6 2000 /var ext3 noatime sda7 2000 /tmp ext3 noatime sda8 10000 /opt ext3 noatime sda9 10000 /home ext3 noatime sda10 10000 /bind ext3 noatime sda11 10000 /sendmail ext3 noatime /boot swap Tabella 1: Schema di partizionamento Si noti che i nomi delle partizioni sono quelli tipici dei dispositivi SCSI. Questo avviene a causa della presenza del controller RAID Adaptec 2400A. Dopo aver creato le partizioni secondo lo schema indicato, si è provveduto a creare i file systems su ogni partizione in particolare: mkswap /dev/sda2 per la partizione di swap mkfs /dev/sda1 per la partizione /boot mkfs -j /dev/sdax sostituendo a x ogni numero di partizione di tipo ext3 come specificato in tabella. Fatto questo si è provveduto ad attivare la partizione di swap col comando swapon /dev/sda2 e a montare le diverse partizioni ai rispettivi mount point con il comando mount /dev/sdax /mnt/gentoo/path dove /path corrisponde al percorso relativo a ogni partizione come specificato nella tabella 1. 27 2.2.2 Fase 2: Compilazione del sistema base Se le operazioni compiute finora possono essere analoghe all'installazione di qualsiasi Linux box ciò che segue è tipico della sola installazione di Gentoo; infatti il prossimo comando provvede a copiare il file compresso relativo allo stage 1 dell'installazione dal CD autopartente alla directory /mnt/gentoo. Il comando è cp /mnt/cdrom/stages/stage1* /mnt/gentoo L'operazione successiva attraverso il comando tar -jxvpf stage1* espande invece il file dello stage 1 inserendo nei percorsi opportuni i file che costituiscono il sistema base dal quale si farà partire la ricompilazione25. Come è stato più volte ribadito, Gentoo può definirsi una meta-distribuzione in quanto viene ricompilata sulla macchina per la quale si effettua l'installazione. I sorgenti dei diversi pacchetti vengono scaricati direttamente da internet e quindi sempre nelle versioni più aggiornate. Per poter eseguire però questa operazione è necessario far conoscere al sistema dove andare a cercare i diversi pacchetti. E' questo lo scopo del comando successivo: mirrorselect -a -s4 -o >>/mnt/gentoo/etc/make.conf che si occupa di ricercare sulla rete Internet i diversi mirror26 che contengono i files Gentoo, aggiornando il file make.conf, analizzato più avanti. Viene poi montato il file-system speciale “proc”27 con 25 I pacchetti copiati in questa fase sono precompilati in modo standard e saranno sovrascritti durante il processo di ricompilazione con le versioni compilate ad hoc. 26 Un mirror è una copia speculare di un sito internet. I mirror vengono spesso usati per siti FTP che contengono files che vengono scaricati spesso, al fine di non sovraccaricare i server. 27 IL file-system proc è uno strumento speciale usato da Linux per tenere traccia di tutte le informazioni riguardanti lo stato attuale di funzionamento del sistema. E' costituito come un insieme di file per mantener fede alla filosofia che caratterizza Linux in cui “tutto è un file”. 28 mount -t proc proc /mnt/gentoo/proc e copiato il file “resolv.conf”, con cp /etc/resolv.conf /mnt/gentoo/etc/resolv.conf contenente gli indirizzi dei server DNS configurati in fase di boot per poter essere raggiunti anche dopo aver eseguito il comando successivo chroot /mnt/gentoo /bin/bash che modifica il percorso di esecuzione dei comandi alla directory /mnt/gentoo [6]. A questo punto la directory radice del sistema è /mnt/gentoo per cui tutte le modifiche apportate sono relative ai file sotto tale percorso e quindi anche a quello che sarà il sistema operativo finale della macchina. Si può ora aggiornare l'ambiente di gentoo col comando env-update seguito da source /etc/profile, e si può ora procedere a scaricare il database dei pacchetti gentoo che è stato definito portage. L'operazione che segue consente di tenere sempre aggiornato tale database con i nuovi pacchetti aggiunti. Questa operazione andrebbe eseguita periodicamente al fine di ottenere un sistema sempre aggiornato e quindi più stabile malgrado il tempo richiesto per completare l'operazione non sia brevissimo causa il download di migliaia di piccoli files. Il comando per eseguire il download o l'aggiornamento del portage è emerge sync. 29 A questo punto manca veramente poco all'inizio della compilazione del sistema operativo e ciò che occorre fare adesso è la modifica del file / etc/make.conf che contiene le informazioni necessarie ad effettuare la compilazione. Se gentoo compila il software tenendo conto delle caratteristiche peculiari della macchina è proprio grazie alle opzioni specificate nel file make.conf; esso infatti va modificato al fine di impostare alcune variabili che il sistema userà per eseguire la compilazione. Tali variabili sono relative al tipo di processore, ai percorsi in cui è installato il portage e agli indirizzi internet dei mirror gentoo da cui scaricare i sorgenti del software per altro impostati automaticamente dal comando “mirrorselect” eseguito poc'anzi. Ora viene eseguita la compilazione del sistema operativo. Questa operazione richiede tempo perché, partendo dallo stage 1, verranno compilati, con le opzioni più adeguate, i componenti più interni del sistema operativo fra cui lo stesso compilatore e le relative librerie. Può sembrare strano o paradossale “compilare il compilatore” ma in effetti non è così. Questa infatti è la prima delle attività di compilazione. In questa fase il compilatore generico, fornito per altro nel live-cd, compila i sorgenti di se stesso con le opzioni più adeguate specificate in /etc/make.conf e sostituisce i binari28 così generati a quelli generici forniti col live-cd e usati fino a questo momento. Al termine di questa fase il sistema di installazione procede a compilare e installare gli altri pacchetti di sistema. I comandi necessari a completare questa fase dell'installazione sono sh /usr/portage/scripts/bootstrap.sh e emerge system. 28 Col termine “binario” si intende la versione compilata in linguaggio macchina di un programma e quindi direttamente eseguibile. 30 2.2.3 Fase 3: installazione del sistema base e utility di sistema Lo stato attuale dell'installazione, dopo un lungo periodo dedicato alla compilazione, ci presenta un sistema che manca della parte più caratteristica e fondamentale: il kernel. Tradotto alla lettera kernel sta a significare nucleo e in effetti il kernel è considerato proprio il centro del sistema software, a diretto contatto con l'hardware nei confronti del quale ha funzioni di interprete delle richieste, provenienti dagli strati del sistema più esterni. Un'immagine che può aiutare molto a capire la natura estremamente modularizzata del sistema operativo Linux è la metafora della “cipolla”. Come ben si sa, la cipolla è costituita da diversi strati uno nell'altro: al centro troviamo l'hardware, immediatamente sopra c'è il kernel, poi il software di sistema e ancora esternamente troviamo i programmi applicativi usati dagli utenti abituali del sistema. Si nota quindi che ogni strato è un livello di astrazione che fa da interprete fra lo strato esterno e quello interno e rende possibile così l'astrazione funzionale che consente all'utente umano di usare la macchina “computer” senza parlare il suo linguaggio criptico e poco naturale29. Quindi a questo punto, sistemate alcune configurazioni quali l'aggiornamento del file /etc/fstab secondo il partizionamento del disco fisso specificato in tabella 1 e la configurazione delle impostazioni geografiche col comando ln -s /usr/share/zoneinfo/Europe/Rome /etc/localtime, si è provveduto al download e alla configurazione del kernel. 29 Nota storica: agli albori della scienza informatica, la programmazione era un compito estremamente arduo e noioso che poteva essere svolto solo da pochi specialisti. Questo era dovuto al fatto che non erano stati ancora concepiti i livelli di astrazione più esterni al kernel e quindi tali guru informatici “dialogavano” coi computer direttamente in linguaggio macchina che poi diventò Assembler e alla fine C fino ad arrivare, ai giorni nostri, ad ambienti di sviluppo visuali che hanno reso possibile il RAD: Rapid Application Development, che fa uso di istruzioni di livello elevatissimo quasi in linguaggio naturale ognuna delle quali si traduce in tantissime istruzioni del “vecchio”, sottostante, linguaggio macchina. 31 Nel portage di gentoo sono presenti diverse versioni del kernel opportunamente configurate a seconda dei diversi utilizzi o delle versioni del kernel stesso. Per il sistema in oggetto è stato scelto il kernel “vanilla” e installato col comando emerge vanilla-sources. A questo punto sono stati installati i file sorgenti del kernel che devono poi essere opportunamente configurati e compilati dall'utente-amministratore che sta installando il sistema. La distribuzione gentoo mette a disposizione un'utility di sistema per svolgere velocemente la configurazione e installazione del kernel. L'utility è “genkernel” ed è stata installata col comando emerge genkernel. Dopo il download e l'installazione di “genkernel” si è provveduto a lanciare il comando genkernel --config ed effettuare la configurazione del kernel specificando ad esempio il tipo di processore (Pentium 4) ed eliminando successivamente tutti i driver relativi a periferiche non presenti nel sistema30. Dopo aver salvato la configurazione nel file “/usr/src/linux/.config” l'utility “genkernel” ha provveduto alla compilazione del kernel ora configurato, dei moduli relativi, che si è scelto di creare in fase di configurazione, e ad installare il tutto nei corretti percorsi di installazione. Il kernel del nuovo sistema è ora presente e tecnicamente si può affermare che ora il sistema operativo è effettivamente presente, dato che il kernel è in grado di gestire la macchina in tutte le sue funzionalità senza l'ausilio di ulteriori programmi. Sarebbe tuttavia impensabile, benchè possibile, utilizzare 30 Si definisce driver un particolare programma del sistema operativo necessario per interfacciare il sistema con l'hardware specifico. Per i dettagli circa i driver configurati nel kernel si veda il listato del file “.config” presente in appendice. 32 un sistema informatico in questo stato, sia per la difficoltà delle operazioni necessarie, sia per la mancanza di alcune funzionalità di protezione che evitano all'utente non esperto di compromettere il funzionamento del sistema e non permettono a malintenzionati di eseguire operazioni potenzialmente dannose. La prima delle funzioni di base totalmente automatiche che è stata installata è la funzionalità di “hotplug”. Con questa funzionalità si attiva la capacità della macchina di riconoscere e configurare automaticamente dispositivi esterni che possono essere collegati al sistema durante il normale funzionamento, quindi senza la necessità di eseguire il riavvio. I comandi utilizzati per installare “hotplug” e avviarlo ad ogni boot del sistema sono i seguenti: emerge hotplug; rc-update add hotplug default. Altro strumento indispensabile per un sistema multiutente che deve avere funzionalità di server presente tradizionalmente in tutti i sistemi unix-like è il “logger”. Questo strumento si occupa di memorizzare nei cosiddetti “file di log”, creati in una locazione predefinita del file-system (che solitamente è “/var/log”), tutti i messaggi di stato o di errore che ogni singolo programma in esecuzione solitamente emette [6]. Un logger è uno strumento indispensabile in quanto normalmete in un sistema Linux sono solitamente attivi diversi programmi e per sistemi server, attivi ininterrottamente, è improponibile che l'amministratore sia costantemente presente per monitorare l'attività del sistema. L'amministratore interviene in caso di problemi e grazie alla lettura dei file di log riesce a risalire alla causa e a prendere i provvedimenti necessari. 33 Il comando per l'installazione del logger è emerge app-admin/sysklogd. Il logger viene quindi aggiunto alla configurazione standard del sistema inserendolo nel normale processo di startup col comando rc-update add sysklogd default. Altro importante strumento da installare è un sistema di esecuzione di comandi programmabile. Spesso si rende necessario eseguire operazioni ripetitive a intervalli di tempo predefiniti o a scadenza periodica, ad esempio si può pensare di eseguire un backup dei dati settimanalmente o giornalmente, o si potrebbe pensare anche di inviare periodicamente un'e-mail all'amministratore per aggiornarlo sullo stato attuale del sistema o quant'altro. Per assolvere a questi compiti storicamente su sistemi Unix-like troviamo l'applicazione cron evolutasi poi nelle diverse varianti, delle quali vcron è quella usata in questa installazione. L'installazione è realizzata dal comando emerge sys-apps/vcron. Anche vcron viene aggiunta al sistema base inserendola nel processo di startup con rc-update add vcron default. Ultimo e indispensabile tool da installare è il boot-loader. In un sistema GNU/Linux l'avvio è gestito da un programma che si occupa di far avviare l'immagine del kernel che si è opportunamente configurata. Esso in pratica scrive nel primo settore del disco da cui si effettua il boot il codice necessario per visualizzare l'interfaccia utente e successivamente avviare l'immagine del kernel residente nella partizione di boot[6]. La versatilità di tali strumenti permette di gestire diverse immagini del kernel Linux eventualmente appartenenti anche a distribuzioni diverse, residenti anche su partizioni diverse e consente di avviare sistemi operativi diversi da Linux31. Le alternative prese in considerazione sono lilo e grub. La scelta è ricaduta su lilo a fronte della sua maggiore semplicità nell'installazione ma non è da 31 Avere più sistemi operativi sulla stessa macchina può essere rischioso dal punto di vista della sicurezza ma spesso è la soluzione migliore se è indispensabile dover usare programmi applicativi progettati esclusivamente per un determinato ambiente operativo 34 trascurare nemmeno grub che grazie alla sua più recente progettazione è molto più flessibile e dispone di un ambiente operativo a shell32, da cui è possibile impartire i comandi necessari al boot direttamente in fase di avvio del sistema senza dover necessariamente editare i file di configurazione. L'installazione di lilo dunque si è svolta attraverso il comando emerge lilo che ha provveduto a scaricare i sorgenti, compilarli e installarli; successivamente si è creato il file /etc/lilo.conf (il cui listato è presentato in appendice), affinché il sistema carichi all'avvio l'immagine del kernel presente in /boot/, precedentemente compilata. Per scrivere il tutto sul primo settore del disco di avvio (MBR: Master boot record) si è impartito il comando lilo. A questo punto il sistema è quasi pronto. Ciò che rimane ancora da fare è solo qualche configurazione finale riguardante la mappatura della tastiera secondo la lingua italiana editando il file /etc/rc.conf ed inserendo la direttiva keymap=it. Infine è necessario configurare la rete per fare in modo che le interfacce di rete siano automaticamente inizializzate, con la giusta configurazione ad ogni avvio del sistema. Per lo scopo è stato impostato l'hostanme con il comando echo freedom>/etc/hostname ed editato il file /etc/conf.d/net (presente in appendice), affinché assegni all'interfaccia di rete eth0 l'indirizzo IP pubblico 193.206.185.XXX, e all'interfaccia eth1 l'indirizzo privato 192.168.0.1. Per attivare e inizializzare automaticamente anche l'interfaccia di rete eth1 è stato poi creato un alias a net.eth0 chiamato net.eth1 in /etc/init.d e aggiornata la fase di boot del sistema con rc-update add net.eth0 default e rc-update add net.eth1 default per eseguire tali inizializzazioni all'avvio del sistema[3]. 32 Shell: interprete dei comandi. 35 Ultimo passo prima del riavvio, è stata impostata la password di root col comando passwd e infine, dopo aver terminato la sessione chroot attivata all'inizio del processo di installazione (col comando exit), si è provveduto a smontare la partizione proc con umount /mnt/gentoo/proc e tutte le altre partizioni montate con umount -a. Finalmente si è riavviato il sistema con il comando reboot. 2.2.3 Fase 4: Installazione del software applicativo A questo punto il sistema è funzionante e autonomo. Si procederà perciò da questo punto in poi all'installazione del software applicativo necessario. Storicamente l'utilizzo di un sistema Unix prescinde dall'utilizzo di qualsiasi interfaccia grafica. Gli utenti più esperti del sistema infatti si servono soprattutto della shell a riga di comando. Per l'utilizzo di questo cluster nel lavoro di tesi si è reso però necessario l'uso di un'interfaccia grafica a finestre in previsione dell'utilizzo dell'utility pconsole, che si occuperà di replicare lo stesso comando impartito in una finestra dell'interfaccia grafica a entrambe le macchine del cluster attraverso connessioni ssh33. L'ambiente desktop scelto è KDE. Tale scelta rispetto alle alternative fra cui la più importante è il progetto Gnome è stata operata considerando la sua maggiore versatilità, maturità ed ergonomicità.. Giunto oggi alla versione 3.2 KDE si può considerare un prodotto ormai maturo e gli si deve gran parte del merito per la diffusione di Linux anche su sistemi desktop. Infatti un'interfaccia molto amichevole e graficamente molto curata, pone KDE in diretta concorrenza con altri ambienti desktop molto più blasonati, 33 ssh: acronimo di “secure shell” ed è un elemento della suite di programmi OpenSSL che si occupa di stabilire una connessione sicura, criptata e protetta da password, fra due host. 36 appartenenti a sistemi operativi commerciali. KDE come è logico, è un prodotto assolutamente open source e totalmente gratuito. L'installazione di KDE si è svolta col comando emerge kde-base/kdebase che come al solito ha scaricato i sorgenti, li ha compilati e installati. L'intero processo, a causa della grandezza dell'ambiente KDE, è durato svariate ore. Si è provveduto inoltre alla localizzazione dell'ambiente nella lingua italiana attraverso emerge kde-i18n (export LINGUAS=it). Dopo un ulteriore riavvio si sono poi operate alcune personalizzazioni riguardanti in particolare la shell attraverso al creazione dei files /root/.bash_profile e /root/.bashrc, che sono i file di configurazione delle impostazioni della shell bash per l'utente root. Nel file /root/.bash_profile che viene letto al primo avvio della shell da parte di root si è aggiunta la riga PATH=$PATH:/usr/X11R6/bin:/usr/kde/3.1/bin per fare in modo che gli eseguibili contenuti nelle directory specificate possano essere avviati senza specificare l'intero percorso. PATH infatti è la variabile di ambiente che contiene tutti i percorsi predefiniti in cui la shell va a cercare i files da eseguire. In /root/.bashrc inoltre è stata inserita qualche riga di configurazione riguardante i colori dell'output della shell e gli alias34 per alcuni comandi (cfr. appendice). Per completare la configurazione del sistema sono state installate alcune migliorie grafiche al desktop manager peraltro presenti nel ramo ufficiale di 34 Alias: nome alternativo spesso definito dall'utente per riferirsi a un dato comando. 37 portage. Tali migliorie includono un tema per puntatori del mouse e un tema per il desktop manager. I comandi per l'installazione di tali elementi sono: emerge thinkeramik e emerge blueglass-xcursor. Uno dei programmi sicuramente più utilizzati in ambito cluster è pconsole. Tale software ha la funzione di replicare i comandi impartiti da console a tutti i nodi del cluster attraverso una connessione sicura che sfrutta ssh. L'uso di pconsole si rende necessario in quanto nell'installazione dei componenti che forniranno le funzioni di High Availability passa per gli stessi comandi da impartire a tutti i nodi del cluster. Pconsole infatti, lanciato da riga di comando con pconsole.sh [indirizzo_IP_nodo1] [indirizzo_IP_nodo2], apre nell'interfaccia grafica due sessioni ssh ad entrambi i nodi specificati dagli IP ed invia loro lo stesso comando che viene digitato una sola volta nella finestra del programma stesso. Si rende perciò indispensabile l'uso di un'interfaccia a finestre e come è stato già visto è disponibile il server X e il desktop manager KDE. Sfortunatamente tale applicazione non è presente nel portage gentoo, per cui si è resa necessaria la procedura di compilazione standard di Linux, a partire dal codice sorgente. Dopo aver scaricato i sorgenti di pconsole dal sito http://www.heiho.net/pconsole/ si è provveduto alla scompattazione del tarball e alla compilazione e installazione con i comandi ./configure; make; make install. 38 Come già specificato, pconsole utilizza la connessione di ssh ai due nodi per replicare i comandi per cui è necessario installare anche il demone35 sshd che fornirà il servizio di connessione criptata ai client che ne faranno richiesta. L'installazione procede col comando emerge sshd e viene aggiunto poi tale server alla configurazione standard con rc-update add sshd default. 2.2.4 Fase finale: replicazione dell'intera installazione sull'altro nodo. A questo punto l'installazione del sistema base è davvero completa. Si provvede perciò a replicare l'installazione e configurazione sull'altro nodo. Per assolvere a questo compito generalmente si utilizzano appositi software di installazione di cluster:ad esempio il software SIS (Systems Installation Software) [2] è un tool integrato che consente l'installazione di Linux box già configurate a partire da un server centrale che contiene tutte le informazioni necessarie all'installazione. Solitamente sistemi come questo sono comuni nelle installazioni dei cluster adibiti al calcolo, i cosiddetti HPC (High Performance Computer), che sono composti da un numero di nodi molto elevato (spesso dell'ordine delle centinaia) per cui il processo di installazione diviene un passo molto complesso che è necessario rendere omogeneo e quanto più automatizzato possibile. Solitamente si predispone un server centrale in cui si crea l'immagine del sistema che deve essere installato sui diversi nodi e che poi, attraverso la connessione di rete si provvede a trasferire ai nodi stessi. E' chiaro che l'ampiezza di banda della rete del server è molto più grande di quella dei 35 Demone: in ambiente Linux un demone è un programma residente in memoria che assolve alle funzioni di server per un determinato scopo. Il demone sshd infatti è costantemente attivo in ascolto su una porta predefinita, di eventuali connessioni da client esterni. 39 singoli nodi dato che contemporaneamente accedono ad esso i diversi nodi del cluster. Nel sistema come SIS c'è anche un configuratore che si occupa di configurare opportunamente i diversi nodi impostando i parametri identificativi come nome-host indirizzi di rete e altro, in modo opportuno. Spesso SIS è integrato in altri tool più complessi che installano altri componenti aggiuntivi come le librerie di calcolo MPI, sistemi di gestione delle risorse come PBS o SGE e strumenti di monitoraggio del carico di sistema come Ganglia. Gli strumenti più avanzati inoltre dispongono di capacità aggiuntive in grado di installare e configurare file-system distribuiti come PVFS o GPFS (prodotto da IBM e gratuito solo per enti accademici) o infrastrutture di rete particolari e ad alta velocità come Myrinet. Tali strumenti integrati comprendono OSCAR il cui sito è http://oscar.sourceforge.net, NPACI Rocks su www.Rocksclusters.org, Warefulf presente su http://warewulf-cluster.org e infine troviamo CSM (Cluster System Management) che è prodotto da IBM e fornito con licenza proprietaria: si ha comunque la possibilità di scaricarlo da Internet e usarlo gratuitamente solo per trenta giorni. E' disponibile al sito www-1.ibm.com/servers/eserver/clusters/software/. Per l'installazione del cluster oggetto di questa tesi, che è un cluster formato da soli due nodi come richiesto a un sistema in alta disponibilità, non sono stati usati tool di installazione appositamente concepiti, in quanto la complessità del processo non era tale da giustificarne l'uso. Per la replicazione dell'installazione infatti è stato usato un sistema congegnato ad-hoc tanto semplice quanto rapido. Tale sistema si è avvalso infatti dell'utility di rete netcat che consente di stabilire una connessione ad un 40 certo IP-porta nella rete direttamente da linea di comando, rendendo tale connessione disponibile a eventuali comunicazioni sul canale così aperto. Infatti a netcat è stato concatenato il comando dd per effettuare lo streaming bit a bit dei dati del disco su cui si è effettuata l'installazione. Innanzitutto si è provveduto ad avviare la macchina client (cioè il nodo di destinazione), facendo boot da CD-ROM ed utilizzando il Live-CD Knoppix 3.236. Si è impostata l'interfaccia di rete con ifconfig eth0 192.168.0.2 netmask 255.255.255.0 e si è provveduto a mettere il sistema in ascolto sulla porta 9000 impartendo il comando di scrivere sul dispositivo /dev/sda i dati ricevuti attraverso tale connessione, usando dei blocchi grandi 1Mb. Tutto questo lo si evince dal seguente comando: nc -l -p9000|dd of=/dev/sda bs=1Mb. Sul nodo master e cioè quello che conteneva l'installazione già funzionante, da replicare, si è impartito il comando con concatenazione inversa in modo da inoltrare i dati letti sul dispositivo /dev/sda verso la connessione di rete instaurata da netcat verso il sistema client configurato con l'IP 192.168.0.2 e in ascolto sulla porta 9000. Il comando impartito dunque è il seguente: dd if=/dev/sda |nc -w2 192.168.0.2 9000 Alla macchina master è stato precedentemente assegnato un IP sulla stessa rete del client, col comando ifconfig 192.168.0.1 netmask 255.255.255.0. Dopo la fase di trasferimento dati (durata circa due ore) anche la macchina client aveva il suo sistema operativo funzionante e configurato ma perfettamente identico in ogni impostazione e personalizzazione a quello del 36 Live-CD: distribuzione Linux completa e funzionante completamente residente su CD-ROM che essendo completamente autonoma non necessita di scrivere dati su dischi fissi. Tutte le impostazioni e personalizzazioni si perdono ovviamente ad ogni riavvio. La distribuzione più famosa i questa categoria è certamente Knoppix, ma sulla stessa scia se ne stanno diffondendo molte altre. 41 nodo master. Si è provveduto pertanto a personalizzare tutti i parametri relativi al client per distinguerlo dal master. Chiaramente un risultato del genere è possibile solo quando le macchine coinvolte nel processo di “clonazione” del sistema sono perfettamente identiche. 42 Capitolo 3 L'ALTA DISPONIBILITA' (HA) Tutti passi dell'installazione finora eseguiti hanno consentito di rendere disponibili gli strumenti indispensabili al funzionamento delle macchine coinvolte nel cluster e messo a disposizione dell'amministratore di sistema i tool necessari a gestire un sistema come quello che si è deciso di installare. Attraverso l'utilizzo di questo software si provvederà adesso a installare i componenti necessari affinché il sistema garantisca l'alta disponibilità. E' bene chiarire in profondità il concetto di alta disponibilità. Si tenga presente che lo scopo di un sistema HA è quello di fornire la capacità di fault tolerance all'erogazione di un servizio. Tale funzionalità può ritenersi indispensabile per servizi di particolare importanza ma, relativamente ai costi di installazione e gestione di un siffatto sistema, si può scegliere di dotare di tale funzionalità anche servizi non particolarmente critici. Lo scopo di questa tesi è dimostrare che è possibile costruire un sistema HA con costi particolarmente ridotti, legati esclusivamente all'acquisto dell'hardware. I costi sono tali da consentire la fault tolerance anche a servizi di rilevanza non critica, in quanto l'intero setup del sistema viene eseguito con software completamente gratuito e open-source: dal sistema operativo al software di monitoraggio dell'erogazione dei servizi che verrà descritto nei capitoli successivi. 43 3.1 Livelli di disponibilità La disponibilità di un servizio può vedersi stratificata in livelli concentrici ognuno dei quali è incluso nel successivo e possono essere schematizzati nel seguente modo [2]: • Livello 1: Disponibilità normale. A questo livello minimo di disponibilità l'unica protezione contro eventuali interruzioni nell'erogazione del servizio è il backup dei dati, eseguito a discrezione dell'amministratore del sistema. E' evidente che in caso di interruzione del servizio, potrebbe essere possibile ripristinare dati relativamente aggiornati, dipendentemente dalla frequenza dell'operazione di backup ma è altrettanto evidente che la ripresa nell'erogazione del servizio può avvenire solo quando l'amministratore di sistema, dopo aver ripristinato i dati di backup, ritiene di poter riprendere l'erogazione del servizio. Il tempo intercorrente dall'interruzione al successivo ripristino della situazione normale di funzionamento è dipendente dai tempi umani legati all'attività dell'amministratore. • Livello 2: Disponibilità maggiore. Lo scopo di un sistema che garantisce questo livello di disponibilità è la salvaguardia dei dati nel miglior aggiornamento possibile. Tale scopo è raggiunto attraverso il mirroring fisico dei dischi attraverso tecnologie di RAID37. Anche se a questo livello è possibile mantenere i dati sempre aggiornati, anche in caso di danni del dispositivo di memorizzazione, la ripresa dell'erogazione del servizio dipende ancora in maniera totale dalla disponibilità dell'amministratore di sistema. 37 RAID: Acronimo di Redundant Array of Inexpensive Disk. Tale tecnologia, stratificata in diversi livelli che bilanciano, dal più basso al più alto, un diminuire dell'affidabilità e un aumento della prestazione nella velocità di gestione dei dati, fornisce la possibilità di recupero di dati nel caso di problemi ai dischi che li contengono. Questa possibilità è data dal fatto che il RAID replica più o meno totalmente i dati memorizzati sui diversi dischi a sua disposizione. 44 • Livello 3: Alta disponibilità. A questo livello si garantisce la protezione del sistema e dell'erogazione dei servizi. E' evidente come questo livello rappresenti il salto di qualità nella scala della disponibilità, in quanto si prescinde l'erogazione dei servizi oltre che da errori sui dati anche dai tempi di reazione dell'amministratore. Un sistema che fornisce servizi in alta disponibilità è costruito come un cluster di due nodi affiancati affinché il secondo automaticamente intervenga prendendo il posto del primo nel caso in cui quest'ultimo per una serie di eventi, previsti (si pensi alla manutenzione ordinaria del singolo sistema) o casuali (difficili da prevedere e causa principale dell'adozione dell'alta disponibilità), interrompa l'erogazione dei servizi ad esso demandati. • Livello 4: Disaster Recovery. Questo livello è un'evoluzione dell'alta disponibilità che prevede la replicazione dell'intera installazione che eroga i vari servizi, in un'altra area geografica più o meno distante dalla prima a seconda del livello di fault tolerance che si vuole implementare. Al fine di validare i motivi che impongono il ricorso all'alta disponibilità nell'erogazione di servizi relativamente critici si riporta una statistica calcolata dall'organo internazionale degli standard IEEE e risalente all'Aprile del 1995, che mostra le classiche cause di downtime dei sistemi di elaborazione. Cause di Downtime Hardware 10,00% Persone 15,00% Malfunzionamenti Software 40,00% Downtime pianificati 30,00% Ambiente 5,00% Come si evince dunque dal grafico, la causa principale di downtime è il malfunzionamento software che per sua natura è praticamente impossibile prevedere in quanto concerne malfunzionamenti relativi ad errori di 45 programmazione che si verificano in presenza solo di certe condizioni inizialmente ignote. E' evidente dunque che fornire un servizio con la probabilità che quattro volte su dieci si interrompa, non è certo incoraggiante!. 3.2 Requisito dei cinque 9 I requisiti che un sistema in alta disponibilità deve soddisfare sono legati tipicamente al tempo di disponibilità del servizio, alle prestazioni globali del sistema e all'economicità totale del sistema implementato. E' evidente che il requisito sulla disponibilità è quello che maggiormente caratterizza un sistema di questo tipo e legata pertanto a tale caratteristica troviamo una misura del tempo di disponibilità garantita [2], definita come il rapporto percentuale fra il tempo di erogazione effettiva del servizio e il tempo di osservazione. L’obiettivo ideale di un servizio altamente disponibile, alla portata di poche implementazioni, è quello di raggiungere i “cinque 9”, ossia un tempo di erogazione effettiva pari al 99,999% del tempo di osservazione. Se rapportato ad un tempo di osservazione pari ad un anno solare si ricava facilmente che il tempo massimo di sospensione del servizio consentito da questo requisito è di soli 5 minuti e 15 secondi, che equivalgono a 6 secondi per settimana. E' un risultato molto arduo da raggiungere che richiede sforzi spesso fino a qualche tempo fa appannaggio solo di grandi aziende. Con l'affermarsi negli ultimi anni della filosofia open-source, si sono resi disponibili strumenti gratuiti per realizzare l'alta disponibilità di un servizio per cui il sistema che si sta costruendo è pensato per soddisfare il requisito dei “cinque 9”. 46 I tempi di sospensione del servizio consentiti a seconda della percentuale di erogazione sono presentati nella tabella 2: Percentuale 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, 30 minuti 20 minuti, 10 secondi 99,90% 8 ore, 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 Uptime Tabella 2 Percentuali di uptime La strategia che consente di ottenere un livello di disponibilità sempre maggiore consiste nella successiva eliminazione dei “single point of failure”, ovvero di tutti quegli elementi che smettendo di funzionare coinvolgerebbero l'intero sistema causandone l'arresto e quindi la sospensione nell'erogazione del servizio. Le possibili soluzioni a questo problema sono essenzialmente di due tipi: si può migliorare la stabilità del singolo sistema, ridondando le componenti critiche come i dischi che potrebbero inoltre supportare la sostituzione a caldo, le interfacce di rete o altri componenti particolari. Questa soluzione si definisce monolitica e richiede l'utilizzo di componenti molto particolari e di conseguenza molto costosi e comunque non pone rimedio a tutti i casi in cui si potrebbe verificare la sospensione del servizio. L'altro tipo di soluzione, che è quella adottata in questo studio è appunto definita soluzione cluster ed ha come caratteristica la replicazione dell'intero sistema cosicché in presenza di un qualunque malfunzionamento che ferma l'erogazione del servizio, l'altro sistema del cluster prende il suo posto e continua a fornire il servizio allo stesso modo. Un cluster in alta disponibilità 47 è in grado di eseguire tale operazione in maniera totalmente trasparente ai fruitori del servizio. Questo tipo di soluzione presenta un grosso vantaggio: è possibile utilizzare hardware non dedicato specificamente a un tale uso ma relativamente generico e quindi non particolarmente costoso. E' anche evidente che è possibile una gestione più economica e flessibile della manutenzione sia hardware che software rendendola di fatto trasparente a quanti fanno uso del sistema. Di contro tale soluzione richiede una maggiore complessità nell'installazione e maggiore know-how dell'amministratore. 3.3 Le prestazioni Altra caratteristica non trascurabile di un sistema in alta disponibilità è la prestazione del sistema nell'erogazione del servizio. In base a studi condotti in merito in particolare dal Gartner Group e Forrester38 si evidenzia che il tempo di attesa tollerabile dagli utenti dopo la richiesta di un servizio va dai 4 ai 20 secondi relativamente al tipo di applicazione. Considerando questi dati di fatto, 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 tenga in considerazione 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 diretti, ma anche tempi legati all'ampiezza di banda del sistema di comunicazione fra il client e il server, e alla latenza dei dispositivi di connessione. Deve essere inoltre 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 38 Gartner Group www3.gartner.com, Forrester www.forrester.com, sono enti di ricerca e analisi che svolgono indagini spesso dietro commissione sui più disparati argomenti inerenti analisi di mercato, analisi delle tendenze comuni e di comportamento. 48 contemporaneamente. Questo fattore impone dunque la disponibilità di potenza elaborativa adeguata facilmente e velocemente scalabile per far fronte ad esigenze crescenti future. Con la soluzione monolitica il problema si risolve potenziando l'hardware a disposizione sostituendo e aggiornando i componenti che costituiscono il collo di bottiglia39 per il sistema. Per contropartita si ha un aumento dei costi di installazione oltre che una scarsa adattabilità dell'intera infrastruttura all'aumentare del carico computazionale. La soluzione cluster ancora una volta risolve il problema in modo più efficiente ed economico; infatti la scalabilità delle prestazioni del sistema viene ottenuta o aumentando il numero dei server sui quali viene distribuito il carico di lavoro o aggiornando i server utilizzati. Nel primo caso, facendo opportunamente uso di un nodo master eventualmente replicato che si occupi di smistare le varie richieste ai diversi server, si ha la possibilità di aggiungere risorse a seconda del carico elaborativo, considerando ogni server una risorsa non specializzata e pertanto perfettamente modulare. Questo tipo di sistema è infatti definito cluster con bilanciamento dinamico delle risorse [2]. 3.4 Tipologie di cluster A fronte delle considerazioni fatte precedentemente si possono distinguere due tipologie di cluster ad alta disponibilità utilizzabili per l’erogazione di servizi: 1. Cluster Active-Active (AA) o Active-StandBy (AS) 2. Cluster a bilanciamento di carico (Load balancing cluster). Un cluster per l'alta disponibilità AA o AS è costituito da due nodi ed è caratterizzato dal fornire i suoi servizi con un minimo downtime. Il software 39 Nell'informatica l'espressione “collo di bottiglia” sta ad indicare un componente hardware o software di un sistema di elaborazione che condiziona il resto del sistema a prestazioni non efficienti. 49 che realizza il cluster fra i due nodi è infatti 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 indirizzi IP e la riattivazione degli stessi sull'altro nodo. Il tutto avviene in maniera del tutto trasparente all'amministratore che interviene per riportare il cluster nello stato di funzionamento standard ma senza che il servizio erogato abbia subito interruzioni di sorta. Un cluster per il bilanciamento del carico è costituito da un pool di nodi opportunamente configurati per consentire la suddivisione dinamica e bilanciata del carico di lavoro computazionale. In tale configurazione uno dei nodi assume un ruolo specializzato, in quanto assolve alla funzione di dispatcher e ha quindi la facoltà di ripartire ai nodi generici il lavoro computazionale. Esso infatti è costantemente consapevole del carico presente su ognuno dei nodi generici e, in base a una certa politica di ripartizione, distribuisce i processi da elaborare in modo opportuno. Il trasferimento fisico dei pacchetti ai nodi generici incaricati di una certa elaborazione può essere effettuato con tecniche diverse che comprendono il Direct-Redirect, il NAT (Network Address Translation) o l’ IP-Tunneling. Nel primo caso si usa un furbo quanto semplice meccanismo ideato da IBM che sfrutta la possibilità di cambiare opportunamente l'indirizzo MAC del destinatario del pacchetto IP e reinserirlo sulla rete in modo che venga ora ricevuto dal nodo generico stabilito dal dispatcher. Una volta ricevuto il pacchetto, il nodo generico controlla che l'inidirizzo IP-destinatario ivi contenuto, sia presente fra quelli impostati sulle sue interfacce di rete. Ovviamente il pacchetto ha come indirizzo IP di destinazione quello del dispatcher, e per far si che il nodo generico non lo rigetti, ha sull'interfaccia di loopback proprio l'IP del dispatcher. Tale impostazione è possibile per il fatto che l'interfaccia di loopback è strettamente privata. 50 Le risposte a tale comunicazione sono correttamente inviate al mittente dato che l'IP-mittente del pacchetto ricevuto non subisce variazioni. 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 fault-tolerance in quanto se uno dei nodi generici dovesse per qualunque problema rendersi non disponibile verrebbe automaticamente trascurato dal dispatcher e indirettamente verrebbe messo fuori dal cluster. L’alta disponibilità viene realizzata completamente utilizzando per il nodo “dispatcher” un cluster del primo tipo, 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 è elevato, come ad esempio può accadere per un web server aziendale. In definitiva dunque l'architettura cluster è molto vantaggiosa per realizzare la alta disponibilità dei servizi erogati, è in grado di fornire scalabilità nelle prestazioni se si utilizza la tipologia di cluster che permette il load balancing e non ultimo risulta essere molto più economica rispetto a soluzioni diverse che offrono le stesse caratteristiche soprattutto se si tiene conto del fatto che il software che permette l'implementazione del cluster può essere completamente gratuito oltre che open-source. Nel setup realizzato per questa tesi il software è interamente open-source. 51 Capitolo 4 IL CLUSTER REALIZZATO IN QUESTA INSTALLAZIONE Il cluster realizzato in questo setup è un cluster per l'alta disponibilità formato da due nodi che fornisce l'erogazione di due servizi in configurazione ActiveActive. Questa configurazione prevede due nodi che si controllano vicendevolmente e costantemente sui quali appunto è distribuita in modo bilanciato l'erogazione di diversi servizi. La configurazione “Active-Active” si contrappone a quella “Active-Standby”, in cui un solo nodo eroga tutti i servizi e l'altro interviene solo quando il primo cade facendosi carico di tutti i servizi erogati da quest'ultimo. L'insieme di un servizio e dell’indirizzo IP sul quale risponde viene definito “Resource Group”: quando un nodo del cluster cade, tutto il ResourceGroup viene trasferito sull'altro nodo. Quando nel seguito ci si riferirà al servizio, si intenderà quindi riferirsi al resource-group. Per la migrazione degli indirizzi viene eseguito un meccanismo detto ARPspoofing che, come si vedrà più avanti, richiede particolari capacità e impostazioni dell'hardware. L'operazione di migrazione dell'intero servizio si definisce “Failover”. Tornando ora alla configurazione Active-Active, i due nodi in tale configurazione hanno ognuno il proprio servizio in esecuzione. Nel momento in cui un nodo cade il suo servizio viene migrato sull'altro nodo con la 52 procedura di failover e su tale nodo alla fine è presente sia il suo servizio che il servizio del nodo caduto. Ognuno dei due nodi quindi svolge contemporaneamente funzione di server per il servizio che eroga e di fault-tolerance per l'altro nodo in quanto in caso di problemi su un nodo il servizio che esso erogava viene migrato automaticamente sull'altro. E' bene dunque dimensionare le capacità di ogni nodo del cluster in modo tale da poter sopportare, per periodi relativamente non prolungati, il carico computazionale di entrambi i nodi. 4.1 Elementi fondamentali: una visione panoramica Gli elementi fondamentali e caratteristici su cui è stata condotta la ricerca sono sostanzialmente i seguenti: 1. File-system. Il sistema di memorizzazione dei dati è uno degli elementi critici di un cluster in quanto essendo il cluster un pool di nodi che lavorano in modo cooperativo è evidente che i dati non possono essere modificati contemporaneamente dai diversi nodi perché si andrebbe incontro a gravi problemi di consistenza dei dati. Un file-system orientato all'impiego in ambiente cluster deve fornire meccanismi di blocking sui dati in modo tale da non permettere l'accesso contemporaneo. 2. Suite software per l'alta disponibilità. Questo elemento del cluster può essere considerato il più importante non tanto in termini di criticità quanto per la funzione che esso svolge. E' certamente il componente software che alla fine rende l'hardware che si vuole utilizzare per costruire il cluster, un cluster in alta disponibilità. Si parla di suite in quanto l'alta disponibilità viene resa possibile grazie ad un insieme di programmi che svolgono cooperativamente i loro compiti. In tale suite è presente pertanto un modulo che effettua il controllo di “heartbeat” per stabilire lo stato di funzionamento dei nodi, un insieme di script per fornire gli automatismi 53 necessari e l'interfacciamento con gli altri moduli software, in particolare il modulo del file-system. 3. Strumenti di monitoraggio e analisi. Il ricorso a tali strumenti è dovuto al fatto che la certezza sul funzionamento fisico dei due nodi non è sufficiente a garantire che il servizio sia realmente erogato. Si pensi ad esempio al fatto che per un qualunque motivo, inclusa l'intrusione esterna non autorizzata, il servizio venga interrotto. Il nodo comunque è funzionante secondo l'heartbeat ma il servizio non viene erogato. Gli strumenti di monitoraggio consentono attraverso script appositi per ogni servizio fornito, opportunamente scritti o modificati, di verificare l'erogazione effettiva. Ci si potrebbe allora domandare in effetti quale sia l'utilità dell'heartbeat. La risposta è pressoché immediata in quanto, mentre il controllo effettuato dall'heartbeat è poco invasivo, quasi trasparente dal punto di vista delle risorse impiegate, esso può essere ripetuto a intervalli molto brevi, ed inoltre se il nodo non risponde all'heartbeat certamente non sta nemmeno erogando il servizio; il controllo effettuato da strumenti di monitoraggio come mon invece deve essere necessariamente lanciato ad intervalli più lunghi nell'ordine dei trenta secondi per evitare di occupare il sistema con richieste di solo monitoraggio. Le verifiche fatte da mon consistono nella connessione ai server in ascolto sulle macchine e verificare che la risposta ad alcuni input sia quella attesa. Praticamente ogni analisi di mon equivale ad una richiesta di servizio identica a quella sottoposta da un client. Gli strumenti di analisi sono prettamente strumenti che analizzano il flusso dei “log”. I log sono messaggi che vengono emessi ad intervalli regolari o al verificarsi di particolari condizioni come l'avvio o l'arresto e vengono memorizzati all'interno di file di testo in percorsi predefiniti solitamente sotto /var/log e organizzati opportunamente dal programma che li genera per evitare 54 confusione e una più immediata localizzazione delle informazioni. Il sistema di analisi dei log deve accorgersi di situazioni critiche, come il failover dei servizi, e provvedere ad avvisare, nei modi predefiniti, l'amministratore, affinché prenda le dovute precauzioni nei tempi che ritiene ragionevoli. Uno strumento che effettua un'analisi real-time dei log e che è in grado di reagire alla presenza di determinati messaggi all'interno dei file log è swatch. 4.2 Schema di progetto L'illustrazione 1 rappresenta schematicamente il cluster che si è realizzato in questo lavoro di tesi. eth0: IP pubblico eth0: IP pubblico Nodo 2 Nodo 1 eth1: connessione heartbeat e drbd privata eth2: channel bonding con eth1 0 1 0 1 ttyS0: connessione seriale Illustrazione 1: Modello del sistema Dalla figura si nota la presenza dei due nodi, che sono fisicamente le due macchine precedentemente descritte, su ognuno dei quali gira un servizio differente. 55 Questo tipo di cluster non offre la caratteristica del bilanciamento di carico dinamico, ma, l'amministratore in fase di setup è in grado di suddividere staticamente i servizi da erogare distribuendoli in modo opportuno ai due nodi. E' indispensabile inoltre che ognuno dei due nodi, per il tempo necessario al ripristino dell'altro nodo nell'eventualità di un crash di sistema, sia in grado di sopportare oltre che il suo, anche il carico computazionale del nodo caduto. Ognuno dei due nodi possiede tre interfacce di rete40 denominate, secondo la nomenclatura Unix: eth0, eth1, eth2. Come si nota dallo schema, la prima interfaccia eth0 è dedicata alle connessioni esterne. Su tale interfaccia ognuno dei due nodi presenta l'indirizzo IP pubblico rispettivamente 193.206.185.xx1 e 193.206.185.xx2 appartenenti allo spazio di indirizzi di una delle reti di classe C riservate all'INFN. I nodi quindi sono collegati all'esterno attraverso uno switch41, necessario oltre che per motivi di praticità, per isolare dall'esterno i due nodi e consentire il meccanismo di ARP-spoofing necessario al sistema di gestione del cluster, Heartbeat, il quale per effettuare l'IP-takeover42 invia sulla rete dei gratuitousARP. Questo meccanismo non è generalmente consentito sugli switch della rete dipartimentale, in quanto può essere usato per effettuare attacchi al sistema del tipo “man-in-the-middle”43 Potrebbe inoltre essere necessario impostare 40 Interfaccia di rete: ognuna delle schede ethernet Gigabit montate in ogni nodo. 41 Switch: dispositivo hardware che consente il collegameto in rete di computer appartenenti a reti diverse. 42 IP-takeover: operazione che consente la migrazione dell'IP da un nodo all'altro del cluster su cui rispondeva il servizio erogato in alta disponibilità. 43 Man-in-the-middle: tra le diverse tecniche per crackare un sistema ed effettuare operazioni illegali vi è anche questa. Un attacco man-in-the-middle consiste nel frapporre una macchina esterna fra un certo server e tutti i suoi client. Inviando infatti dei gratuitous-ARP sulla rete del server da una macchina presente nella stessa rete si reindirizzano tutti i pacchetti destinati al server a tale macchina “intrusa” la quale risponderà ai vari client nel modo che ritiene opportuno e quanto più trasparente. Si pensi ai danni possibili se la macchina vittima dell'attacco è un file-server tipo ftp o altro. Nel cluster oggetto di 56 opportunamente sullo switch il tempo di aggiornamento delle tabelle dei MAC per evitare che l'IP-takeover non richieda parecchio tempo, dopo l'invio dei segnali di gratuitous-ARP. Le altre due interfacce di rete eth1 ed eth2 sono invece utilizzate esclusivamente per scopi interni al cluster. Le due interfacce sono connesse in “channel-bonding” per evitare così un “single point of failure” rappresentato dal collegamento interno fra i due nodi. La ridondanza di tale canale consente inoltre una drastica diminuzione della probabilità che si verifichi il fenomeno del brain-splitting, ma risulta di particolare importanza anche per l'integrità dei dati che il file-system distribuito contiene. Lo schema della figura 1 visualizza il file-system distribuito come un insieme di blocchi. Su ogni nodo si nota la presenza di due blocchi denominati allo stesso modo e rispettivamente 0 e 1. Tali blocchi, come si vedrà in dettaglio nel capitolo dedicato al file-system, vengono definiti nbd (network block device) e su ogni nodo contengono gli stessi dati: sono in parole povere l'uno la copia speculare dell'altro. Sono costantemente sincronizzati tra loro con politiche tali da porre rimedio alle diverse situazioni di errore che possono verificarsi. La colorazione dei blocchi sta a rappresentare la capacità del nodo di comandare operazioni di scrittura ed ha il seguente significato: se su un nodo il blocco è verde, quel nodo ha la possibilità di scriverci e contemporaneamente comanda all'altro nodo attraverso il canale interno di effettuare la stessa scrittura; se il blocco è rosso, il nodo non ha la possibilità di scriverci di sua iniziativa ma può solo effettuare scritture comandate dall'altro nodo. Questo meccanismo preserva l'integrità dei dati, consentendo solo ad un nodo, definito primario, di comandare la scrittura sul dispositivo e consente la disponibilità totale e immediata degli stessi dati presenti sull'altro altro nodo (che si definisce secondario). questo studio non si presentano problemi di questo tipo in quanto i due nodi sono i soli ad essere connessi allo switch. 57 4.2.1 Installazione del channel-bonding Come specificato nel paragrafo 4.2, per evitare che la scheda di rete per la comunicazione di sincronizzazione interna rappresentasse un “single point of failure”, si è provveduto a ridondarla utilizzando un altro dispositivo identico per caratteristiche e specifiche. Il channel-bonding è una funzionalità fornita con i sorgenti del kernel la cui implementazione richiede una corretta configurazione del kernel utilizzato e la compilazione del programma necessario a rendere effettivo questo tipo di connessione [7]. In pratica è possibile configurare il channel-bonding in modo tale che le due interfacce di rete siano utilizzate contemporaneamente per incrementare le performance e l'affidabilità. In questo modo infatti, venendo meno una, l'altra continuerebbe ancora a connettere i due nodi. Le due interfacce possono essere configurate per lavorare singolarmente in modo tale che un'interfaccia rimanga in stand-by e venga quindi attivata nel caso in cui quella attiva dovesse rendersi non disponibile. All'interno del ramo dei sorgenti del kernel al percorso /usr/src/linux/Documentation/network è collocato il file ifenslave.c che realizza effettivamente il bonding fra le due interfacce di rete. Per effettuare il bonding perciò è necessario compilare il programma ifenslave.c. Se ci si porta nella directory che contiene il sorgente attraverso il comando cd /usr/src/linux/Documentation/network, si può lanciare la compilazione con gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave. Il file ottenuto lo si deve copiare nella directory degli eseguibili di sistema con cp ifenslave /sbin/ifenslave. Si da' per scontato che /usr/src/linux sia un collegamento alla directory contenente i sorgenti del kernel che si sta usando, il quale per altro deve essere stato configurato ed eventualmente ricompilato 58 per supportare la funzionalità. Essa va per tanto abilitata fra le opzioni del “network device” in fase di configurazione. La configurazione si completa inserendo nel file /etc/modules.conf la riga “alias bond0 bonding mode=0 miimon=100”. Per attivare il channel bonding è sufficiente, dopo aver riavviato il sistema col kernel eventualmente ricompilato e integrato del modulo relativo al bonding, settare l'interfaccia di rete astratta bond0 con ifconfig bond0 192.168.0.1 up e aggiungere al meccanismo di bonding le interfacce di rete reali, che in questo caso sono “eth1” ed “eth2”: ifenslave bond0 eth1 eth2. E' possibile inoltre inserire queste impostazioni negli appropriati file di inizializzazione del sistema per fare in modo che l'impostazione venga mantenuta ad ogni riavvio della macchina. Tale configurazione va ripetuta allo stesso modo sull'altro nodo con la sola accortezza di cambiare nel comando ifconfig bond0 192.168.0.1 l'indirizzo IP con 192.168.0.2. Le opzioni inserite nel file /etc/modules.conf, “mode=0 miimon=100” stanno ad indicare il particolare uso che si vuole fare del channel bonding: mode=0 specifica al driver di usare alternativamente le schede di rete in base alla disponibilità ad accettare dati da trasportare, secondo l'algoritmo del Round Robin; miimon=100 indica l'attivazione della funzione di monitoraggio del collegamento su ogni interfaccia di rete coinvolta nel bonding, in modo tale 59 che se su un'interfaccia il collegamento è caduto, non saranno inviati pacchetti che poi andrebbero persi. La funzionalità di monitoring deve essere supportata dalle interfacce di rete e il valore 100 vuole indicare l'intervallo di tempo in millisecondi fra un controllo e il successivo. L'output del comando ifconfig dopo aver configurato e inizializzato correttamente il channel bonding è il seguente: [root]# /sbin/ifconfig bond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0 TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0 collisions:0 txqueuelen:0 eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0 TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0 collisions:0 txqueuelen:100 Interrupt:10 Base address:0x1080 eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0 TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:9 Base address:0x1400 Si noti che le interfacce di rete reali hanno un MAC-address44 identico, lo stesso che viene impostato al dispositivo virtuale bond0 e determinato dalla prima interfaccia di rete che nell'esempio visualizzato si riferisce a eth0. 4.3 Heartbeat Come già anticipato l'heartbeat è il meccanismo che consente il monitoraggio costante dei due nodi del cluster. E' bene fare una distinzione fra i termini “heartbeat” che si possono trovare in questo testo. Se si parla di “Heartbeat” si fa riferimento all'intera suite di programmi che consentono l'intera gestione del cluster High Avaliability. 44 MAC-address: è l'indirizzo hardware di ogni interfaccia di rete. E' un numero esadecimale enorme ed univoco e viene utilizzato per indirizzare i pacchetti del protocollo Ethernet. 60 All'interno della suite è presente poi il modulo denominato “heartbeat” (con il primo carattere minuscolo) che si occupa di mandare e ricevere segnali di sincronizzazione attraverso i canali di comunicazione interna predisposti opportunamente. Questo modulo implementa il concetto di “battito del cuore” che è alla base di tutto il cluster per cui se un nodo “muore” l'altro è in grado di accorgersene e comportarsi di conseguenza. 4.3.1 Dati di sincronizzazione interna Attraverso i canali di connessione interna del cluster transitano diversi tipi di dati. In primo luogo e di fondamentale importanza al funzionamento di heartbeat, il canale interno trasporta il segnale di sincronizzazione dei due nodi. Tale segnale consente appunto ad Heartbeat di stabilire se i nodi sono funzionanti e agire di conseguenza. Ovviamente tale segnale è ridondato anche sul canale seriale che, come da schema, è rappresentato da un cavo null-modem collegato sui dispositivi ttyS045 di entrambi i nodi. Sul canale di comunicazione interna transitano altresì i dati necessari alla sincronia degli nbd (network block device). In questo caso la presenza del meccanismo di “channel-bonding” diventa addirittura indispensabile in quanto consente di porre rimedio ad una situazione molto particolare, analizzata nei dettagli nel capitolo dedicato al file-system: quella in cui non ci sia sincronia fra gli nbd a causa di un'interruzione del canale di comunicazione ethernet, questo provoca la caduta del nodo primario, prima della risincronizzazione degli nbd. Tale evento provoca la perdita dei dati o delle modifiche effettuate durante il periodo di erogazione del servizio, senza sincronizzazione dei dati da parte di entrambi i nodi. 45 ttyS0: nella simbologia dei device Unix, con “tty” si identificano tutti i terminali a carattere mentre “S0” rappresenta, nell'insieme di tali terminali, la prima interfaccia seriale. 61 4.3.2 Il fenomeno del brain-splitting Come già accennato a volte può verificarsi, il fenomeno del brain-splitting. Tale fenomeno corrisponde ad una particolare situazione in cui entrambi i nodi, non ricevendo nessun segnale dall’altro nodo, credono di essere rimasti soli nell'erogazione dei servizi. In altri termini ognuno dei due nodi registra la situazione che l'altro nodo è inattivo. In tale malaugurata evenienza la suite Heartbeat provvede ad eseguire il takeover dei servizi erogati su entrambi i nodi, generando una situazione pericolosissima che presenta le seguenti caratteristiche: · su entrambi i nodi vengono impostati gli stessi indirizzi IP sui quali vengono erogati gli stessi servizi: a seconda delle politiche di gestione dell'indirizzamento sulla rete esterna alla quale i nodi sono collegati, si potrebbero verificare effetti indesiderati; · su entrambi i nodi vengono montati in scrittura i dispositivi a blocchi (nbd), causando un irreparabile inconsistenza nei dati. E' evidente, che una situazione del genere va assolutamente evitata. Per poter prevenire il brain-splitting è necessario capire qual'è la causa scatenante. Il motivo per cui si verifica il brain-splitting è l'interruzione del segnale di heartbeat dovuto non alla caduta effettiva del nodo, ma all'interruzione di tutti i canali di comunicazione interna. Per porre rimedio a questa evenienza, ci sono due alternative. La prima, più dispendiosa e più sicura, prevede l'utilizzo di un dispositivo “APC Master”. Su tale dispositivo vengono collegate le prese di alimentazione elettrica dei due nodi in modo da consentire l'interruzione dell'erogazione elettrica con comandi software. 62 Tali comandi sono gestiti dalla suite Heartbeat attraverso l'algoritmo di STONITH (Shoot The Other Node In The Head). Secondo tale algoritmo, ognuno dei due nodi cerca di spegnere l'altro. Chi ci riesce per primo continua ad erogare i servizi. La seconda soluzione, meno dispendiosa, consiste nel ridondare i canali di heartbeat tra i nodi: nel caso in esame lo stato del secondo nodo viene controllato attraverso la porta seriale e il canale interno in “channel bonding”. La scelta va operata in questo ambito su criteri meramente economici rapportati alla probabilità che si verifichino le suddette situazioni. E' ovvio che non esiste un limite matematicamente definito di probabilità nulla al verificarsi di certi eventi: si sta parlando di dispositivi fisici e reali sempre soggetti a malfunzionamenti, per cui non si può affermare che, pur effettuando grossi investimenti in termini di affidabilità, si possa essere certi che tale affidabilità sia sempre garantita. 63 Capitolo 5 L'INSTALLAZIONE E CONFIGURAZIONE DEL FILE-SYSTEM: DRBD Il sistema di memorizzazione dei dati in un elaboratore elettronico costituisce un punto nevralgico dell'intero sistema. E' 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 problemi legati alla gestione. Si pensi ad esempio al fatto che in un cluster ogni nodo deve avere l'accesso agli stessi dati, e gli stessi dati devono essere protetti da accessi contemporanei da parte di più nodi. Inoltre un file-system progettato per sistemi cluster deve 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 throughput46 dei dati, che potrebbero richiedere specifiche particolari, volte ad evitare che il file-system rappresenti il collo di bottiglia di un sistema cluster di grande valore. 5.1 Tipologie di storage Si possono individuare due grosse famiglie o filosofie di supporti di memorizzazione per sistemi cluster, che si differenziano per la dislocazione fisica delle memorie di massa: storage esterni e storage interni. 46 Troughput: 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 64 5.1.2 Storage esterno Questo tipo di storage permette di risolvere subito il problema dell'accesso condiviso ai dati da parte di tutti i nodi. Questi device infatti, sono dispositivi esterni ai quali tutti i nodi del cluster 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. La funzione di protezione dei dati con tecniche di ridondanza e replicazione è gestita internamente al dispositivo di storage, riducendo fra le altre cose il traffico di rete generato dai meccanismi di ridondanza. Lo storage esterno può consentire maggiore efficienza nell'utilizzo dello spazio disco riducendo la frammentazione dei dati. 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: infatti lo storage esterno spesso è realizzato con tecnologie tali da massimizzare questa capacità. Non è pertanto difficile trovare storage esterni, connessi al cluster attraverso connessioni dedicate ad alta velocità facenti uso di fibra ottica o dell'interfaccia “Firewire”47 e spesso costruiti con tecnologia SCSI. Spesso di parla di “SAN” (Storage Area Network) per far riferimento a un insieme di questi dispositivi di storage che si avvalgono di una rete dedicata esclusivamente al traffico dei dati e quindi spesso facente uso di connessioni ad alta velocità per consentire alte prestazioni. Un altra tecnologia usata negli storage esterni è “iSCSI” che sta ad indicare “SCSI su ip” ovvero il device è costruito con tecnologia SCSI basata però sul protocollo di comunicazione IP. Questa tecnologia comunque è ancora in fase di sperimentazione anche 47 Firewire: è il nome dato allo standard di collegamento ad alta velocita 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 di video editing digitale. 65 se promette molto bene per l'ampia diffusione della la rete di comunicazione TCP/IP. Il lato negativo più evidente in queste soluzioni di storage risiede nei costi da sopportare. Tali dispositivi sono infatti molto onerosi in quanto devono sfruttare tecnologie spesso dedicate e a volte proprietarie, per fornire le prestazioni per cui sono costruiti. E' da valutare quindi con molta attenzione se l'esigenza di disporre di dispositivi di questo genere giustifichi l'investimento. 5.1.3 Storage interno e distribuito Quest'altra categoria di storage è invece dedicata più propriamente a cluster HA in quanto la caratteristica di essere “distribuito” consente il recupero dei dati su tutti i nodi del cluster, nel caso in cui uno dei nodi dovesse rendersi momentaneamente non disponibile. In questi sistemi la caratteristica di alta velocità è spesso trascurabile perché un cluster progettato per l'HA 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 del cluster vi possa accedere. Viene così costruito un device astratto che comprende i diversi dischi esportati dai vari nodi e che viene considerato a tutti gli effetti uno storage condiviso. 66 Un file-system così costruito si definisce “file-system parallelo” e presenta il vantaggio più evidente nella suddivisione dei compiti di lettura/scrittura dei dati ai diversi dispositivi presenti. Un altro evidente vantaggio di un filesystem siffatto risiede nell'alta affidabilità, grazie al fatto che questa tecnica può incorporare strategie di ridondanza sui vari dischi basate su RAID, eliminando per altro il “single point of failure” rappresentato dal file system di uno specifico nodo. E' evidente la difficoltà a cui si andrebbe incontro nel caso in cui si decidesse di costruire un cluster senza un file-system appropriato: ogni nodo dovrebbe gestire la sincronizzazione dei dati condivisi e si avrebbero grossi problemi nel rendere affidabile un siffatto sistema. Si pensi ad esempio al recupero dei dati residenti in un nodo del cluster momentaneamente caduto. Le alternative possibili per la realizzazione di un file-system basato su dischi interni sono: • il setup di Network Block Device (NBD) in aggiunta al RAID software, • l'uso della tecnologia DRBD sviluppata esclusivamente per cluster per l'alta disponibilità, • l'uso del file-system GPFS creato da IBM, non OpenSource ma gratuito per enti accademici e praticamente perfetto per sistemi di calcolo intensivo. 5.2 Il file-system utilizzato nel setup: motivi della scelta Per il setup del cluster HA costruito in questa tesi sono state prese in considerazione le diverse alternative menzionate nel paragrafo precedente ma la scelta finale è ricaduta sulla tecnologia DRBD. Prima che fosse creato DRBD, l'alternativa NBD+RAID era la soluzione “Open” più indicata. La combinazione di queste due tecnologie infatti 67 consente di soddisfare le esigenze tipiche di un cluster-filesystem. Il “network block device” infatti è un dispositivo che viene aggiunto ai dispositivi che il kernel gestisce. 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 a tale dispositivo viene pertanto passato attraverso la connessione di rete. Per consentire la replica dei dati necessaria per assolvere alle caratteristiche di disponibilità viene installato il RAID software fra il dispositivo remoto (NBD) e quello locale gestendo poi 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 una replica di NFS48 ma la differenza è radicale e determinante ai fini della disponibilità e della capacità di recupero dei dati. Rispetto a 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 cade 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 richieste 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. 48 NFS: Network File-System. Un server NFS esporta una certa quantità di spazio disco locale per renderlo accessibile a tutti gli host presenti sulla rete i quali possono montarlo come un device locale. 68 Questa tecnologia è stata messa da parte a favore di DRBD, per le caratteristiche più appropriate che questa tecnologia possiede. Altra alternativa che merita menzione e che sicuramente può essere considerata per le sue caratteristiche avanzate è GPFS. Questo file-system è stato sviluppato da IBM e reso disponibile gratuitamente agli ambienti accademici. Viene invece fornito dietro licenza proprietaria per le realtà commerciali. Le caratteristiche che rendono molto 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 infatti usa la tecnica detta di “striping” per consentire l'incremento delle performance che si basa sul fatto che un'operazione di scrittura o successiva lettura viene svolta parallelamente da tutte le unità disco presenti nel file-system in quanto ognuna di esse tratta un frammento diverso dei dati da scrivere o leggere; 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. E' ovvio che una maggiore ridondanza genera maggiore traffico di rete ed anche per questo motivo GPFS è ottimizzato per soluzioni di rete ad alta velocità quali ad esempio “myrinet”. Questo file-system è stato trascurato a favore di DRBD in quanto per un sistema come quello che si è preventivato di creare, le funzioni di GPFS seppur ottime e spesso indispensabili per cluster di grandi dimensioni come quelli dedicati al calcolo intensivo, introducono una complessità non giustificata per un cluster composto da soli due nodi. Si pensi ad esempio allo striping che usato su due nodi si riduce banalmente ad una copia speculare dei dati. Si può ritenere che GPFS sia una soluzione designata per server di complessità elevata e di costi ovviamente più grandi, che giustificherebbero la maggiore laboriosità di GPFS relativamente alle mansioni che tali server dovranno svolgere. 69 Un certo interesse merita inoltre un altro progetto inizialmente proprietario sotto licenza Sistina e da poco diventato “open” che va sotto il nome di “OpenGFS”. Presenta anch'esso alcune caratteristiche avanzate come GPFS ma è ottimizzato in special modo per dispositivi di tipo SAN comunque non pertinenti con l'hardware in uso in questo setup. In definitiva, si potrebbe trarre la stessa conclusione data per GPFS in merito al rapporto fra complessità e funzionalità fornite e al limite, quando tali funzionalità diventassero indispensabili, sarebbe comunque preferibile GPFS vista la sua maturità e il supporto IBM. Ci sarebbe qualcosa in più da considerare quando l'ambiente di applicazione non fosse più accademico per cui si rende necessario l'acquisto della licenza IBM. Si è in sostanza ritenuto che DRBD, poiché ideato esclusivamente per risolvere i problemi affrontati dai cluster per l'alta disponibilità, rappresenti il miglior compromesso fra semplicità e funzioni implementate. Ancora, la completa integrabilità di DRBD con la suite Heartbeat è una caratteristica fondamentale per far sì che la gestione del file-system sia completamente automatizzata. Altra caratteristica favorevole all'uso di DRBD consiste nel ridotto calo di performance che introduce. Tutte queste particolarità saranno meglio evidenziate nei paragrafi successivi in cui verranno presentate nei dettagli le caratteristiche di DRBD e un'analisi approfondita delle performance. 5.3 DRBD: caratteristiche e peculiarità DRBD è l'acronimo di Distributed Replicated Block Device. Sviluppato da Philipp Resiner è attualmente disponibile nella versione 0.6. E' rilasciato nei termini della licenza GPL e quindi liberamente distribuibile e modificabile a partire dal codice sorgente. 70 Drbd è un dispositivo a blocchi creato esclusivamente per risolvere problemi tipici inerenti cluster in alta disponibilità. Si basa sul meccanismo della replicazione dei dati fra due dispositivi a blocchi residenti su due nodi differenti, attraverso una connessione di rete privata. Semanticamente il funzionamento è simile al RAID-1 attuato però fra dispositivi remoti [4]. In parole povere Drbd si prende carico di copiare attraverso la rete i dati scritti sul block device locale anche sul corrispondente block device remoto. Su un sistema così composto, che lavora in maniera trasparente ai livelli superiori si può installare il file-system vero e proprio (ext3), quindi un filesystem journaled,49 che fornisce capacità di ripristino molto rapide evitando il controllo di consistenza dei dati al riavvio (fsck su ext250 ). 5.3.1 Funzionamento di DRBD Il modulo kernel di Drbd presente su un nodo del cluster HA, lavora in stretta sincronia con il modulo presente sull'altro nodo. Il file di configurazione, esposto più avanti, è infatti identico su entrambi i nodi. Nel momento in cui si decide di costituire un block-device basato su Drbd, ognuno dei due nodi mette a disposizione una partizione del proprio disco locale che ovviamente non va montata automaticamente attraverso /etc/fstab51. Leggendo il proprio file di configurazione /etc/drbd.conf, ogni copia di Drbd presente sui nodi imposta la partizione fisica ivi specificata, a far parte del block-device /dev/nbd/X e attraverso il canale di comunicazione privata che 49 Filesystem Journaled: la caratteristica Journaled di un file-system fornisce la capacità di evitare inconsistenze nei dati in quanto tutte le modifiche apportate vengono tracciate e memorizzate così in caso di spegnimento accidentale del sistema o crash, al successivo montaggio del file-system, il sistema operativo è in grado di ripristinare lo stato consistente dei dati annullando le operazioni non completate prima del blocco. 50 Ext2: file-system storico usato sulla gran parte delle installazioni Linux prima della creazione di ext3 che ne rappresenta la diretta evoluzione con la sola aggiunta del journaling. 51 fstab: Per i dettagli inerenti le partizioni dei nodi che si sono installati vedere la tabella 1 a pagina 18 71 nel setup corrente è il channel-bonding fra eth1 ed eth2, si sincronizza con il modulo Drbd presente sull'altro nodo che esegue le stesse operazioni. A questo punto è disponibile il block-device /dev/nbd/X sul 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 in quanto va inizializzato e poi montato dopo aver creato su di esso il file-system scelto. L'inizializzazione del block-device /dev/nbd prevede l'assegnazione ad uno dei due nodi la capacità di scrittura. Con Drbd infatti solo un nodo per volta è in grado di scrivere sul block-device per evitare inconsistenze negli accessi agli stessi dati da parte dei due nodi. Per questo motivo rispetto a un dato blockdevice, ogni nodo può assumere il ruolo di 'primary' se possiede la capacità di scriverci, 'secondary' se tale capacità non gli è accordata. Come si vedrà più avanti è compito di Heartbeat stabilire i ruoli negli accessi ai block-device. Se un nodo è 'primary', avrà la capacità di modificare il contenuto del blockdevice e il modulo Drbd si occuperà di trasferire e replicare tali modifiche anche sull'altro nodo comunicando attraverso la rete privata. Le modifiche saranno quindi replicate sulla partizione che il nodo 'secondary' ha ceduto per far parte del block-device Drbd. Tutto ciò avviene in modo del tutto trasparente e a livello utente non si ha la possibilità di entrare nel merito della gestione delle partizioni cedute al blockdevice: in effetti il tentativo di montare tali partizioni manualmente produce errori di grave entità che coinvolgono la perdita di sincronizzazione fra i due nodi e gravi possibili inconsistenze nei dati. 72 Se durante le normali operazioni il nodo primario cade, Heartbeat si accorge della situazione e rende primario l'altro nodo montando quindi il block-device su quest'ultimo. Quando il nodo caduto rientra nel cluster il modulo Drbd ivi residente si accorge di aver perso la sincronizzazione e prima che possa permettere la riammissione nel cluster sincronizza i suoi dati con quelli che nel frattempo l'altro nodo ha scritto. Il servizio supportato dal block-device che ha attraversato tutta questa situazione non subisce comunque interruzioni di sorta in quanto tutte le fasi di recupero sono gestite in background. 5.3.2 Specifiche software di DRBD Drbd è costruito come un modulo kernel che rende disponibili speciali blockdevice chiamati NBD che possono essere gestiti in modo tale da garantire le seguenti funzionalità: · Nessuna perdita di dati in caso di errori su di un nodo. · Capacità di aggiunta di un nodo ripristinato senza interruzione del servizio. · Capacità di avvio del sistema senza intervento dell'amministratore. · Possibilità di avviare un cluster degradato52 senza intervento dell'amministratore. La possibilità di non avere perdite di dati in caso di errori sui nodi è sicuramente un requisito indispensabile ai fini della disponibilità di un servizio perché l'erogazione di un servizio è basata anche sui dati relativi all'ambiente 52 Cluster degradato: un cluster con un solo nodo funzionante. L'altro è in fase di sincronizzazione o non è disponibile. 73 in cui il server è inserito. Ci sono comunque casi particolari in cui si è disposti a pagare qualcosa in termini di capacità di recupero a fronte di un incremento di performance. La stretta correlazione di Drbd con server per l'alta disponibilità è evidenziata inoltre dalla possibilità di far rientrare un nodo nel cluster senza la necessità di dover riavviare o sospendere l'erogazione del servizio. Questo requisito è soddisfatto grazie alle procedure in background che vengono eseguite sul nodo che eroga fisicamente in quel momento il servizio attraverso le quali il nodo secondario riesce di nuovo a sincronizzarsi e rendersi disponibile come nodo in standby. Altre funzionalità di monitoraggio riescono poi a fornire al cluster un certa autonomia per alcune decisioni riguardanti la fase di avvio. L'avvio infatti presenta il problema di stabilire quale dei nodi ha i dati aggiornati quando si è precedentemente persa la sincronizzazione e Drbd è in grado di stabilirlo senza l'intervento dell'utente. Ancora, se il cluster era già degradato la ripartenza dello stesso deve avvenire ancora in modalità degradata senza intervento dall'esterno. 5.3.3 I protocolli di sincronizzazione Drbd è basato sul 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 e integra nelle sue specifiche, funzionalità di riordinamento dei pacchetti e il controllo di flusso. Queste caratteristiche rendono possibile la dislocazione remota dei due nodi per consentire capacità di recupero dati estreme che possono coprire fino all'ultimo livello di disponibilità che prevede il disaster-recovering attraverso la dislocazione geografica della ridondanza. Il collegamento fra i due nodi può essere reso più o meno interdipendente considerando la stabilità dell'hardware in relazione all'affidabilità che si vuole ottenere. Vengono allo scopo utilizzati tre 74 protocolli che incorporano delle caratteristiche che regolano il funzionamento di Drbd[4]. · Protocollo A: questo metodo di connessione fra i due nodi consente il massimo grado di indipendenza. Se il nodo primario esegue un'operazione di I/O53, invia al secondario il comando di eseguire la stessa operazione. Non appena termina la scrittura sul proprio dispositivo locale, il nodo primario invia al suo sistema operativo il segnale di aver terminato l'operazione senza considerare ciò che è avvenuto sul secondario. Naturalmente questo protocollo non soddisfa il primo requisito specificato nel paragrafo 5.3.2, in quanto, se il primario va in crash dopo aver segnalato il termine di una scrittura ma prima che il secondario abbia effettivamente ricevuto tutti i dati concernenti l'operazione di scrittura, la replica dei dati non sarà affatto speculare ed in effetti si verificherà una perdita di dati. A volte comunque questo protocollo può rendersi necessario nei casi in cui il collegamento di rete interno presenti un'elevata latenza. Se non ci fosse il protocollo A, il nodo primario dovrebbe attendere il segnale di termine delle operazioni di sincronizzazione attraverso la rete e ciò pregiudicherebbe l'efficienza computazionale del 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 differenza che il nodo primario segnala al proprio sistema operativo (attraverso il quale una 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 riceve il comando di scrittura che provvederà successivamente ad eseguire. In effetti, pur fornendo una certa sicurezza in più, il protocollo B 53 I/O: Forma abbreviata per indicare Input-Output. Generalmente si riferisce a operazioni eseguite sulle memorie coinvolgenti flussi di dati in input o in output. 75 è una via di mezzo fra A e C (quest'ultimo infatti garantisce la massima 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 è inviato solo quando il nodo secondario comunica di aver terminato la sua operazione di scrittura, quando cioè 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 al tempo di latenza del sistema di connessione di rete necessario al trasporto dei segnali di sincronizzazione delle operazioni eseguite. 5.3.5 Algoritmi di gestione dei blocchi Normalmente i moderni file-system journaled (così come i DBMS54) proteggono i propri dati in modo tale da riportarli in uno stato consistente in seguito ad una operazione errata o alla sospensione anomala di un'operazione di I/O. Come già specificato un file-system si definisce “journaled” proprio perché fornisce questa capacità che è implementata utilizzando un “giornale” in cui vengono memorizzate temporaneamente le modifiche apportate recentemente al file-system in modo tale da permettere l'annullamento di 54 DBMS: Acronimo di DataBase Management System e si riferisce al motore di gestione di una base di dati 76 operazioni parzialmente compiute prima di una sospensione anomala dell'attività del sistema [6]. Nei DBMS le operazioni di modifica vengono raggruppate in “transazioni” e la scrittura effettiva delle modifiche avviene solo a transazione compiuta, per cui un errore che si verifichi durante le modifiche intermedie, non viene memorizzato fisicamente e i dati rimangono sempre consistenti. DRBD deve in ogni caso preservare la consistenza dei dati soprattutto nella previsione che il funzionamento del file-system potrebbe fermarsi in modo anomalo per un motivo qualunque. Praticamente il protocollo C non presenta questo problema, in quanto le operazioni di scrittura avvengono in maniera sincrona su entrambi i nodi. I problemi si presentano quando, usando i protocolli A e B, la scrittura di un blocco su disco è necessaria per poter scrivere un blocco successivo. Tale informazione sulla dipendenza fra i blocchi nelle operazioni di scrittura è conosciuta solo dall'applicazione che sta eseguendo l'I/O e quindi il sistema operativo non può conoscerlo. Inoltre essendo Linux un moderno sistema operativo, implementa lo scheduler di I/O per le operazioni sulle memorie di massa in modo tale da ottimizzare la velocità di I/O, organizzando opportunamente la lista di operazioni da compiere, in modo tale da minimizzare lo spostamento della testina di lettura/scrittura. DRBD tuttavia risolve il problema della dipendenza di scrittura fra i blocchi e consente anche di utilizzare le ottimizzazioni derivanti dall'utilizzo dello scheduler del file-system attraverso l'implementazione di barriere di scrittura che consentono al nodo secondario di mantenere i dati sempre in una forma consistente [4]. Il funzionamento di tali barriere consiste nel determinare in sede del nodo primario, l'esistenza di eventuali dipendenze di scrittura fra i blocchi da trasferire al nodo secondario e, se qualche dipendenza esiste prima di inviare i 77 blocchi indipendenti, viene impostata la barriera di scrittura immediatamente prima dei blocchi dipendenti e inviati quindi i blocchi non dipendenti e la barriera. Il nodo secondario, attraverso l'utilizzo dello scheduler, dispone momentaneamente in memoria i blocchi da scrivere per riordinarli opportunamente secondo le disponibilità del suo sistema di memorizzazione. Appena riceve la barriera di scrittura, il nodo termina l'operazione di caching ed ordinamento ed esegue la scrittura senza attendere altri blocchi che saranno ovviamente dipendenti da quelli appena ricevuti e che vanno scritti per primi. 5.3.6 Cambio dei ruoli fra i nodi Il cambio dei ruoli che i nodi assumono rispetto a un Drbd block-device si verifica in caso di crash del nodo primario o rientro nel cluster del nodo che precedentemente era primario. Ovviamente nel secondo caso l’amministratore del sistema deve guidare il processo, per cui il software di gestione del cluster si limita semplicemente ad eseguire i comandi; nel primo caso invece la caduta del nodo primario richiede che il sistema di gestione del cluster prenda autonomamente la decisione di cambiare i ruoli dei nodi, consentendo al secondario di apportare al block-device le modifiche necessarie affinché l'applicazione continui il suo funzionamento. Nel caso di crash sul nodo secondario, il nodo primario continua il suo funzionamento ma è necessario che Drbd memorizzi tutte le modifiche che avverranno fino al ritorno del secondario per poter successivamente sincronizzare solo i dati modificati in tale periodo. Secondo i protocolli A e B il nodo primario memorizza la “storia” dei blocchi che ha comandato di scrivere al secondario finchè quest'ultimo non comunica di averli effettivamente scritti. 78 Al crash del nodo secondario dunque vengono inclusi fra i blocchi modificati anche quelli presenti nella “storia” in modo tale da non lasciare dati inconsistenti sul nodo secondario. Questo tipo di sincronizzazione viene definita “quick synchronization” [4] in quanto la sincronizzazione coinvolge solo alcuni blocchi. Se i dati relativi alle modifiche recenti che il primario possiede per qualche ragione non dovessero essere applicabili, (perché ad esempio nel frattempo il device sul nodo secondario è stato modificato dall'esterno), si rende necessaria la “full synchronization” che invece coinvolge tutti i blocchi del dispositivo e richiede una quantità di tempo abbastanza elevata anche perché in questo processo non è possibile utilizzare lo scheduler del file-system. Quest'ultima peculiarità trova la sua ragione nel fatto che, per soddisfare il secondo requisito del software Drbd (che il cluster continui a funzionare pur se in maniera degradata anche durante la fase di aggiunta di un nodo) i diversi blocchi del dispositivo possono essere modificati durante il processo di sincronizzazione. Si potrebbe verificare una situazione in cui l'operazione di lettura eseguita dal codice di sincronizzazione sul primario, possa essere richiesta prima della eventuale scrittura dello stesso blocco a causa dei meccanismi di caching e ottimizzazione forniti dallo scheduler del file-system. Ovviamente questo caso genererebbe inconsistenza fra le due repliche dei dati. Nel caso di crash sul nodo primario invece, utilizzando il protocollo A o B, si potrebbe verificare la perdita dei dati che il nodo caduto stava scrivendo nel momento precedente al crash. Il secondario termina le operazioni di scrittura che erano ancora eventualmente pendenti ma potrebbe non aver traccia dei dati modificati successivamente sul primario e non ancora ricevuti. In questo caso infatti alla successiva riconnessione del nodo caduto la sincronizzazione avverrà sulla base dei dati contenuti nel nodo che era secondario. 79 Normalmente in fase di boot del sistema Drbd assegna il ruolo primario al nodo che contiene i dati aggiornati e il ruolo secondario al nodo che deve essere sincronizzato. Tali ruoli sono però controllati anche dal software di gestione del cluster nel quale potrebbero essere impostati in modo inverso. Per far fronte a questo problema solitamente si avvia il gestore del cluster, Heartbeat, solo dopo l'avvenuta sincronizzazione dei dati da parte di Drbd. 5.3.7 Decisioni in fase di riavvio Pur non essendo un tema legato all'alta disponibilità la quale non ammette interruzione totale di un servizio, in termini pratici un riavvio totale dell'intero cluster potrebbe verificarsi più o meno frequentemente specie nei sistemi di nuova installazione o in assenza di una adeguata politica di gestione della alimentazione elettrica con gruppo di continuità e gruppo elettrogeno. Un evento simile avrebbe forti ripercussioni sulla sincronizzazione dei dati e la loro relativa consistenza per cui Drbd è progettato anche per far fronte a tale evenienza che dovrebbe per altro essere evitata con ogni mezzo. Le situazioni che si possono verificare durante il crash del sistema e durante il suo riavvio sono le seguenti: • I nodi del cluster cadono contemporaneamente. In questa situazione il sistema è in grado di stabilire quale dei due nodi possiede i dati più aggiornati stabilendo quale era primario prima del crash. Per far ciò nel momento in cui un nodo assume il ruolo di primario viene settato su di esso un flag detto “primary indicator”. Tale flag determina in fase di avvio il nodo con i dati più aggiornati. • Il nodo secondario è già non disponibile al momento del crash. In questo caso dovendo riavviare il sistema, Drbd si affida ancora al “primary indicator” per stabilire il nodo con i dati più aggiornati. 80 • Il nodo primario è caduto prima del riavvio. In questa situazione, il secondario è stato portato a primario quindi al riavvio entrambi i nodi hanno il primary indicator settato. Per riuscire anche in questo caso a stabilire il nodo più aggiornato si usa un contatore definito “unconnectedcounter”. Ogni volta che un nodo cambia ruolo, quando l'altro nodo non è presente viene incrementato il contatore. Al riavvio viene testato prima tale contatore e viene stabilito che il nodo più aggiornato è quello col valore più alto. Se tale valore è uguale si passa a testare anche il primaryflag. • La connessione di rete interna è interrotta al momento del riavvio. Questa situazione porta, al fenomeno dello split-brain. Nel caso di questo sistema dato che il segnale di sincronizzazione viaggia sia su LAN che su seriale, la situazione citata si realizza solo nella ipotesi che siano disconnessi entrambi i canali. In tale ipotesi succede che al riavvio, dopo aver riconnesso i canali, il nodo selezionato come il più aggiornato è sempre il secondario in quanto appena si interrompe la connessione al nodo secondario risulta che il primario è caduto quindi il sistema di gestione del cluster provvede a cambiare il ruolo del secondario in primario così facendo però viene incrementato automaticamente da Drbd anche il contatore unconnected-counter per cui al riavvio esso risulta il più aggiornato ma in effetti non è necessariamente così. Drbd usa allora un altro contatore definito “connected-counter” che viene incrementato se il ruolo di un nodo rispetto ad un dato dispositivo a blocchi condiviso, cambia quando la connessione è attiva. Il contatore inoltre viene incrementato sul nodo primario anche quando quest'ultimo perde il contatto dell'altro nodo ed è il caso in questione, per cui al riavvio vengono testati nell'ordine connected-counter, unconnected-counter, primary-indicator, per far fronte a tutte le problematiche sopra esposte. • Riavvio in modalità degradata. Al riavvio del cluster i moduli di Drbd presenti su entrambi i nodi si mettono in ascolto reciproco bloccando il 81 normale startup del sistema finché non riescono a collegarsi. Spesso però può rendersi necessario riavviare un cluster che era già in modalità degradata (solo un nodo realmente funzionante) ma se Drbd rimanesse in ascolto dell'altro nodo la fase di startup non terminerebbe mai. Per consentire un avvio del cluster in modalità degradata viene pertanto utilizzato un timeout definito “startup-timeout” che inizia il suo count-down se si verificano le seguenti condizioni: il connection indicator non è settato e ciò significa che i due nodi non erano connessi prima del riavvio; il flag primary indicator è settato e ciò dimostra che il nodo aveva il ruolo di primario prima del riavvio. Queste condizioni dimostrano che il nodo stava già funzionando in modalità degradata per cui se entro lo startuptimeout, l'altro nodo non risponde, il nodo primario si avvia ugualmente. • Un nodo non riesce a riavviarsi. Se durante un riavvio del cluster precedentemente funzionante, si verifica un problema su di un nodo in fase di avvio, l'altro nodo rimane in ascolto presentando tuttavia all'utente la possibilità ti forzare l'avvio come primario. Se ciò accade il nodo funzionante viene quindi avviato come primario. Al successivo riavvio del nodo non funzionante, questo potrebbe prendersi il ruolo di primario considerando i meta-dati impostati in merito ad un certo block-device. Per evitare questa situazione, viene impostato, in caso di intervento umano al riavvio, un contatore definito human interventio counter che assume priorità massima rispetto a tutti i meta-dati descritti fin'ora ed evita che il nodo precedentemente non funzionante possa divenire subito primario senza che venga effettuata prima la sincronizzazione. • Caduta di un nodo in fase di sincronizzazione. Se una tale evenienza accade viene settato il flag che fra i meta-dati di un block-device ha la priorità massima. Esso è definito consistency-flag e viene mantenuto attivo finché il processo di sincronizzazione non termina. Qualsiasi sia il valore degli altri meta-dati e dunque, qualunque sia lo stato del sistema, se il 82 consistency-flag è impostato, il nodo deve subire il processo di sincronizzazione. 5.4 Performance Nel sistema in alta disponibilità che si sta costruendo, le performance legate alla gestione dei dati non sono determinanti, in quanto il flusso dei dati che si prevede di dover gestire non è elevato. Tuttavia per un'analisi completa del software Drbd è bene analizzare anche questo aspetto per consentire una migliore valutazione del sistema nel caso si volessero apportare modifiche successive alla configurazione dei gruppi di servizi, attivi sul cluster. Dai dati reperiti sul sito ufficiale del progetto, www.drbd.org, si è appreso che le performance di Drbd sono differenti a seconda della versione del kernel che si utilizza. In particolare il kernel della serie 2.2.x fornisce prestazioni inferiori in quanto Drbd non ne è parte ma si interfaccia ad esso come livello intermedio fra le applicazioni e il kernel stesso, introducendo un overhead computazionale. Drbd nel kernel 2.2.x utilizza metà degli slot del sistema operativo che gestiscono le operazioni di input-output; la rimanente parte è lasciata all'uso generico dello scheduler locale del file-system. Il kernel 2.4 invece, incorporando Drbd ottimizza la gestione delle risorse legate all'input-output dei dati generando una perdita non rilevante nelle performance dal punto di vista dell'overhead computazionale. E' ovvio che la differenza di performance dovuta alla replicazione dei dati attraverso la connessione interna fra i nodi è comunque evidente. Nel sistema in esame, il kernel appartiene alla versione 2.4.x per cui il problema legato all'overhead computazionale non è significante. 83 E' stato comunque eseguito un test approfondito sulle performance di Drbd, facendo uso di un software per il benchmark del file-system che verrà descritto successivamente e che mette in evidenza le caratteristiche di Drbd. 5.4.1Software di benchmark I/O: iozone iozone è un software open-source gratuito che consente di eseguire un numero di test esaustivi sule performance del file-system in relazione alle diverse esigenze che si potrebbero presentare. Fra i diversi strumenti analoghi ad iozone è stato preferito quest'ultimo per il fatto che presenta una maggiore completezza; in particolare ha la possibilità di emettere i risultati in formato tabellare facilmente importabili all'interno di fogli elettronici e successivamente utilizzabili per creare grafici tridimensionali in grado di rendere immediatamente visibile l'entità delle caratteristiche del file-system. Verranno pertanto presentati e commentati i diversi grafici ottenuti in relazione ad ogni tipo di test effettuato. La riga di comando utilizzata per lanciare il test è stata la seguente: iozone -Razb output.wks -g 2G -S 512 -i 0 -i 1 -i 2. Questo comando è stato impartito nelle diverse configurazioni del file-system e cioè: sul file-system ext3 residente in una partizione locale, sia sul file-system ext3 montato però su un block-device Drbd ed eseguito per ogni protocollo di Drbd. In tutto il test è stato eseguito per quattro volte. Dalla riga del comando impartito si evidenziano le opzioni e i test che sono stati richiesti a iozone. 84 L'opzione -R consente in output un file binario direttamente utilizzabile in Microsoft Excel55. L'opzione -a imposta la modalità di test automatica. Iozone si preoccuperà pertanto di eseguire tutti i test per tutte le combinazioni possibili di grandezza dell'unità di scrittura (record-size), variabile fra 4 kilobyte (KB) e 16 megabyte (MB), e grandezza del file, variabile da 64KB a 2GB. L'opzione -z usata in abbinamento al modo automatico, consente di forzare l'esecuzione del test con piccoli record-size anche sui file di grandi dimensioni. Generalmente la modalità automatica evita di eseguire anche questi test, ma per completezza si è deciso di includerli. L'opzione -g 2G sta ad indicare la grandezza massima del file da scrivere su disco su cui eseguire i test. E' stato impostato un valore di due Gigabyte per riuscire a testare il sistema di memorizzazione senza l'ausilio dei meccanismi di caching effettuati in memoria RAM dal sistema operativo. E' stato scelto dunque tale valore perchè pari al doppio della quantità di RAM installata. L'opzione -S notifica ad iozone la quantità di memoria cache L1 installata nella CPU. Questa informazione consente di calibrare opportunamente i test. Le opzioni -i identificano le tipologie di test che si intendono eseguire ed in particolare: • -i 0 esegue un test write/re-write che consente di misurare le performance in caso di scrittura e ri-scritturadi blocchi sequenziali. • -i1 esegue test di read/re-read che misura òe prestazioni per letture e riletture sequenziali. • 55 -i2 esegue invece test di lettura e scrittura casuale. Microsoft Excel: Programma proprietario con licenza commerciale Microsoft che implementa il foglio elettronico facente parte della suite Microsoft Office. 85 5.4.2 I risultati del test iozone iozone ha prodotto ogni volta che è stato eseguito un file in formato binario per Microsoft Excel. Tuttavia i risultati così ottenuti sono stati analizzati con la suite Open Office in grado di aprire e convertire i file della nota suite Microsoft nel proprio formato. I dati ottenuti, in formato tabellare sono stati poi utilizzati per creare i grafici riassuntivi mostrati di seguito e opportunamente commentati. Ognuno dei grafici presentati mostra sull'asse denominato “file size KB”, le dimensioni della grandezza espressa in kilobyte, del file utilizzato per il test; sull'asse denominato “block size KB”, la grandezza dei blocchi di dati utilizzati per le operazioni di lettura o scrittura del file; sull'asse denominato “Performance KB/sec”, la misura in kilobyte per secondo, della performance del file-system analizzato, in funzione dei due parametri precedenti. 5.4.3 Test di scrittura Vengono analizzate adesso le performance dei file-system in merito all'operazione di scrittura. Tale operazione riguarda la scrittura del file di test, su locazioni sequenziali. 86 ext3 writer report 1000000 4 8 16 32 64 128 100000 256 Performance KB/sec 512 1024 2048 4096 8192 16384 4096 32768 262144 File size KBlocale Illustrazione 2: writer report, ext3 su block-device 2097152 4 16 128 2048 10000 64 256 1024 Block size KB Come si evince dall'illustrazione 2, le performance tipiche del file-system ext3 si aggirano mediamente sui 100 megabyte per secondo. E' un risultato di tutto rispetto considerando che si stanno utilizzando dischi EIDE e tale valore è molto vicino al limite teorico del canale EIDE. Tuttavia sono doverose alcune precisazioni. Il valore medio riscontrato è ottenibile soltanto quando la grandezza del file che si sta scrivendo non supera i 500 megabyte ed è dovuto al fatto che fino a tale valore il sistema operativo fa largo uso dello scheduling delle operazioni su disco mantenendole in un buffer in memoria centrale. La memoria RAM infatti è ampia 1 gigabyte e con tale disponibilità, il sistema operativo può facilmente gestire l'intera operazione di I/O all'interno del buffer riservato al caching del file-system. E' evidente che fino a tale soglia le prestazioni del file-system non sono indicative delle prestazioni dei dischi fisici in quanto non coinvolgono operazioni di lettura/scrittura eseguite direttamente su disco. I valori più interessanti che rivelano le potenzialità effettive del sistema di memorizzazione sono quelli misurati dopo la soglia di caduta delle prestazioni, dove la grandezza del file di test è tale da non permettere l'utilizzo delle ottimizzazioni dovute al sistema operativo. Come si 87 vede quindi le performance reali di scrittura diretta su disco sul file-system ext3 si aggirano mediamente intorno al valore di 14 megabyte per secondo. drbd protA writer report 1000000 100000 performance KB/sec 1000 64 256 2048 16384 131072 2097152 file size KB 4 16 256 4096 10000 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 Block size KB Illustrazione 3: Writer Report con DRBD protocollo A L'illustrazione 3 mostra le performance di scrittura con file-system ext3 montato su un Drbd block-device configurato con protocollo A. Anche qui valgono le stesse considerazioni fatte per ext3 su block-device locale. Le prestazioni medie si aggirano ancora sui 100 megabyte per secondo ed anche qui troviamo la soglia di caduta delle prestazioni in prossimità delle dimensioni del file di test intorno ai 500 megabyte dovuta ancora alla cache del sistema operativo. Le prestazioni reali, registrate dopo la soglia di caduta delle prestazioni, sono sensibilmente più basse di quelle registrate sul block-device locale per via della gestione della replica dei dati che Drbd introduce ad ogni operazione di scrittura. Per soddisfare tale protocollo l'operazione di scrittura termina dopo aver inviato i dati da replicare sull'altro nodo. 88 Le prestazioni reali medie si aggirano dunque mediamente intorno ai 2,8 megabyte per secondo. drbd protoB writer report 1000000 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 100000 performance KB/sec 1000 64 256 1024 4096 32768 262144 file size KB 2097152 4 16 128 2048 10000 Block size KB Illustrazione 4: Writer Report con DRBD protocollo B Stesse considerazioni anche per il file-system ext3 montato su Drbd blockdevice configurato con protocollo B. Si nota ancora la soglia di caduta delle prestazioni intorno alla grandezza del file di test di 500 megabyte, le prestazioni con cache del sistema operativo sono ancora misurate intorno ai 100 megabyte per secondo, mentre le prestazioni reali si attestano ancora intorno ai 2,8 megabyte per secondo. La differenza fra Drbd con protocollo A e protocollo B è praticamente inesistente: infatti l'unica differenza fra le specifiche del protocollo A e le specifiche del protocollo B riguarda il messaggio di “ricevuto” che il secondario invia al primario dopo aver ricevuto un comando di scrittura. Tale messaggio arriva quasi istantaneamente per due motivi: innanzitutto la rete di connessione interna ai nodi ha un'ampiezza di banda tale da non costituire un collo di bottiglia per le operazioni svolte durante il test; inoltre il nodo 89 secondario non sta eseguendo altri processi “time consuming” che potrebbero ritardare l'esecuzione delle operazioni richieste da Drbd. drbd protoC writer 1000000 4 8 16 32 100000 64 128 256 Performance KB/sec 512 10000 1024 2048 4096 2048 16384 262144 4 16 256 4096 8192 1000 64 256 File size KB 16384 Block size KB Illustrazione 5: Writer Report con DRBD protocollo C La differenza principale delle performance col protocollo C rispetto ai due precedenti protocolli è un risultato inatteso sulle performance reali, dopo la soglia di caduta. Il valore medio è circa di 9 megabyte per secondo e certamente questo è un valore inatteso in quanto a causa delle specifiche più restrittive di tale protocollo, le quali prevedono che il primario termini un'operazione di scrittura solo quando il secondario ha comunicato a sua volta di averla materialmente terminata, ci si aspettava che le performance in questo caso fossero peggiori. Tuttavia questo non causa perdite di dati e non compromette l'affidabilità di tale protocollo, secondo quanto specificato dagli sviluppatori di Drbd per i quali questo comportamento rappresenta oggetto di indagine. Si osservi che comunque esiste un calo delle performance rispetto alla scrittura diretta su ext3 valutabile intorno al 30%. 90 5.4.4 Test di ri-scrittura Verranno ora considerate le operazioni di ri-scrittura. Le performance vengono misurate quando l'operazione di scrittura viene ripetuta una seconda volta. In questa analisi si mette in evidenza l'influenza della cache del disco, che conserva in memoria, da dove quindi li recupera per la successiva operazione di scrittura, i dati appena scritti. ext3 re-writer report 1000000 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 100000 10000 64 256 1024 4096 32768 262144 File size KB 2097152 4 16 128 2048 Perfromance KB/sec Block size KB Illustrazione 6: Re-Writer Report con ext3 locale 91 drbd protoA Re-writer report 1000000 100000 performance KB/sec 1000 64 256 1024 4096 32768 262144 2097152 4 16 128 1024 16384 10000 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 block size KB file size KB Illustrazione 7: Re-Writer Report con Drbd protocollo A drbd protoB Re-writer report 1000000 4 8 16 32 64 128 256 100000 512 1024 2048 performance KB/sec 1000 64 256 1024 4096 32768 262144 file size KB 2097152 4 16 128 1024 16384 10000 4096 8192 16384 Block size KB Illustrazione 8: Re-Writer Report con DRBD protocollo B 92 drbd ProtoC re-writer report 1000000 4 8 16 32 64 100000 128 256 512 Performance KB/sec 1024 2048 Illustrazione 9: Re-Writer Report con Drbd protocollo C 1048576 File size KB 2097152 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1000 4 16 256 4096 10000 4096 8192 16384 Block size KB Come mostrato nelle illustrazioni 6, 7, 8 e 9 le performance di un'operazione di riscrittura sono molto superiori di quelle di scrittura a causa del pieno utilizzo delle ottimizzazioni sulle operazioni di I/O operate dal sistema operativo. I valori medi si attestano intorno ai 450 megabyte per secondo e si notano inoltre gli effetti del caching dati operato dal processore, che causa i picchi nel grafico visualizzato, quando si ottimizzano le dimensioni dei blocchi dei dati scritti, rispetto all'ampiezza della linea di cache della CPU. Come al solito si verifica la caduta delle performance in corrispondenza della stessa soglia evidenziata per le operazioni di scrittura, dopo la quale i valori reali delle performance di I/O ritornano ad essere gli stessi ottenuti dall'operazione di scrittura e cioè: circa 15 megabyte per secondo per il filesystem montato su block-device locale; circa 2,8 megabyte per secondo su Drbd block-device con protocollo A e protocollo B; circa 10 megabyte per secondo con Drbd block-device configurato con protocollo C. 93 5.4.5 Test di lettura Il test che si analizza adesso riguarda operazioni di lettura sequenziale su file di test. Come si vedrà l'operazione di lettura non grava sulle prestazioni del file-system quando eseguita su device Drbd in quanto Drbd esegue localmente le operazioni di lettura. Le prestazioni quindi, considerando il filesystem montato su device locale o su Drbd con i tre diversi protocolli di sincronizzazione, sono in linea di massima paragonabili. reader report 10000000 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 1000000 Performance KB/sec 10000 64 256 1024 4096 32768 262144 File size KB 2097152 4 16 128 2048 100000 Block size KB Illustrazione 10: Reader Report Anche qui si nota la soglia di caduta delle prestazioni quando il file di test supera i 512 megabyte e in media le prestazioni reali del sistema, nelle operazioni di lettura, fanno registrare un rate di 40 megabyte per secondo. Interessante in questo test è notare l'effetto dovuto alla cache del processore che per le operazioni di lettura viene ottimizzata al massimo. Essendo infatti il kernel ricompilato su ogni macchina, è stato ottimizzato per la CPU installata. Il kernel dunque ottimizza la lettura da disco richiedendo al controller EIDE di leggere un quantitativo di dati pari ad una linea di cache per ogni 94 operazione di lettura. Essendo poi un test effettuato con lettura sequenziale, i dati da dover leggere successivamente sono già presenti in cache per cui non è necessario accedere di novo al canale EIDE. Questo tipo di ottimizzazione è proficua solo quando i blocchi di dati da leggere hanno dimensioni inferiori a 512 Kilobyte che rappresenta l'ampiezza della memoria cache del processore. 5.4.6 Test di ri-lettura Il test di ri-lettura misura le performance del file-system in corrispondenza di una lettura successiva a dati già letti. Questo test mette in evidenza l'effetto della cache di primo livello che agisce maggiormente in corrispondenza di file di test di piccole dimensioni e ampiezza dei blocchi letti molto ristretta. In queste condizioni il grafico relativo mostra un picco abbastanza evidente. Tuttavia le prestazioni ottenute dopo la soglia di caduta, come già detto dovuta all'impossibilità di applicare gli algoritmi di ottimizzazione del kernel, sono leggermente più basse dei risultati ottenuti con la singola lettura appunto perchè l'operazione richiede che la testina di lettura ritorni indietro ogni volta (dopo la soglia di caduta infatti la cache non ha più effetto). 95 re-reader report 10000000 1000000 Performance KB/sec 10000 64 256 2048 16384 262144 File size KB 4 16 256 4096 100000 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 Block size KB Illustrazione 11: Re-Reader Report Anche in questo caso non ci sono differenze fra le prestazioni ottenute su file-system montato su device locale o su device Drbd in quanto anche in questo caso si tratta di operazioni di lettura che Drbd comunque esegue in locale. Si nota inoltre che il picco di prestazioni si attesta circa su 1,5 gigabyte per secondo mentre le prestazioni reali non superano mediamente i 25 megabyte per secondo. 5.4.7 Test di lettura casuale. Questo test esegue la lettura del file di testo a blocchi non sequenziali al fine di misurare le performance del file-system su operazioni riguardanti dati non contigui che richiedono spostamenti continui della testina di lettura/scrittura. 96 random read report 10000000 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 1000000 100000 10000 Performance KB/sec 100 64 256 1024 4096 32768 262144 File size KB 2097152 4 16 128 2048 1000 Block size KB Illustrazione 12: Random-Read Report Anche in questo caso le differenze fra le performance su device locale o su device Drbd non differiscono per il fatto che si tratta di operazioni di lettura che Drbd esegue comunque localmente. I risultati ottenuti prima della soglia di caduta delle performance sono analoghi a quelli ottenuti con operazioni di lettura sequenziale, in quanto, finché vengono usati meccanismi di ottimizzazioni che fanno uso della memoria centrale (caching del sistema operativo), le operazioni di accesso casuale ai dati non introducono tempi di latenza dovuti a spostamenti meccanici della testina di lettura/scrttura, dato che la memoria centrale ha un tempo di accesso istantaneo per qualunque locazione. Infatti la memoria RAM deve il suo nome proprio a questa particolare caratteristica. Tuttavia i valori medi risultano leggermente più bassi in quanto non possono essere utilizzate ottimizzazioni dovute alla cache del processore perché comunque i dati letti, se pur istantaneamente, non sono contigui. I risultati più interessanti si ottengono come al solito dopo la soglia di caduta delle performance. Si nota infatti che le performance scalano in relazione alla grandezza dei blocchi di lettura. Questo effetto è giustificato dal fatto che non intervenendo adesso nessun meccanismo di caching, tutte le operazioni vengono svolte su disco; per questo motivo ogni operazione di lettura da 97 locazioni casuali, richiede lo spostamento meccanico della testina del disco per cui se con ogni operazione di lettura si leggono più dati contigui (blocchi più ampi), le performance relative crescono. Tuttavia la crescita delle prestazioni si arresta quando la grandezza dei blocchi raggiunge la capacità della cache del processore e cioè 512 Kilobyte in quanto per blocchi più grandi il processore può ottimizzare sempre e soltanto 512 kilobyte di dati sequenziali; dopo è comunque necessaria una successiva lettura su disco eseguita per altro su locazioni adiacenti. Le performance reali sono comprese pertanto fra 1,2 e circa 50 megabyte per secondo. 5.4.8 Test di scrittura casuale Questo test misura le capacità del file-system in corrispondenza di scritture di dati eseguite su locazioni casuali e non necessariamente adiacenti. Gran parte delle considerazioni da dover fare per questo test sono state già fatte per i test precedenti. Infatti prima della soglia di caduta delle performance, con l'utilizzo delle ottimizzazioni dovute al caching dei dati le caratteristiche delle scritture casuali sono simili a quelle delle scritture sequenziali, dato che non ci sono latenze dovute a spostamenti continui della testina di lettura/scrittura del disco. Dopo la soglia di caduta si registra invece lo stesso fenomeno presentatosi con le operazioni di lettura casuale e cioè l'incremento delle prestazioni dovuto al crescere delle dimensioni dei blocchi di scrittura. Valgono anche in questo caso le considerazioni fatte al paragrafo 5.4.7 relative al migliore utilizzo della cache del processore. La differenza rispetto alle operazioni di lettura casuale sta nel fatto che le performance reali sono ovviamente più basse e si attestano in valori compresi fra 1 e 4 megabyte per secondo se il file-system è montato su Drbd device per via dei meccanismi di replicazione dei dati; fra 1 e 25 megabyte per secondo se il file-system è su un device locale. Il valore minimo delle performance reali è identico sia per i device locali che Drbd in quanto in tali situazioni il collo di bottiglia è rappresentato dagli spostamenti della testina del disco e non dai meccanismi di replicazione dei dati introdotti da Drbd. 98 local random write report 1000000 4 8 16 32 100000 64 128 10000 256 512 Performance KB/sec 1024 1000 2048 16384 131072 2097152 4 16 256 4096 100 64 256 2048 4096 8192 16384 Block size KB File size KB Illustrazione 13: Random-Write Report drbd random write report 1000000 4 8 16 32 100000 64 128 10000 256 512 Performance KB/sec 1024 2048 1000 16384 2048 16384 131072 File size KB 2097152 4 16 256 4096 100 64 256 4096 8192 Block size KB Illustrazione:14: Random-Write Report con Drbd 99 5.4.9 Conclusioni In conclusione, per favorire l'incremento delle prestazioni del file-system bisogna cercare di sfruttare le ottimizzazioni che derivano dallo scheduling del sistema operativo e dai meccanismi di cache della CPU. E' pertanto consigliabile, al fine di sfruttare lo scheduling del sistema operativo eseguito attraverso l'ordinamento delle operazioni di I/O, con dati in memoria centrale, evitare di gestire file di dimensioni superiori a 1 Gigabyte perché tale situazione ricade nella zona oltre la soglia di caduta delle performance che ridurrebbe drasticamente il throughput dati gestito. Usando infatti file di tali dimensioni non è possibile contenerli nella memoria centrale per cui è richiesto un continuo accesso al canale EIDE per reperire le informazioni necessarie. Come si è visto dall'analisi dei grafici questa ottimizzazione è la più consistente dato che permette incrementi in prestazioni molto importanti e sia in lettura che in scrittura. E' bene inoltre non superare la dimensione di 512 Kilobyte sui blocchi di dati gestiti visto che fino a tale soglia si sfrutta il caching del processore. L'effetto della cache è molto evidente durante le operazioni di lettura e tuttavia oltre tale soglia non si registra una brusca caduta delle prestazioni. Un'eccezione va fatta per le operazioni casuali di lettura o scrittura, eseguite su file di dimensioni superiori a 1 gigabyte, per i quali la possibilità di utilizzare blocchi maggiori di 512 kilobyte consente prestazioni maggiori in quanto ogni blocco di dati viene letto sequenzialmente. Ulteriori ottimizzazioni potrebbero essere sfruttate in operazioni di ri-lettura con file minori di 512 kilobyte. Infatti in tal caso le operazioni vengono svolte interamente nella cache della CPU e quindi alla sua stessa velocità di clock senza dover più volte accedere a bus esterni, come la memoria centrale o addirittura il canale EIDE, per reperire altri dati. Questa situazione è tipica dell'accesso consecutivo ad uno stesso file di piccole dimensioni. 100 5.5 Installazione e configurazione DRBD La procedura di installazione del software Drbd si esegue secondo gli standard della distribuzione Gentoo. Drbd è inserito nel portage di Gentoo dove sono disponibili i sorgenti e i file relativi alla compilazione e installazione del software. E' sufficiente infatti impartire il comando emerge drbd per ottenere il download dell'ultima versione stabile del software e la successiva compilazione ed installazione. Normalmente l'installazione di drbd richiede e l'inserimento del modulo drbd nel kernel e la ricompilazione dello stesso. Queste operazioni vengono svolte automaticamente dallo script di installazione invocato da emerge per cui dopo l'esecuzione del comando il modulo drbd è già installato e pronto a funzionare. Su ogni nodo del cluster due partizioni vengono destinate alla creazione di due Drbd block-device. Le partizioni destinate a Drbd hanno entrambe la dimensione di 10 Gigabyte e su ogni nodo saranno appunto /dev/sda10 e /dev/sda11. Per poter svolgere le sue funzioni Drbd richiede che sia opportunamente creato il file /etc/drbd.conf56 . In tale file sono specificate le risorse che sono devolute a Drbd e le modalità di configurazione delle risorse stesse oltre alle modalità con cui Drbd dovrà utilizzarle. Per fare in modo che il sistema operativo sappia come montare i Drbd blockdevice, sono state aggiunte al file /etc/fstab le seguenti righe: /dev/nbd/0 /bind ext3 noauto 0 0 56 Il file di configurazione di Drbd, drbd.conf è presentato integralmente in appendice. 101 /dev/nbd/1 /sendmail ext3 noauto 0 0 I punti di mount /bind e /sendmail sono stati precedentemente creati con mkdir /bind; mkdir /sendmail. L'opzione noauto è invece fondamentale perchè i block-device non vanno montati dal sistema operativo automaticamente, ma dal software di gestione del cluster (Heartbeat) secondo le decisioni prese in fase di avvio del cluster o in seguito a eventuali take-over delle risorse gestite. Il file /etc/drbd.conf deve essere identico su entrambi i nodi del cluster, per cui va copiato senza nessuna modifica anche sull'altro nodo. Va ricordato che tutti i comandi eseguiti sono stati impartiti attraverso il software pconsole per cui l'installazione di Drbd è avvenuta contemporaneamente su entrambi i nodi del cluster. Per completare l'installazione, Drbd va inoltre aggiunto all'elenco dei programmi eseguiti in fase di avvio. Il wrapper Drbd è stato inserito dal processo di installazione nella directory /etc/init.d per cui è sufficiente eseguire il comando rc-update add drbd default per fare in modo che ad ogni riavvio ogni nodo carichi anche il proprio modulo Drbd. Per rendere funzionante a questo punto la replicazione dei dati sui Drbd block-device è necessario rendere attiva l'interfaccia di rete privata che sarà utilizzata sia da Drbd che da Heartbeat. 5.5.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 vuole aggiungere al cluster. Ogni riga che inizia con resource indica che si sta configurando un nuovo block-device identificato dal nome che segue la parola resource [4]. 102 Per ogni risorsa configurata ci sono poi diverse sottosezioni che configurano le diverse caratteristiche di ogni block-device. Innanzitutto si trova la riga protocol che specifica il tipo di protocollo con cui Drbd deve effettuare la sincronizzazione su tale device. Nel cluster che costruito, si utilizza il protocollo C. Successivamente si specifica qual'è il comando per effettuare il controllo dell'integrità dei dati, poi la sezione relativa alla configurazione della rete di comunicazione che si occupa di configurare i parametri relativi alla velocità di sincronizzazione e vari time-out come quello relativo al tempo di attesa dell'altro nodo. Le sezioni successive sono decisamente più importanti e configurano le risorse che di ogni nodo vengono utilizzate. In dettaglio la configurazione delle risorse avviene attraverso le seguenti righe: on freedom { #HA1 device=/dev/nbd/0 disk=/dev/sda10 address=192.168.0.1 port=7788 } on independence { #HA2 device=/dev/nbd/0 disk=/dev/sda10 address=192.168.0.2 port=7788 } Le righe precedentemente evidenziate sono relative alla configurazione della singola risorsa che sarà disponibile su ogni nodo attraverso il file57 “/dev/nbd/0”. All'interno di ogni sottosezione, che inizia con la parola on seguita dal nome del nodo che esporta le risorse, troviamo innanzitutto la definizione del 57 In Linux come in tutti i sistemi *nix si usa dire che “tutto è un file” per riferirsi al fatto che qualunque elemento del sistema è accessibile attraverso un file. A questa caratteristica non si sottraggono nemmeno le risorse hardware per le quali il sistema riserva la directory /dev all'interno della quale ogni file fa riferimento a ogni diverso dispositivo hardware. 103 device che viene configurato, definito dal file “/dev/nbd/0”; con l'attributo “disk” viene specificata quale sarà la partizione reale che deve essere esportata dallo specifico nodo per far parte del block-device condiviso. Gli attributi “address” e “port” invece si riferiscono 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.0.1 sul nodo “freedom” e 192.168.0.2 sul nodo “independence”; su entrambi sarà in ascolto sulla porta 7788. Si noti che per ogni risorsa aggiuntiva configurata (relativa ad altri blockdevice) la porta sulla quale il modulo drbd rimane in ascolto per la sua sincronizzazione deve essere sempre diversa. 5.6 Alta disponibilità della rete interna Come si nota dal paragrafo 5.5.1 la rete interna utilizzata per la sincronizzazione dei dati di Drbd ha indirizzo 192.168.0. Tale rete è stata assegnata alle interfacce “eth1” ed “eth2” configurate in channel bonding [7] per far in modo che anche il collegamento di rete interna che Drbd usa per sincronizzare i dati fra i due nodi del cluster, non rappresenti un “single point of failure”. Come già detto Drbd è in grado di svolgere il suo compito anche quando i dati sono momentaneamente non sincronizzati, ma ci possono essere casi in cui la caduta del nodo primario, potrebbe generare perdite di dati. Proprio questo caso, testato direttamente sul cluster costruito, ha suggerito l'opportunità della replicazione del canale di sincronizzazione. Si è eseguita infatti la seguente prova utilizzando su entrambi i nodi la sola interfaccia eth1 come canale di sincronizzazione di Drbd. 104 Il nodo “freedom” è stato reso primario[4] per il Drbd block-device “/dev/nbd/0” attraverso il comando drbdsetup /dev/nbd/0 primary e si è montato il dispositivo al percorso /bind col comando mount /dev/nbd/058 Successivamente è stato eseguito il comando touch test che ha creato sul blockdevice un file chiamato test. Per verificare la sincronizzazione si è smontato il dispositivo “/dev/nbd/0” dal nodo “freedom” e lo si è montato temporaneamente sul nodo “independence”. Dopo aver riportato “freedom” al suo ruolo di nodo primario si è provveduto ad interrompere a il canale di sincronizzazione, staccando fisicamente il cavo ethernet incrociato che collega i due nodi. In questa circostanza drbd automaticamente si rende conto che la replica dei dati non viene eseguita e provvede a memorizzare i cambiamenti effettuati al block-device in una locazione del disco che si definisce “bitmap”, per poter eseguire, quando il collegamento fra i nodi è ripristinato, l'aggiornamento della replica sull'altro nodo, dei soli dati specificati dalla bitmap. Questa operazione viene infatti definita “fast resync”. A questo punto il file /bind/test è stato modificato attraverso il comando echo modifica da freedom>/bind/test che ha inserito il testo “modifica da freedom” all'interno del file “/bind/test”. Tale modifica quindi non è stata replicata sul nodo “independence” ma rimane nella “bitmap” del nodo primario “freedom” in attesa del “fast 58 Si noti che il comando non specifica né il percorso in cui montare il dispositivo, né il tipo di filesystem contenuto in quanto i parametri corretti sono già impostati nel file /etc/fstab. 105 resync”. Tutta questa procedura rimane comunque trasparente all'utente in quanto viene eseguita in background da Drbd. Si è provveduto ora a spegnere il nodo “freedom”, per simulare un crash accidentale del nodo primario e si è reso primario il nodo “independence” rispetto allo stesso device “/dev/nbd/0”. Dopo averlo montato nella directory predefinita, è possibile verificare che la modifica al file “/bind/test” non è stata ovviamente effettuata. Si è quindi modificato ulteriormente il file “/bind/test” con il comando echo modifica da independence>/bind/test che ha inserito una stringa di testo diversa all'interno del file test. Quest'ultima modifica viene eseguita nella bitmap residente su “independence”. Ripristinando il collegamento di rete privato e rendendo ancora primario il nodo “freedom” ci si accorge allora che il “fast resync” è avvenuto correttamente, ma la stringa memorizzata nel file di test è “modificato da independence”. La modifica effettuata su “freedom” va dunque persa59. La perdita di dati dunque avviene in presenza di due avvenimenti successivi: la assenza di sincronizzazione tra i drbd dei nodi per un problema sulla rete interna, si pensi ad esempio ad un problema della scheda di rete, e il successivo blocco totale del nodo primario. In tal caso le modifiche fatte sui dati durante il funzionamento in assenza di sincronizzazione vengono perse. Per ridurre la probabilità che si verifichi questo problema si è provveduto quindi a ridondare il canale di sincronizzazione di Drbd mediante “channel bonding” in quanto costituisce un “single point of failure” forse non di 59 Si consideri che tutti i passaggi eseguiti manualmente per rendere primario o secondario un nodo rispetto a un DRBD block-device e le operazioni di montaggio e smontaggio dei device, a cluster ultimato vengono eseguite automaticamente da Heartbeat. 106 primaria importanza, in quanto non coinvolge l'intero funzionamento del cluster, ma abbastanza critico per la consistenza dei dati immagazzinati. Si pensi ad esempio ad intere transazioni su database che potrebbero andare perse. Si potrebbero perciò introdurre nelle definizioni dell'alta disponibilità, diversi livelli di criticità per i “single point of failure” il maggiore dei quali prevede l'interruzione dei servizi erogati. 107 Capitolo 6 HEARTBEAT: SUITE PER L'ALTA DISPONIBILITA' In questo capitolo si analizza nei dettagli il funzionamento e la configurazione di Heartbeat. Questo software caratterizza il funzionamento dell'intero cluster in quanto tiene traccia del funzionamento dei singoli nodi e prende le decisioni opportune nei casi di malfunzionamento. Come ogni software sviluppato per ambiente Linux o comunque Unix-like, Heartbeat è una suite composta da un insieme di piccoli moduli altamente specializzati su una certa funzione che interagiscono continuamente per raggiungere l'obiettivo finale della suite. Questo modo modularizzato di operare consente di rendere molto snello ed efficiente lo sviluppo del software, in quanto in caso di manutenzione o aggiunta di funzionalità future, le modifiche coinvolgeranno solo i moduli direttamente interessati e non l'intera suite. 6.1 La struttura modulare di Heartbeat Schematicamente si può riassumere la sua struttura con la seguente illustrazione. 108 Illustrazione 15: Schema moduli Heartbeat Dall'illustrazione 15 è evidente che Heartbeat ha un'architettura multiprocesso e questo è voluto oltre che per ragioni storiche anche per motivi di sicurezza. Il fatto che ogni processo separato gestisca un aspetto particolare delle funzioni della suite evita che il crash di una certa funzionalità coinvolga tutte le altre. Come si vede in figura 15, in Heartbeat ci sono quattro categorie di processo: primo e più importante è il “Master Control Process”, troviamo poi i processi di “lettura” e “scrittura” e il processo di “lettura FIFO”. Ci sono poi altri processi che possono essere considerati processi “client” in quanto eseguono certe operazioni e chiedono al “Master Control Process” di reagire di conseguenza. I più importanti sono “ipfail” e “CCM” (Consensus Cluster Membership)[5]. 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 di 109 Heartbeat a cui invia e riceve i dati necessari per prendere le decisioni in caso di malfunzionamenti sui nodi. In particolare: provvede all'invio dei segnali di heartbeat attraverso i canali configurati che collegano i nodi del cluster, gestisce i time-out sui segnali di heartbeat attraverso i quali stabilire se un nodo è effettivamente funzionante, invia pacchetti firmati attraverso l'apposito plugin o autentica pacchetti ricevuti utilizzando gli appositi algoritmi crittografici opportunamente configurati, 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 filesystem al percorso /var/lib/heartbeat/fifo. La comunicazione fra processi attraverso la coda “first-in-first-out” è utilizzata quando i processi risiedono sulla stessa macchina ed è facilmente realizzabile, dato che due processi possono scambiarsi messaggi aprendo in lettura o scrittura la stessa coda. Il modulo “FIFO reader” evita che la gestione di tale comunicazione venga eseguita all'interno del “Master Control Process”. 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. Dato che i canali di comunicazione possono essere diversi è necessario che ci sia un processo di lettura per ogni tipo di canale da cui ricevere dati. I “write processes” hanno le stesse caratteristiche dei “read processes” ma sono adibiti alla trasmissione di dati all'esterno. Anche in questo caso ci saranno processi di scrittura diversi per ogni tipo di canale di comunicazione utilizzato. 110 I “client processes” eseguono operazioni che si possono definire esterne all'attività del “Master Control Process” ad esempio “ipfail” esegue un monitoraggio della connessione fra i nodi e stabilisce quando è necessario eseguire il failover del gruppo di servizi chiedendo al “Master Control Process” di eseguire materialmente l'operazione. CCM invece, acronimo di Consensus Cluster Membership, 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. La principale funzione di questo modulo è quella di verificare lo stato della connessione fra i nodi per risolvere problemi legati a connessioni solo parziali o comunque non desiderate che potrebbero verificarsi in seguito a malfunzionamenti software o danni arrecati dall'esterno. In pratica ogni nodo, grazie al “CCM”, è consapevole del fatto di essere o meno membro del cluster ed ancora i nodi parzialmente collegati (nel caso di interruzione di uno dei canali ridondati di connessione interna), non vengono considerati membri del cluster e non potranno accogliere un eventuale failover. E' evidente che questo componente assume un'importanza crescente all'aumentare del numero di nodi che compongono il cluster benché la sua funzione rimane indispensabile anche con cluster formati da due soli nodi. 6.1.1 I plugin I moduli descritti fin'ora costituiscono il nucleo della suite e assolvono le funzioni primarie necessarie al funzionamento del cluster. Tale nucleo centrale per altro, non implementa alcune funzionalità esterne e più vicine al contesto operativo in cui verrà collocato il cluster. Per assolvere alle funzioni di interfacciamento col mondo esterno Heartbeat si appoggia a plugin che vengono utilizzati in modo opportuno a seconda del tipo di ambiente in cui andrà ad operare e si possono suddividere in tre 111 categorie: ci sono plugin di STONITH, plugin di Comunicazione, plugin di autenticazione. L'illustrazione 16 mostra una visione più ampia della suite Heartbeat. Illustrazione 16: Heartbeat: visione più ampia I plugin di STONITH implementano le funzioni necessarie a far fronte al problema del brain-splitting. STONITH è infatti acronimo di Shoot 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, a causa di un failover sbagliato causato ad esempio dall'interruzione simultanea di tutti i canali di comunicazione interna. 112 Questa operazione è realizzata con un dispositivo hardware che collegato al cluster attraverso la rete ethernet o le porte seriali, è in grado di comunicare con Heartbeat e ricevere comandi. Tale dispositivo hardware 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. Con il plugin di STONITH sono forniti anche i driver per il funzionamento del dispositivo hardware. Tutte le comunicazioni verso l'esterno, eseguite da Heartbeat sono gestite da plugin. I canali supportati comprendono le comunicazioni UDP di tipo broadcast, multicast e unicast60 e le comunicazioni attraverso le 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 consentono ai nodi che li ricevono di stabilire che un certo segnale ricevuto sia autentico ed effettivamente proveniente da un certo nodo. Sono tuttavia implementati tre diversi algoritmi di crittografia a seconda del livello di sicurezza che si vuole ottenere pagando in termini di utilizzo di CPU. Le autenticazioni possono essere eseguite con l'algoritmo “crc” il più semplice ma anche il meno sicuro, con l'algoritmo “MD5”, o con l'algoritmo “sha1” che offre una codifica difficilmente reversibile ma richiede un carico di lavoro supplementare. Quest'ultimo algoritmo tuttavia, è consigliabile se le comunicazioni di sincronizzazione devono passare attraverso segmenti di rete non esclusivamente ad utilizzo dei nodi del cluster; se la rete di connessione 60 Le trasmissioni di rete possono essere di vari tipi a seconda dei destinatari a cui sono indirizzate. Le trasmissioni broadcast infatti sono inviate a tutti gli host connessi alla rete, quelle multicast a diversi host specificati e quelle unicast a un solo host specificato. 113 interna è assolutamente privata, non vi è alcuna necessità di codificare in modo sicuro i messaggi di sincronizzazione. I “resource script” che si trovano schematizzati nell'illustrazione 16 possono essere considerati a tutti gli effetti componenti esterni di Heartbeat. Sono dei file 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 o dall'amministratore per gestire alcuni aspetti della suite. Heartbeat ad esempio potrebbe invocare lo script “MailTo” per inviare dei messaggi di posta elettronica al verificarsi di particolari situazioni, l'amministratore potrebbe invece invocare lo script “heartbeat start” per avviare manualmente le funzioni di Heartbeat o “heartbeat stop” per fermarne il funzionamento. 6.2 Il Resource Group Nella logica di Heartbeat si definisce risorsa ogni entità del sistema che Heartbeat gestisce [5]. Una risorsa può essere ad esempio un indirizzo IP, un servizio come Apache, un componente hardware come un'unità disco, una risorsa del kernel come un filesystem. Per ognuna delle risorse gestite da Heartbeat, esiste uno script in grado di eseguire l'avvio (start), lo spegnimento (stop) similmente a quanto accade con gli script presenti in “/etc/rc.d/”. Si parla di Resource Group per il fatto che l'operazione di take-over da un nodo all'altro interessa tutte le risorse che un certo nodo del cluster gestisce, quindi ad 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 ruolo primario e i servizi forniti all'indirizzo specificato all'inizio. Nel momento in cui il nodo cade, il service group viene interamente migrato sull'altro nodo e le risorse così trasferite vengono attivate così com'erano sul nodo caduto. 114 Si consideri quindi l'importanza della risorsa disco rappresentata dal device DRBD, che è virtualmente identica a quella presente sul nodo caduto: nel momento del take-over viene semplicemente cambiato il ruolo del nodo primario che adesso viene assunto dal nodo intervenuto in sostituzione di quello caduto. Questo passaggio è possibile per il fatto che Heartbeat integra uno script denominato datadisk espressamente scritto per i device DRBD. 6.3 Installazione e configurazione L'installazione di Heartbeat non richiede particolari attenzioni. Si svolge secondo lo standard della distribuzione Gentoo attraverso il comando emerge heartbeat Al solito viene scaricato il pacchetto sorgente da uno dei mirror Gentoo disponibili per poi procedere alla compilazione della suite Heartbeat e alla successiva installazione nei percorsi predefiniti. Anche Heartbeat come ogni software per piattaforma *NIX, si configura attraverso dei file di configurazione. I file modificati per far sì che la suite Heartbeat rispondesse alle caratteristiche peculiari del sistema sono stati sostanzialmente i seguenti: /etc/ha.d/ha.cf /etc/ha.d/haresources /etc/ha.d/authkeys. La configurazione dei tre file elencati evidenzia le politiche di gestione delle risorse che si sono decise in fase di progetto e le funzioni di recovery e monitoraggio che si è scelto di attivare. Si tenga presente che i file di configurazione sono identici su entrambi i nodi. 115 6.3.1 Il file haresources All'interno del file haresources vengono configurati i Resource Group per ciascuno dei nodi. Dato che in produzione il cluster avrà il compito di erogare due servizi in configurazione Active/Active, viene definito un Resource Group per ogni nodo. Le righe all'interno del file haresources sono simili alle seguenti: freedom 193.206.185.XXX datadisk::drbd0 independence 193.206.185.XXX datadisk::drbd1. All'inizio di ogni riga, che denota ogni resource group, si trova l'hostname (come specificato dall'output del comando uname -n) del nodo che ospita il resource-group inizialmente. Successivamente si configura l'indirizzo IP al quale il cluster dovrà rispondere nell'erogare i servizi, che viene generato come “alias IP” dell'interfaccia di rete esterna, configurata cona la stessa sottorete dell'indirizzo del resource group. Per i due servizi che si devono erogare si sono configurati due device DRBD denominati drbd0 e drbd1. Con lo script datadisk Heartbeat è in grado di dare al nodo il ruolo primario per il device specificato provvedendo inoltre a montare il device al percorso stabilito all'interno del file /etc/fstab. Per questo motivo nel file /etc/fstab i dispositivi DRBD devono essere configurati con l'opzione noauto per far sì che vengano montati correttamente da Heartbeat. In particolare lo script datadisk esegue il comando drbdsetup /dev/nbd/X primary per rendere primario il nodo e montare il dispositivo, 116 drbdsetup /dev/nbd/X secondary per rendere il nodo secondario dopo aver smontato il device ed eseguire eventualmente il take-over del resource-group. A questo punto si inseriscono i wrapper dei servizi che si vogliono erogare così come sono specificati all'interno della directory “/etc/rc.d/”. 6.3.2 Il file ha.cf Il file ha.cf viene letto da Heartbeat nel momento in cui viene lanciato 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 su cui va ad essere eseguita e per soddisfare le politiche di gestione che si sono stabilite in fase di progetto. Analizzando il file, contenuto integralmente in appendice, si trova la riga keepalive 2 che specifica il tempo in secondi entro cui inviare due segnali di heartbeat fra i due nodi; la riga deadtime 5 stabilisce il tempo in secondi entro cui, non avendo risposto al segnale di heartbeat, un nodo può essere considerato non funzionante; initdead 120 117 imposta a 120 secondi il tempo di “deadtime” solo per la prima volta, quindi subito dopo l'avvio di Heartbeat per far in modo che si consideri il tempo necessario a stabilire la comunicazione fra i nodi e ad inizializzare i diversi plugin che gestiscono le diverse funzioni di Heartbeat. Questo per evitare di produrre un take-over delle risorse prima ancora che il sistema di heartbeat sia stato completamente inizializzato. La riga successiva auto_failback on sta ad indicare un particolare comportamento del cluster. Secondo l'impostazione applicata quando un nodo rientra nel cluster dopo esserne stato escluso per malfunzionamento o per manutenzione, in quest'ultimo caso volontariamente da parte dell'amministratore, il service group configurato per default su tale nodo viene automaticamente riportato su di esso. E' evidente che i servizi torneranno ad essere erogati su tale nodo solo dopo che il file-system condiviso è stato sincronizzato. Il compito di verificare la sincronizzazione dei block-device condivisi è assolto da DRBD. Le righe seguenti impostano il sottosistema di comunicazione fra i nodi utilizzato da Heartbeat. In particolare la riga serial /dev/ttyS0 imposta il device seriale che eventualmente Heartbeat deve utilizzare per il segnale di sincronizzazione; bcast bond0 bcast eth2 118 specifica invece 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 il canale bond0, in cui la comunicazione avviene con il protocollo TCP/IP, di per sé è già ridondato per il motivo specificato nel paragrafo 5.6. Indirettamente assume un'importanza rilevante anche per il funzionamento di Heartbeat in quanto rappresenta un canale in più di comunicazione fra i nodi che diminuisce la probabilità di interruzione simultanea di tutti i canali interni che causerebbe il pericoloso fenomeno del “brain-splitting”. Per questo motivo si è ritenuto opportuno non dotare il sistema della funzionalità di STONITH61 (Shoot The Other Node In The Head). Si noti inoltre che il canale di comunicazione fra i nodi viene ulteriormente ridondato dall'interfaccia di rete eth2; ma a questo proposito è necessaria una precisazione: il canale eth2 corrisponde all'interfaccia attraverso cui il cluster comunica con l'esterno e sulla quale eroga i servizi. Mandando il segnale di Heartbeat anche su tale canale non si conoscono a priori quali saranno i segmenti di rete che il pacchetto TCP/IP relativo a Heartbeat attraverserà prima di raggiungere la destinazione. Per questo motivo, al fine di garantire la sicurezza del sistema si rende necessario codificare con un algoritmo sicuro le comunicazioni di Heartbeat. L'algoritmo scelto, il più sicuro supportato da Heartbeat è sha1. Tale impostazione va applicata nel file authkeys come si vedrà più avanti in questo stesso paragrafo. L'overhead computazionale introdotto dalla codifica con sha1 rispetto al crc è assolutamente irrilevante per la potenza di calcolo dell'hardware in uso. 61 Heartbeat fornisce attraverso plugin supporto alla funzionalità di STONITH e attraverso un meccanismo di arbitraggio, stabilisce quale dei due nodi deve essere drasticamente disattivato inviando quindi al dispositivo hardware apposito il comando di disattivazione dell'alimentazione elettrica. 119 Le righe successive specificano i nomi dei nodi del cluster così come risulta dall'output del comando uname -n. Le righe seguenti sono di particolare importanza in quanto provvedono a far eseguire ad Heartbeat comandi corrispondenti a plugin della suite o comandi esterni che vengono lanciati come processi “figli” di Heartbeat. Con la riga respawn hacluster /usr/lib/heartbeat/ipfail si provvede a far eseguire ad Heartbeat il proprio plugin “ipfail” con i privilegi dell'utente “hacluster”. Il plugin “ipfail” si occupa di monitorare costantemente il collegamento del nodo con l'esterno. Nel caso in cui il nodo risulti isolato è evidente che non può erogare alcun servizio e in tal caso “ipfail” richiede un fail-over del Resource Group. Il comando “respawn” all'inizio della riga, specifica che Heartbeat si preoccuperà di monitorare costantemente il funzionamento del processo e di rilanciarlo nel caso in cui venga interrotto. Allo stesso modo vengono avviati anche altri due programmi esterni che saranno analizzati più in dettaglio nel capitolo 7, si tratta di “mon” e “swatch”, due tool di monitoraggio che controllano rispettivamente l'erogazione effettiva dei servizi e i file di log alla ricerca di alcune particolari stringhe. Le righe che eseguono tali programmi sono le seguenti: respawn root /usr/bin/swatch -t /var/log/ha-log -t /var/log/messages respawn root /usr/sbin/mon. 120 L'ultima riga del file ha.cf configura l'indirizzo IP verso cui eseguire il comando di “ping” utilizzato da “ipfail” per verificare il collegaento del nodo con l'esterno. E' evidente che tale indirizzo IP deve corrispondere a un host sicuro e sempre funzionante e in questo caso è stato scelto il gateway della rete esterna. La riga è la seguente: ping 193.206.185.1. 6.3.3 Il file authkeys Come analizzato nel paragrafo 6.2, tutte le comunicazioni che avvengono fra i nodi sono cifrate e autenticate per 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 [5]. Nel file “authkeys” si configura appunto l'algoritmo crittografico per le comunicazioni fra i nodi ed in particolare attraverso le righe auth 1 1 sha1 freedom-independence-fr si specifica di utilizzare per il cluster l'algoritmo “sha1”. Questa scelta è dovuta al fatto che le comunicazioni fra i nodi avvengono anche attraverso un canale insicuro, eth2. 121 6.4 Gratuitous ARP Particolare attenzione va posta nella configurazione della rete esterna alla quale il cluster eroga i servizi. Questa attenzione maggiore è dovuta al particolare meccanismo che Heartbeat utilizza per migrare il Resource Group da un nodo all'altro. Come già evidenziato nel paragrafo 6.3.1, l'indirizzo IP di ogni Resource Group al quale i diversi servizi rispondono, è un alias dell'indirizzo configurato sull'interfaccia di rete esterna. In caso di fail-over, tale indirizzo deve essere migrato da un nodo all'altro con il Resource Group, il cluster cioè deve continuare a rispondere allo stesso indirizzo per l'erogazione dei vari servizi. Il meccanismo che Heartbeat utilizza per far in modo che i pacchetti destinati ad un certo indirizzo IP raggiungano un host diverso dal precedente, fa uso dei cosiddetti “Gratuitous ARP”. Come da modello ISO-OSI [1], il protocollo ARP (Address Resolution Protocol), si occupa di instradare i pacchetti ethernet eseguendo la traduzione da indirizzi IP del livello 3 del modello ISO-OSI, in indirizzi ethernet del livello 2, relativi alle interfacce di rete presenti su ogni host di una rete e realizzando così l'astrazione data-link. Ogni host della rete solitamente conserva una tabella di associazione fra indirizzi IP e indirizzi MAC che viene aggiornata periodicamente in base alle impostazioni che l'amministratore ha predefinito. Tali tabelle sono conservate anche all'interno di dispositivi di instradamento come router e switch per far in modo che i pacchetti destinati ad un dato host vengano recapitati direttamente senza eseguire prima la richiesta in broadcast dell'indirizzo ethernet. Attraverso i “Gratuitous ARP” si chiede agli host della rete (fra cui i dispositivi di instradamento) di aggiornare la propria tabella ARP associando un dato indirizzo IP ad un certo indirizzo MAC. 122 Il problema sta nel fatto che alcuni dispositivi di instradamento sono configurati per rifiutare i gratuitous-ARP al fine di evitare tecniche di cracking basate su ARP-spoofing[2]. Per poter utilizzare correttamente Heartbeat è dunque necessario utilizzare dispositivi che consentano i gratuitous-ARP. 123 Capitolo 7 STRUMENTI DI MONITORAGGIO E TEST DEL SISTEMA In questo capitolo si analizzano alcuni strumenti che sono stati installati e configurati sul cluster al fine di fornire funzionalità aggiuntive necessarie a facilitare le mansioni di amministrazione e controllo del corretto funzionamento del cluster stesso. Tali strumenti non sono indispensabili all'erogazione dei servizi in alta disponibilità in quanto svolgono solo la funzione di monitoraggio del corretto funzionamento; sono tuttavia molto importanti in quanto consentono di prevenire problemi più gravi aumentando così ulteriormente i periodi di erogazione. Precisamente gli strumenti utilizzati per svolgere il monitoraggio del cluster sono mon, swatch, webmin. Come specificato nel capitolo 6.3.2, i programmi mon e swatch sono avviati da Heartbeat come processi “figli” e costantemente monitorati. Questa configurazione è stata scelta per realizzare una integrazione di strumenti esterni nella suite Heartbeat evidenziando anche la flessibilità di tale suite tipica dei tool pensati per piattaforme *NIX. Al termine di questo capitolo viene descritto un test eseguito per verificare il corretto funzionamento del cluster, basato sull'erogazione in alta disponibilità di un web server. 7.1 Mon Mon è un tool di monitoraggio molto versatile e altamente configurabile che attraverso degli script creati ad hoc, molti dei quali forniti nel pacchetto di 124 installazione del software, verifica il funzionamento di alcune risorse del sistema sul quale è installato. In linea di massima, mon non è uno strumento costruito specificamente per l'impiego in sistemi cluster e tanto meno in sistemi per l'alta disponibilità, ma è talemente flessibile da poterlo configurare per svolgere una ruolo quasi indispensabile, nel cluster che si è configurato. La funzione di mon all'interno del cluster oggetto di questa tesi riguarda il monitoraggio dell'effettiva erogazione dei servizi. Considerando ad esempio il test che viene descritto alla fine del presente capitolo riguardante l'erogazione di un web server, mon interroga il server ad intervalli regolari verificando che la sua risposta sia quella attesa. Nel caso il server emetta una risposta diversa mon genera il fail-over del resource group dal nodo attivo al nodo in standby. Mon ha la possibilità di essere avviato come un normale programma a riga di comando o attraverso il wrapper posizionato in “/etc/init.d”. La possibilità di eseguire mon a riga di comando consente di specificare opzioni di esecuzione differenti come ad esempio un diverso file di configurazione, che potrebbe fornire diversi vantaggi soprattutto in fase di testing della configurazione. 7.1.1 Installazione e configurazione Anche l'installazione e la configurazione di mon segue gli standard della distribuzione Linux “Gentoo”, visto che i sorgenti del software sono presenti all'interno del portage62. 62 cfr. cap. 2 125 L'installazione dunque viene eseguita con il comando emerge mon. La configurazione è stata effettuata classicamente attraverso file di testo che per la distribuzione “Gentoo”, sono collocati all'interno della directory “/etc/mon.d/” e in particolare i file modificati per la configurazione di mon sono stati mon.cf e auth.cf. La parte principale del file mon.cf entro la quale si configura il monitor del servizio web basato su Apache utilizzato per il test del sistema è la seguente: # # define groups of hosts to monitor # hostgroup test_apache2 193.206.185.XXX watch test_apache2 service apache2 interval 5s monitor http.monitor period wd {Mon-Sun} hr {0-23} alertafter 2 alert mail.alert root@localhost alert apache2-restart.alert service apache2-takeover interval 5s monitor http.monitor period wd {Mon-Sun} hr {0-23} alertafter 3 30m numalerts 1 alert mail.alert -S "Apache2 non riparte, provvedo a fermare heartbeat per causare il takeover" root@localhost alert haStop.alert Come si nota mon opera a un livello più alto rispetto a Heartbeat. Mon astrae l'hardware su cui il servizio viene erogato e verifica direttamente l'indirizzo IP del servizio fornito in alta disponibilità, raggiungendolo dall'interfaccia di rete esterna secondo quanto specificato dalla riga hostgroup. 126 La riga watch identifica un gruppo di test e nel caso in esame il gruppo di test test_apache2 è formato da apache2 e apache2-takeover configurati dalla direttiva service. Il test “apache2” viene eseguito ogni 5 secondi eseguendo lo script fornito con il pacchetto di installazione http.monitor. Secondo la direttiva period il test viene eseguito nei giorni che vanno dal lunedi alla domenica e nelle ore comprese fra le 0 e le 23: praticamente sempre. La direttiva alertafter 2 specifica che mon deve eseguire gli script di allarme, specificati subito dopo, dopo il secondo tentativo fallito quindi dopo 10 secondi di inattività del server. Se ciò succede, mon provvede ad eseguire gli script di allarme inviando prima un messaggio e-mail all'amministratore e provvedendo poi automaticamente a riavviare il server Apache con la direttiva alert http.alert facente uso dello script http.alert. Il test apache2-takeover è sostanzialmente simile al precedente. L'unica grande differenza sta nella direttiva alertafter 3 30m in cui si chiede a mon di eseguire i successivi script di allarme dopo 3 tentativi falliti in 30 minuti. La situazione di tre tentativi falliti si verificherà necessariamente dopo il tentativo fatto dal test precedente apache2, di riavviare il server. Se si è verificato il terzo tentativo fallito, vuol dire che neanche il riavvio del server è servito a rendere disponibile il servizio perciò in questo caso l'unica soluzione possibile rimane il fail-over sull'altro nodo. E' ciò che esegue lo script di allarme specificato dalla direttiva alert haStop.alert dopo che è stato inviato all'amministratore un messaggio e-mail. Gli script http.alert e hatop.alert (presentati in appendice) sono stati creati appositamente per adattare mon al funzionamento combinato con Apache e Heartbeat[2]. In particolare http.alert contiene la sola riga /etc/init.d/apache2 restart e haStop.alert contiene la riga /etc/init.d/heartbeat stop, necessaria per 127 fermare Heartbeat sul nodo monitorato e sufficiente a causare il fail-over del service group sull'altro nodo. Ci sono funzioni di mon che, a causa della criticità per la sicurezza del sistema dovrebbero essere eseguite solo dall'amministratore del sistema. Per questo motivo il file auth.cf stabilisce per ogni funzione di mon quali sono gli utenti che hanno i privilegi di eseguirle. Nel caso del cluster realizzato, il solo amministratore è in grado di effettuare il reset, o di rileggere il file delle autorizzazioni, appunto auth.cf. Tutti gli utenti possono invece visualizzare le liste contenenti i test che non sono andati a buon fine, i test che hanno avuto successo o ancora, possono visualizzare lo stato di mon. Mon viene avviato attraverso Heartbeat come processo “figlio” e da quest'ultimo continuamente monitorato. Il file di configurazione di “mon” è relativo solo ai servizi che il nodo su cui è installato fornisce. Nel momento in cui il resource-group viene migrato sull'altro a causa di crash sul nodo active, monitorare ancora il servizio è ininfluente perché anche in caso di ulteriori problemi il fail-over, provocato da mon, non servirebbe a nulla. 7.2 Webmin Webmin è uno strumento di gestione del sistema scritto interamente nel linguaggio Perl ed è orientato alla gestione del sistema operativo e della sua configurazione attraverso l'utilizzo di interfacce grafiche basate su pagine web. La sua struttura modulare consente la scrittura di moduli necessari alle proprie esigenze e integrarli nel sistema. Per questo motivo, già inseriti nel pacchetto di installazione ci sono i moduli per la configurazione e la gestione di Heartbeat e di mon. 128 La forza di Webmin oltre che nell'interfaccia grafica sta soprattutto nella sua architettura. Esso infatti è costruito sul modello client-server per cui per poterlo utilizzare è necessario avviare il server Webmin attraverso il wrapper e questo sarà in ascolto sulla porta 10000. Con un browser, da locale o da remoto è possibile accedere a Webmin specificando sulla barra dell'indirizzo la stringa http://nomehost:10000. Webmin supporta inoltre connessioni cifrate basate sulle librerie SSL (Secure Socket Layer) per rendere indecifrabili le comunicazioni fra client e server quando vi si accede da remoto. E' inoltre necessario, ogni qualvolta si vuole entrare nell'interfaccia di gestione del sistema, loggarsi con user-name e password come in un normale login al sistema. Gli utenti e le password sono infatti reperiti dal file /etc/passwd. L'installazione di Webmin avviene nel solito modo col comando emerge webmin, e si è inoltre provveduto ad impostare il sistema operativo per caricare il server Webmin ad ogni riavvio col comando rc-update add webmin default. La configurazione di Webmin ha richiesto pochi passaggi inerenti in particolare l'impostazione della connessione cifrata come metodo di collegamento di default e l'impostazione dei giusti percorsi dei file di configurazione per quanto riguarda invece i moduli di Heartbeat e mon. Il modulo Webmin di Heartbeat consente di svolgere tutte le operazioni di gestione della suite che normalmente si eseguono modificando i file di configurazione e consente inoltre di eseguire manualmente il take-over dei resource-group da un nodo all'altro, tutto attraverso l'interfaccia grafica webbased. 129 Il modulo inerente mon è invece basato su uno script “cgi” contenuto nel file “mon.cgi” che visualizza graficamente lo stato delle risorse monitorate e le temporizzazioni intercorrenti fra i vari test. Dalla stessa interfaccia è inoltre possibile eseguire tutte le operazioni di gestione di mon, come la visualizzazione della lista dei test riusciti e falliti o il riavvio del programma, dipendentemente comunque dai permessi utente di cui si dispone. Teoricamente attraverso Webmin è possibile amministrare completamente il cluster costruito facendo uso dell'intuitiva interfaccia grafica. Per le operazioni più critiche è comunque consigliabile accedere al sistema attraverso shell e utilizzare le operazioni a riga di comando. 7.3 Swatch Swatch è uno strumento di analisi dei log. Tutti i programmi progettati per la piattaforma *NIX compreso il sistema operativo stesso, durante il normale svolgimento delle operazioni o quando si verificano particolari errori, emettono dei messaggi di log memorizzandoli in appositi file contenuti solitamente nella directory /etc/var/log [6]. Ogni amministratore di sistema periodicamente dovrebbe analizzare i file di log alla ricerca di messaggi particolari per prevenire errori gravi o problemi irreversibili. Ci sono tuttavia dei messaggi che possono indicare un malfunzionamento imminente e che richiedono azioni immediate da parte dell'amministratore. Per questo scopo si utilizza Swatch. Swatch tiene costantemente sotto controllo alcuni file di log che gli sono stati specificati e reagisce quando all'interno dei file riscontra una particolare stringa specificata nel suo file di configurazione. 130 Le azioni tipiche che swatch può eseguire riguardano l'invio di e-mail, l'output a console di messaggi, l'emissione di suoni o l'esecuzione di comandi. Swatch è presente nel portage di “Gentoo” per cui l'installazione è stata eseguita con emerge swatch. La configurazione di swatch si basa semplicemente sull'editing del file di configurazione contenuto nella directory di root e denominato .swatchrc. Viene ora presentato un estratto del file di configurazione /root/.swatcrc installato nel cluster. watchfor /dead/ echo bold undersore blink bell write root continue La direttiva watchfor indica la particolare stringa da ricercare all'interno dei file specificati nella riga di comando di swatch. Ogni volta che viene riscontrata tale stringa, viene emesso un suono con la direttiva bell e visualizzata la riga contenente la stringa trovata sulla console di root attraverso la direttiva write root. Swatch viene eseguito da Heartbeat come processo “figlio” attraverso il comando swatch -t /var/log/ha-log -t /var/log/messages e ciò significa che swatch comincerà a monitorare costantemente i file /var/log/ha-log 131 e /var/log/messages che contengono rispettivamente i messaggi emessi da Heartbeat e i messaggi emessi dal kernel. 7.4 Test del sistema Il sistema così configurato consente l'erogazione di qualunque servizio, in alta disponibilità L'alta disponibilità è sempre garantita, modificando opportunamente alcuni file di configurazione, in particolare il file /etc/ha.d/haresources, per aggiungere servizi da erogare e il file /etc/mon.d/mon.cf, per adattare “mon” ai servizi che si devono fornire. Per verificare il corretto funzionamento del sistema si è provveduto a titolo sperimentale ad installare ed erogare in alta disponibilità un servizio web basato sul server Apache. Dopo aver eseguito l'installazione del server con il comando emerge apache si è provveduto a modificare i file di configurazione nel modo seguente: • /etc/ha.d/haresources contiene la riga freedom 193.206.185.XXX datadisk::drbd0 apache2; • /etc/mon.d/mon.cf contiene le righe già descritte al paragrafo 7.1.1. La configurazione specificata nel file harsources consente di avviare sul nodo “freedom” il server apache attivando contestualmente un alias IP sull'interfaccia di rete esterna e montando il DRBD block device /dev/nbd/0 al percorso specificato opportunamente nel file /etc/fstab corrispondente a /home/httpd/. 132 Il server è stato configurato per rimanere in ascolto allo stesso indirizzo IP specificato in haresources ed è stato impostato, come directory del sito web fornito da apache, il percorso /home/httpd/www, corrispondente quindi ad una directory residente sul DRBD block device montato da Heartbeat attraverso l'impostazione nel file haresources. La pagina che apache fornirà puntando un qualunque browser all'indirizzo 193.206.185.XXX è la sua pagina predefinita nella quale è stato inserito un link al file server.php, residente nella stessa directory. Il file server.php è una pagina web che incorpora alcuni script PHP63, necessari alla visualizzazione dell'hostname della macchina che sta eseguendo il server apache. In questo caso tale pagina PHP visualizzerà l'hostname del particolare nodo del cluster che in quel momento sta effettivamente erogando il web server ed altre informazioni riguardanti lo stato del web server. Si è provveduto a questo punto ad avviare Heartbeat sul nodo “freedom” e successivamente sul nodo “independence” ottenendo così l'avvio del server apache sul nodo “freedom” in ascolto sulla porta 80 all'indirizzo 193.206.185.XXX. Puntando un browser con un host remoto allo stesso indirizzo IP si ottiene la pagina seguente: 63 PHP: Linguaggio di scripting integrabile direttamente all'interno del codice HTML che costituisce una qualunque pagina web. Per poter essere eseguito è necessario il supporto da parte del server web. 133 Illustrazione 17: pagina predefinita La pagina web nell'illustrazione 17 è sufficiente per verificare il corretto funzionamento del server apache sull'indirizzo generato da Heartbeat. Per verificare inoltre qual'è effettivamente il nodo del cluster che sta fornendo il servizio web è sufficiente cliccare sul link in fondo alla pagina per ottenere il caricamento del file server.php. 134 Illustrazione 18: caratteristiche del server lette dal file “server.php” Come si legge dall'illustrazione 18, il nodo che fornisce la pagina web su cui è in esecuzione il server apache è “freedom”. A questo punto si può simulare un crash del nodo “freedom” attraverso lo shutdown manuale di Heartbeat con il comando /etc/init.d/heartbeat stop al fine di causare il failover del resource-group del nodo “freedom” sul nodo “independence”. Interrompendo Heartbeat su “freedom”si interrompe la comunicazione con l'altro nodo del cluster. Così facendo Heartbeat in esecuzione sul nodo “independence”, non ricevendo più segnali da “freedom” (da nessuno dei canali di comunicazione ridondati), stabilisce che l'erogazione del gruppo di 135 servizi forniti da “freedom” ha subito un'interruzione e provvede così ad eseguire il take-over del resource-group di “freedom”. I messaggi emessi da Heartbeat su independence, sono inseriti nel file /var/log/ha-log visualizzati di seguito. Illustrazione 19: messaggi di Heartbeat su "independence" L'illustrazione 19, mostra la sequenza di operazioni eseguite da Heartbeat per effettuare il take-over del resource-group di freedom e mostra inoltre i messaggi che denotano l'interruzione dei collegamenti seriale ed ethernet, con il nodo “freedom”. La situazione così simulata si può verificare in seguito a varie cause: il crash del nodo; l'interruzione irreversibile del server apache, e in tal caso è mon che forza l'interruzione di Heartbeat; l'isolamento del nodo dall'esterno, a causa dell'interruzione del canale eth2 e in questo caso il plugin “ipfail” di Heartbeat genera il take-over del resource group di “freedom” su “independence”. 136 Ecco come appare adesso lo stato del server. Illustrazione 20: caratteristiche server apache su "independence" Alla fine del take-over delle risorse su “independence”, il servizio apache che risponde all'indirizzo 193.206.185.XXX ha subito un'interruzione di pochi secondi dopodichè il nodo “independence” si è fatto carico del servizio come dimostrato dall'illustrazione 20 che mostra lo stesso file server.php (dato che è situato sul DRBD block-device, dunque condiviso fra i nodi), che nell'illustrazione 18 era erogato dal nodo “freedom”. Quando il nodo “freedom” viene riavviato, si provvede a rimetterlo nel cluster facendo ripartire Heartbeat con il comando /etc/init.d/heartbeat start. 137 A questo punto, secondo l'impostazione “auto_failback on” specificata nel file ha.cf, il resource group del nodo “freedom” viene automaticamente migrato da “independence”, cosicchè il server apache e l'alias IP 193.206.185.XXX tornano ad essere erogati dal nodo “freedom” secondo l'impostazione predefinita specificata nel file haresources. In questo stato, la pagina PHP server.php erogata dal cluster è la stessa visualizzata nell'illustrazione 18. Il corretto funzionamento del cluster è possibile monitorarlo anche attraverso Webmin, infatti puntando il browser all'IP di ognuno dei nodi alla porta 10000, dopo aver effettuato il login, è possibile aprire le pagine inerenti “mon” ed “Heartbeat”. La pagina relativa a “mon” viene aggiornata ad intervalli regloari e mostra attraverso colorazioni particolari lo stato del monitoraggio. Illustrazione 21: modulo Webmin relativo a "mon" 138 Attraverso l'interfaccia Webmin visualizzata nell'illustrazione 21 è inoltre possibile eseguire diverse operazioni di gestione e configurazione del programma “mon”. Il modulo Webmin relativo a Heartbeat permette una gestione completa della suite e consente inoltre di eseguire il take-over dei resource-group attraverso l'interfaccia grafica come si può vedere nell'illustrazione 22. Illustrazione 22: modulo Webmin relativo a Heartbeat Come si può notare il take-over può essere eseguito semplicemente premendo i pulsanti visualizzati nell'illustrazione 22. Dalla stessa illustrazione si può notare la diversa colorazione relativa allo stato delle risorse in quanto la visualizzazione è riferita al nodo “freedom” per cui risultano attive, di colore verde, le risorse erogate da tale nodo. 139 APPENDICE 140 FILE DI CONFIGURAZIONE A1. /etc/fstab /dev/sda1 /boot ext2 noauto,noatime 1 1 /dev/sda3 / ext3 noatime 0 0 /dev/sda2 none swap sw 0 0 /dev/sda5 /usr ext3 noatime 0 0 /dev/sda6 /var ext3 noatime 0 0 /dev/sda7 /tmp ext3 noexec,nosuid 0 0 /dev/sda8 /opt ext3 noatime 0 0 /dev/sda9 /home ext3 nosuid 0 0 /dev/nbd/0 /bind ext3 noatime,noauto 0 0 /dev/nbd/1 /sendmail ext3 noatime,noauto 0 0 /dev/cdroms/cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0 /dev/fd0 /mnt/floppy vfat noauto 0 0 # NOTE: The next line is critical for boot! none /proc proc defaults 0 0 # glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for # POSIX shared memory (shm_open, shm_unlink). # (tmpfs is a dynamically expandable/shrinkable ramdisk, and will # use almost no memory if not populated with files) # Adding the following line to /etc/fstab should take care of this: none /dev/shm tmpfs defaults 0 0 A2. /etc/make.conf # Copyright 2000-2002 Daniel Robbins, Gentoo Technologies, Inc. # Contains local system settings for Portage system # Please review 'man make.conf' for more information. # Build-time functionality # ======================== # # The USE variable is used to enable optional build-time functionality. For # example, quite a few packages have optional X, gtk or GNOME functionality # that can only be enabled or disabled at compile-time. Gentoo Linux has a # very extensive set of USE variables described in our USE variable HOWTO at # http://www.gentoo.org/doc/use-howto.html # # The available list of use flags with descriptions is in your portage tree. # Use 'less' to view them: --> less /usr/portage/profiles/use.desc <-# # Example: #USE="X gtk gnome -alsa" USE="php" # Host Setting # ============ # 141 # If you are using a Pentium Pro or greater processor, leave this line asis; # otherwise, change to i586, i486 or i386 as appropriate. All modern systems # (even Athlons) should use "i686-pc-linux-gnu" # CHOST="i686-pc-linux-gnu" # Host and optimization settings # ============================== # # For optimal performance, enable a CFLAGS setting appropriate for your CPU # # -mcpu=<cpu-type> means optimize code for the particular type of CPU without # breaking compatibility with other CPUs. # # -march=<cpu-type> means to take full advantage of the ABI and instructions # for the particular CPU; this will break compatibility with older CPUs (for # example, -march=athlon-xp code will not run on a regular Athlon, and # -march=i686 code will not run on a Pentium Classic. # # CPU types supported in gcc-3.2 and higher: athlon-xp, athlon-mp, athlon4, # athlon-tbird, athlon, k6, k6-2, k6-3, i386, i486, i586 (Pentium), i686 # (PentiumPro), pentium, pentium-mmx, pentiumpro, pentium2 (Celeron), pentium3, # and pentium4. Note that Gentoo Linux 1.4 and higher include at least gcc3.2. # # CPU types supported in gcc-2.95*: k6, i386, i486, i586 (Pentium), i686 # (Pentium Pro), pentium, pentiumpro Gentoo Linux 1.2 and below use gcc2.95* # # Decent examples: # #CFLAGS="-mcpu=athlon-xp -O3 -pipe" CFLAGS="-O3 -march=pentium4 -funroll-loops -pipe" # If you set a CFLAGS above, then this line will set your default C++ flags to # the same settings. If you don't set CFLAGS above, then comment this line out. CXXFLAGS="${CFLAGS}" # Advanced Masking # ================ # # Gentoo is using a new masking system to allow for easier stability testing # on packages. KEYWORDS are used in ebuilds to mask and unmask packages based # on the platform they are set for. A special form has been added that # indicates packages and revisions that are expected to work, but have not yet # been approved for the stable set. '~arch' is a superset of 'arch' which # includes the unstable, in testing, packages. Users of the 'x86' architecture # would add '~x86' to ACCEPT_KEYWORDS to enable unstable/testing packages. # '~ppc', '~sparc', '~sparc64' are the unstable KEYWORDS for their respective # platforms. DO NOT PUT ANYTHING BUT YOUR SPECIFIC ~ARCHITECTURE IN THE LIST. # IF YOU ARE UNSURE OF YOUR ARCH, OR THE IMPLICATIONS, DO NOT MODIFY THIS. # #ACCEPT_KEYWORDS="~arch" 142 # Portage Directories # =================== # # Each of these settings controls an aspect of portage's storage and file # system usage. If you change any of these, be sure it is available when # you try to use portage. *** DO NOT INCLUDE A TRAILING "/" *** # # PORTAGE_TMPDIR is the location portage will use for compilations and # temporary storage of data. This can get VERY large depending upon # the application being installed. PORTAGE_TMPDIR="/var/tmp" # # PORTDIR is the location of the portage tree. This is the repository # for all profile information as well as all ebuilds. This directory # itself can reach 200M. WE DO NOT RECOMMEND that you change this. PORTDIR="/usr/portage" # # DISTDIR is where all of the source code tarballs will be placed for # emerges. The source code is maintained here unless you delete # it. The entire repository of tarballs for gentoo is 9G. This is # considerably more than any user will ever download. 2-3G is # a large DISTDIR. DISTDIR="${PORTDIR}/distfiles" # # PKGDIR is the location of binary packages that you can have created # with '--buildpkg' or '-b' while emerging a package. This can get # upto several hundred megs, or even a few gigs. PKGDIR="${PORTDIR}/packages" # # PORTDIR_OVERLAY is a directory where local ebuilds may be stored without # concern that they will be deleted by rsync updates. Default is not # defined. #PORTDIR_OVERLAY="/usr/local/portage" # Fetching files # ============== # # If you need to set a proxy for wget or lukemftp, add the appropriate "export # ftp_proxy=<proxy>" and "export http_proxy=<proxy>" lines to /etc/profile if # all users on your system should use them. # # Portage uses wget by default. Here are some settings for some alternate # downloaders -- note that you need to merge these programs first before they # will be available. # # Lukemftp (BSD ftp): #FETCHCOMMAND="/usr/bin/lukemftp -s -a -o \${DISTDIR}/\${FILE} \${URI}" #RESUMECOMMAND="/usr/bin/lukemftp -s -a -R -o \${DISTDIR}/\${FILE} \${URI}" # # Prozilla (turbo downloader) #FETCHCOMMAND='/usr/bin/proz --no-getch -s ${URI} -P ${DISTDIR}' # Advanced Features # ================= # # MAKEOPTS provides extra options that may be passed to 'make' when a # program is compiled. Presently the only use is for specifying # the number of parallel makes (-j) to perform. The suggested number # for parallel makes is CPUs+1. MAKEOPTS="-j3" # # AUTOCLEAN enables portage to automatically clean out older or overlapping # packages from the system after every successful merge. This is the 143 # same as running 'emerge -c' after every merge. Set with: "yes" or "no". #AUTOCLEAN="yes" # # FEATURES are settings that affect the functionality of portage. Most of # these settings are for developer use, but some are available to non# developers as well. 'buildpkg' is an always-on setting for the emerge # flag of the same name. It causes binary packages to be created of all # packages that are merged. #FEATURES="sandbox ccache buildpkg" # # RSYNC_RETRIES sets the number of times portage will attempt to retrieve # a current portage tree before it exits with an error. This allows # for a more successful retrieval without user intervention most times. #RSYNC_RETRIES="3" GENTOO_MIRRORS="http://ftp.snt.utwente.nl/pub/os/linux/gentoo ftp://ftp.tuclausthal.de/pub/linux/gentoo/ http://212.219.247.11/sites/www.ibiblio.org/gentoo/ http://212.219.247.15/sites/www.ibiblio.org/gentoo/ ftp://ftp.iasi.roedu.net/pub/mirrors/gentoo.org/" A3. /etc/lilo.conf boot=/dev/sda map=/boot/System.map install=/boot/boot.b prompt timeout=30 lba32 default=2.4.26 vga=789 image=/boot/bzImage initrd=/boot/initrd-2.4.20-gentoo-r8 label=2.4.20-g-r8 read-only root=/dev/sda3 image=/boot/kernel-2.4.25 label=2.4.25 read-only root=/dev/sda3 image=/boot/kernel-2.4.26 label=2.4.26 read-only root=/dev/sda3 A4. /usr/src/linux/.config CONFIG_X86=y CONFIG_UID16=y CONFIG_EXPERIMENTAL=y 144 CONFIG_MODULES=y CONFIG_MODVERSIONS=y CONFIG_KMOD=y CONFIG_MPENTIUM4=y CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_CMPXCHG=y CONFIG_X86_XADD=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_X86_HAS_TSC=y CONFIG_X86_GOOD_APIC=y CONFIG_X86_PGE=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_F00F_WORKS_OK=y CONFIG_NOHIGHMEM=y CONFIG_MTRR=y CONFIG_SMP=y CONFIG_NR_CPUS=32 CONFIG_X86_TSC=y CONFIG_HAVE_DEC_LOCK=y CONFIG_NET=y CONFIG_X86_IO_APIC=y CONFIG_X86_LOCAL_APIC=y CONFIG_PCI=y CONFIG_PCI_GOANY=y CONFIG_PCI_BIOS=y CONFIG_PCI_DIRECT=y CONFIG_PCI_NAMES=y CONFIG_HOTPLUG=y CONFIG_SYSVIPC=y CONFIG_SYSCTL=y CONFIG_KCORE_ELF=y CONFIG_BINFMT_AOUT=y CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y CONFIG_ACPI_BOOT=y CONFIG_PARPORT=m CONFIG_PARPORT_PC=m CONFIG_PARPORT_PC_CML1=m CONFIG_PARPORT_PC_FIFO=y CONFIG_PARPORT_PC_SUPERIO=y CONFIG_PARPORT_OTHER=y CONFIG_PARPORT_1284=y CONFIG_PNP=m CONFIG_ISAPNP=m CONFIG_BLK_DEV_FD=m CONFIG_PARIDE=m CONFIG_PARIDE_PARPORT=m CONFIG_PARIDE_PD=m CONFIG_PARIDE_PCD=m 145 CONFIG_PARIDE_PF=m CONFIG_PARIDE_PT=m CONFIG_PARIDE_PG=m CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=8192 CONFIG_BLK_DEV_INITRD=y CONFIG_PACKET=y CONFIG_PACKET_MMAP=y CONFIG_NETFILTER=y CONFIG_FILTER=y CONFIG_UNIX=y CONFIG_INET=y CONFIG_IP_NF_CONNTRACK=m CONFIG_IP_NF_FTP=m CONFIG_IP_NF_AMANDA=m CONFIG_IP_NF_TFTP=m CONFIG_IP_NF_IRC=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m CONFIG_IP_NF_MATCH_MULTIPORT=m CONFIG_IP_NF_MATCH_TOS=m CONFIG_IP_NF_MATCH_RECENT=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_DSCP=m CONFIG_IP_NF_MATCH_AH_ESP=m CONFIG_IP_NF_MATCH_LENGTH=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_MATCH_TCPMSS=m CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_NAT_AMANDA=m CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_NAT_TFTP=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_TOS=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_MARK=m CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y 146 CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_STROKE=y CONFIG_BLK_DEV_IDECD=y CONFIG_BLK_DEV_IDETAPE=m CONFIG_BLK_DEV_IDEFLOPPY=m CONFIG_BLK_DEV_IDESCSI=m CONFIG_BLK_DEV_CMD640=y CONFIG_BLK_DEV_CMD640_ENHANCED=y CONFIG_BLK_DEV_IDEPCI=y CONFIG_IDEPCI_SHARE_IRQ=y CONFIG_BLK_DEV_IDEDMA_PCI=y CONFIG_IDEDMA_PCI_AUTO=y CONFIG_BLK_DEV_IDEDMA=y CONFIG_BLK_DEV_AEC62XX=y CONFIG_BLK_DEV_ALI15X3=y CONFIG_BLK_DEV_AMD74XX=y CONFIG_BLK_DEV_CMD64X=y CONFIG_BLK_DEV_CY82C693=y CONFIG_BLK_DEV_CS5530=y CONFIG_BLK_DEV_HPT34X=y CONFIG_BLK_DEV_HPT366=y CONFIG_BLK_DEV_PIIX=y CONFIG_BLK_DEV_NS87415=y CONFIG_BLK_DEV_OPTI621=y CONFIG_BLK_DEV_RZ1000=y CONFIG_BLK_DEV_SVWKS=y CONFIG_BLK_DEV_SIS5513=y CONFIG_BLK_DEV_SLC90E66=y CONFIG_BLK_DEV_TRM290=y CONFIG_BLK_DEV_VIA82CXXX=y CONFIG_IDEDMA_AUTO=y CONFIG_BLK_DEV_ATARAID=m CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_SD_EXTRA_DEVS=40 CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=y CONFIG_SR_EXTRA_DEVS=2 CONFIG_CHR_DEV_SG=y CONFIG_SCSI_DEBUG_QUEUES=y CONFIG_SCSI_MULTI_LUN=y CONFIG_SCSI_DPT_I2O=y CONFIG_NETDEVICES=y CONFIG_DUMMY=m CONFIG_BONDING=m CONFIG_EQUALIZER=y CONFIG_TUN=m CONFIG_ETHERTAP=y CONFIG_NET_ETHERNET=y CONFIG_HAPPYMEAL=m CONFIG_SUNGEM=m CONFIG_NET_VENDOR_3COM=y CONFIG_VORTEX=m CONFIG_NET_VENDOR_SMC=y 147 CONFIG_NET_VENDOR_RACAL=y CONFIG_HP100=m CONFIG_NET_PCI=y CONFIG_PCNET32=m CONFIG_ADAPTEC_STARFIRE=m CONFIG_TULIP=m CONFIG_DE4X5=m CONFIG_DGRS=m CONFIG_DM9102=m CONFIG_EEPRO100=m CONFIG_E100=m CONFIG_FEALNX=m CONFIG_NATSEMI=m CONFIG_NE2K_PCI=m CONFIG_8139CP=m CONFIG_8139TOO=m CONFIG_8139TOO_8129=y CONFIG_SIS900=m CONFIG_EPIC100=m CONFIG_SUNDANCE=m CONFIG_TLAN=m CONFIG_VIA_RHINE=m CONFIG_WINBOND_840=m CONFIG_NET_POCKET=y CONFIG_ACENIC=m CONFIG_DL2K=m CONFIG_E1000=y CONFIG_NS83820=m CONFIG_HAMACHI=m CONFIG_YELLOWFIN=m CONFIG_R8169=m CONFIG_SK98LIN=m CONFIG_TIGON3=m CONFIG_INPUT=y CONFIG_INPUT_KEYBDEV=y CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_SERIAL=m CONFIG_SERIAL_NONSTANDARD=y CONFIG_COMPUTONE=m CONFIG_ROCKETPORT=m CONFIG_CYCLADES=m CONFIG_CYZ_INTR=y CONFIG_DIGIEPCA=m CONFIG_MOXA_INTELLIO=m CONFIG_MOXA_SMARTIO=m CONFIG_ISI=m CONFIG_SYNCLINK=m CONFIG_SYNCLINKMP=m CONFIG_N_HDLC=m CONFIG_RISCOM8=m CONFIG_SPECIALIX=m CONFIG_SPECIALIX_RTSCTS=y CONFIG_SX=m 148 CONFIG_RIO=m CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 CONFIG_PRINTER=m CONFIG_MOUSE=y CONFIG_PSMOUSE=y CONFIG_82C710_MOUSE=m CONFIG_RTC=y CONFIG_AUTOFS_FS=m CONFIG_AUTOFS4_FS=m CONFIG_REISERFS_FS=y CONFIG_EXT3_FS=y CONFIG_JBD=y CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_UMSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_CRAMFS=m CONFIG_TMPFS=y CONFIG_RAMFS=y CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_PROC_FS=y CONFIG_DEVFS_FS=y CONFIG_DEVFS_MOUNT=y CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y CONFIG_SYSV_FS=m CONFIG_ZISOFS_FS=y CONFIG_PARTITION_ADVANCED=y CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y CONFIG_MINIX_SUBPARTITION=y CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y CONFIG_LDM_PARTITION=y CONFIG_SUN_PARTITION=y CONFIG_EFI_PARTITION=y CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=m CONFIG_NLS_CODEPAGE_737=m CONFIG_NLS_CODEPAGE_775=m CONFIG_NLS_CODEPAGE_850=m CONFIG_NLS_CODEPAGE_852=m CONFIG_NLS_CODEPAGE_855=m CONFIG_NLS_CODEPAGE_857=m CONFIG_NLS_CODEPAGE_860=m CONFIG_NLS_CODEPAGE_861=m CONFIG_NLS_CODEPAGE_862=m CONFIG_NLS_CODEPAGE_863=m CONFIG_NLS_CODEPAGE_864=m CONFIG_NLS_CODEPAGE_865=m 149 CONFIG_NLS_CODEPAGE_866=m CONFIG_NLS_CODEPAGE_869=m CONFIG_NLS_CODEPAGE_936=m CONFIG_NLS_CODEPAGE_950=m CONFIG_NLS_CODEPAGE_932=m CONFIG_NLS_CODEPAGE_949=m CONFIG_NLS_CODEPAGE_874=m CONFIG_NLS_ISO8859_8=m CONFIG_NLS_CODEPAGE_1250=m CONFIG_NLS_CODEPAGE_1251=m CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_2=m CONFIG_NLS_ISO8859_3=m CONFIG_NLS_ISO8859_4=m CONFIG_NLS_ISO8859_5=m CONFIG_NLS_ISO8859_6=m CONFIG_NLS_ISO8859_7=m CONFIG_NLS_ISO8859_9=m CONFIG_NLS_ISO8859_13=m CONFIG_NLS_ISO8859_14=m CONFIG_NLS_ISO8859_15=m CONFIG_NLS_KOI8_R=m CONFIG_NLS_KOI8_U=m CONFIG_NLS_UTF8=m CONFIG_VGA_CONSOLE=y CONFIG_VIDEO_SELECT=y CONFIG_FB=y CONFIG_DUMMY_CONSOLE=y CONFIG_FB_VESA=y CONFIG_VIDEO_SELECT=y CONFIG_FBCON_CFB8=y CONFIG_FBCON_CFB16=y CONFIG_FBCON_CFB24=y CONFIG_FBCON_CFB32=y CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y CONFIG_LOG_BUF_SHIFT=0 CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m A4 /etc/conf.d/net iface_eth2="193.206.185.XXX broadcast 255.255.255.0" iface_bond0="192.168.0.1 broadcast 255.255.255.0" gateway="eth2/193.206.185.1" 193.206.185.255 netmask 192.168.0.255 netmask A5. /root/.bash_profile alias l='ls --color' 150 alias cd..='cd ..;l' alias la='l -a' alias ll='l -l' A6. /root/.bashrc alias alias alias alias l='ls --color' cd..='cd ..;l' la='l -a' ll='l -l' A7. /etc/drbd.conf resource drbd0 { #BIND protocol=C fsckcmd=fsck -p -y net { sync-max=100M tl-size=10000 timeout=60 connect-int=10 ping-int=10 } on freedom { #HA1 device=/dev/nbd/0 disk=/dev/sda10 address=192.168.0.1 port=7788 } on independence { #HA2 device=/dev/nbd/0 disk=/dev/sda10 address=192.168.0.2 port=7788 } } resource drbd1 { #SENDMAIL protocol=C fsckcmd=fsck -p -y net { sync-max=100M tl-size=10000 timeout=60 connect-int=10 ping-int=10 } on freedom { #HA1 device=/dev/nbd/1 disk=/dev/sda11 address=192.168.0.1 151 port=7789 } on independence { #HA2 device=/dev/nbd/1 disk=/dev/sda11 address=192.168.0.2 port=7789 } } A8. /etc/ha.d/haresources freedom 193.206.185.XXX datadisk::drbd0 apache2 #qui vanno gli script di avvio dei servizi da avviare in HA su freedom independence 193.206.185.XXX datadisk::drbd1 #qui vanno gli script di avvio dei servizi da avviare in HA su independence A9. /etc/ha.d/ha.cf debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 #intervallo di heartbeat deadtime 5 #tempo minimo per essere considerato down initdead 120 #tempo necessario al boot auto_failback on #Il Resource Group torna automaticamente al ritorno del nodo se l'opzione è on serial /dev/ttyS0 #device seriale baud 19200 #velocità seriale udpport 694 #porta usata per le comunicazioni in bcast (bond0) bcast bond0 #interfaccia di comunicazione interna node freedom #nome nodo come specificato in uname -n node independence apiauth respawn ipfail uid=hacluster hacluster /usr/lib/heartbeat/ipfail #comando da monitorare e rieseguire verifica la connessione esterna respawn root /usr/bin/swatch -t /var/log/ha-log -t /var/log/messages respawn root /usr/sbin/mon ping 193.206.185.1 #indirizzo da interrogare per verificare il #funzionamento della rete esterna A10. /etc/mon.d/mon.cf alertdir mondir = /usr/lib/mon/alert.d = /usr/lib/mon/mon.d 152 logdir = /var/log/mon.d statedir = /var/lib/mon.d authfile = /etc/mon/auth.cf maxprocs = 20 histlength = 100 randstart = 60s # # define groups of hosts to monitor # hostgroup test_apache2 193.206.185.XXX watch test_apache2 service apache2 interval 5s monitor http.monitor period wd {Mon-Sun} hr {0-23} alertafter 2 alert mail.alert root@localhost alert apache2-restart.alert service apache2-takeover interval 5s monitor http.monitor period wd {Mon-Sun} hr {0-23} alertafter 3 30m numalerts 1 alert mail.alert -S "Apache2 non riparte, provvedo a fermare heartbeat per causare il takeover" root@localhost alert haStop.alert A11. /etc/mon.d/auth.cf command section list: all reset: root loadstate: root savestate: root version: all reload auth: root servertime: all list failures: all list successes: all list state: all monitor: all A12. /root/.swatchrc watchfor /dead/ echo bold undersore blink bell write root continue watchfor /shutdown/ echo bold undersore blink bell 153 write root continue watchfor /Gratuitous Arp/ echo blink bell write root continue watchfor /takeover/ echo undersore bell write root continue watchfor /transition/ echo bold undersore blink bell write root continue watchfor /down/ echo bold undersore blink bell write root continue A13. Script mon http.alert #!/bin/sh /etc/init.d/apache2 restart A14. Script mon stopha.alert #!/bin/sh /etc/init.d/heartbeat stopha.alert 154 The GNU General Public License (GPL) Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. 155 Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS MODIFICATION FOR COPYING, DISTRIBUTION AND 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be 156 licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, 157 c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the 158 conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we 159 sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the program's name and a brief idea of what it does. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 160 PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice This General Public License does not your program into proprietary programs. subroutine library, you may consider permit linking proprietary applications this is what you want to do, use the Public License instead of this License. permit incorporating If your program is a it more useful to with the library. If GNU Library General 161 162 BIBLIOGRAFIA 1. Pradeep K. Sinha, Distributed Operating Systems: concept and design, IEEE Press New York, NY, 1997 2. Dal sito http://linux.cineca.it/linuxlab4.html Dispense Cineca: Laboratorio cluster Linux, setup per l'erogazione di servizi 3. Dal sito http://www.faqs.org/docs/linux_network/ Olaf Kirk, NAG, The Linux Network Administrator Guide 4. Dal sito http://www.drbd.org/documentation.html Philipp Reisner et al., Documentazione completa sul “DRBD” 5. Alan Robertson, Heartbeat programming tutorial, Ottawa Linux Symposium, 2003 (www.linux-ha.org/heartbeat) 6. Richard Petersen, Linux: guida completa, McGawHill Milano, 1996. 7. Dal sito http://www.kernel.org/pub/linux/kernel/people/marcelo/linux2.4/Documentation/networking/bonding.txt: Thomas Davis, Linux Ethernet Bonding Driver mini-howto 8. Dal sito http://www.gentoo.it/handbook/handbook.html Daniel Robbins et al., manuale del sistema operativo Gentoo/Linux 163