Per sopperire alle problematiche dei sistemi centralizzati, dovuti alla scalabilità limitata ed all’alta sensibilità ai guasti, sono stati introdotti i sistemi distribuiti, i quali sono delle macchine che collaborano per il raggiungimento di un obiettivo prestabilito.
Cos’è un sistema distribuito
Per sistema distribuito si intende una collezione di macchine indipendenti, che collaborano ed eseguono porzioni dello stesso task, dando all’utente l’impressione di agire come un singolo sistema. Ogni macchina del sistema è comunque in grado di lavorare in modo indipendente, quindi non solo in collaborazione con le altre.
L’informatico e matematico statunitense Lamport, divenuto popolare per i suoi studi nell’ambito del calcolo distribuito, nel 1987 fece la seguente affermazione:
“Un utente non scopre la presenza di un sistema distribuito fino a quando un guasto ad una macchina di cui non ne ha mai sentito parlare non gli fa completare la propria attività”.
Anche se a dirla tutta, questa definizione va in contrasto con le caratteristiche cruciali dei sistemi distribuiti che vedremo in seguito.
Un sistema distribuito può essere costituito da pc che hanno hardware e software differente, di conseguenza per agevolare la collaborazione tra queste macchine viene utilizzato uno strato di middleware (su di esso poi vengono implementate le applicazioni distribuite).
Tra gli esempi più lampanti di sistemi distribuiti possono considerare i seguenti esempi:
- una rete di workstation;
- una rete peer-to-peer;
- una griglia computazionale;
- un sistema cloud;
- una rete di sensori.
Si possono realizzare dei sistemi distribuiti tramite i servizi messi a disposizione dai grandi colossi della tecnologia come Amazon con AWS, Microsoft con Azure e Google con Cloud Computing.
Obiettivi di un sistema distribuito
Ma quali sono in sostanza gli obiettivi di un sistema distribuito? Perchè vengono realizzati?
- Per dare la possibilità agli utenti di poter accedere alle proprie risorse non solo sul computer locale, ma anche da dispositivi remoti;
- Un sistema distribuito deve essere in primis trasparente, ovvero gli utenti lo devono percepire come una singola macchina e non come una collezione di dispositivi che collaborano;
- Per aumentare la scalabilità dei sistemi tradizionali. In passato per aumentare le prestazioni bisognava sostituire la macchina con una più potente, con i sistemi distribuiti, invece, basta aggiungere un ulteriore macchina al sistema e far eseguire i task in parallelo;
- Per aumentare la tolleranza ai guasti. Infatti, uno dei problemi principali dei sistemi centralizzati è proprio la situazione in cui il server (o macchina centrale) si guasti. Nei sistemi centralizzati anche se una macchina cessa di funzionare, ci sono altre macchine che possono completare il task e il sistema continua ad essere attivo.
Se vuoi dare un’occhiata al mio progetto di sistemi distribuiti per l’Unical trovi tutti i dettagli in questa pagina.
Trasparenza nei sistemi distribuiti
Come già anticipato nel paragrafo precedente, la trasparenza è il principale obiettivo di un sistema distribuito. Grazie ad essa ogni utente che si interfaccia con un sistema distribuito lo percepisce come sistema singolo.
Ci sono, però, diversi livelli di trasparenza:
- Accesso, l’utente non ha alcuna informazione su come avvenga l’accesso alla risorsa;
- Locazione, l’utente non è in grado di sapere dove la risorsa effettivamente si trovi;
- Migrazione, l’utente non percepisce lo spostamento di codice da una macchina all’altra mentre utilizza il sistema. Infatti, l’unica priorità dell’utente è poter accedere alla risorsa in qualsiasi posto essa si trovi;
- Rilocazione, si tratta di un tipo di migrazione dinamica che avviene a run time. Ovvero, non viene trasferito solo il codice da una macchina all’altra ma direttamente il processo con tutte le informazioni di contorno (come ad esempio i dati dei registri, ecc…);
- Replicazione, l’utente non è detto che accede alla risorsa sempre tramite lo stesso nodo del sistema. La replicazione, infatti, permette proprio di avere più copie degli stessi dati spalmati in nodi diversi, per sopperire ad eventuali situazioni di centralizzazione e sovraccarico di determinati nodi;
- Concorrenza, l’utente non sa chi e quanti altri come lui stanno consumando gli stessi contenuti. Ad esempio, mentre guardiamo un video su YouTube, chi sono le altre persone che lo guardano contemporaneamente?
- Fallimenti e Guasti, anche se un nodo fallisce il sistema è in grado di continuare l’esecuzione non facendo percepire alcun cambiamento agli utenti. Ad esempio, se un server diventa non disponibile, si possono reindirizzare le richieste su un altro server.
- Persistenza, nasconde se una risorsa software si trovi in memoria centrale o nel disco.
Complicazioni nei sistemi distribuiti
Ovviamente, realizzare un sistema distribuito significa mettere in comunicazione e far collaborare più macchine. Questo comporta la nascita di una serie di problematiche, come ad esempio:
- la consistenza, avere dei dati replicati su più nodi comporta la possibilità di avere versioni di essi non aggiornate;
- la sincronizzazione, non avendo un clock globale non è possibile avere un unico riferimento temporale per sincronizzare tutti i processi distribuiti (anche qui compare Lamport con il suo algoritmo per la sincronizzazione);
- la mutua esclusione, come fare in modo che l’accesso ad una determinata risorsa avvenga tramite da parte di singoli processi per volta?
- l’elezione di un coordinatore, il quale si tratta di un processo o macchina che ha il compito di coordinare le azioni di tutti gli altri;
- la tolleranza ai guasti, visto che lo sono per definizione bisogna implementare una serie di meccanismi utili per garantirla;
- la comunicazione tra processi su macchine differenti che non può avvenire tramite memorie condivise ma solamente tramite scambio di messaggi;
- il bilanciamento del carico di lavoro tra i vari nodi della rete che deve avvenire tramite tecniche di migrazione statica o dinamica.