Confronto tra SAN e NAS
Una delle maggiori confusioni che ho riscontrato negli ultimi anni è quella tra NAS e SAN. Capire cosa sia ciascuno dei due aiuterà non poco a comprendere dove siano utili e appropriati.
Il nostro primo compito è togliere di mezzo i termini di marketing e passare a quelli tecnici. NAS sta per Network Attached Storage ma non significa esattamente questo, e SAN sta per Storage Area Network ma viene generalmente usato per riferirsi a un dispositivo SAN, non alla rete stessa. Nella sua forma più corretta, una SAN è qualsiasi rete dedicata al traffico di storage, ma nel mondo reale non è così che viene normalmente usato il termine. In questo caso siamo qui per parlare di dispositivi NAS e SAN e di come si confrontano, quindi non useremo la definizione che include la rete anziché il dispositivo. In realtà, sia NAS sia SAN sono termini di marketing e, proprio per questo, sono un po’ sfumati ai margini. Sono abbastanza precisi da essere usati in una normale conversazione tecnica, purché tutte le parti sappiano cosa significhino, ma quando se ne discute il significato dovremmo togliere di mezzo i nomi dal suono accattivante e attenerci alle descrizioni più tecniche. Entrambi i termini, quando usati a fini di marketing, vengono impiegati per sottintendere che si tratti di una certa tecnologia che è stata “trasformata in appliance”, il che rende l’uso dei termini inutilmente complicato ma non più utile.
Quindi il nostro primo compito è definire cosa significhino questi due nomi in un contesto di dispositivo. Entrambi i dispositivi sono server di storage, puro e semplice, soltanto due modi diversi di esporre quello storage verso il mondo esterno.
Il più semplice dei due è la SAN, che è propriamente un dispositivo di storage a blocchi. Qualsiasi dispositivo che espone il proprio storage esternamente come dispositivo a blocchi rientra in questa categoria e può essere usato in modo intercambiabile in base a come viene utilizzato. I dispositivi di storage a blocchi sono i dischi rigidi esterni, il DAS (Direct Attach Storage) e la SAN. Tutti questi sono in realtà la stessa cosa. Lo chiamiamo disco rigido esterno quando lo colleghiamo a un desktop. Lo chiamiamo DAS quando lo colleghiamo a un server. Lo chiamiamo SAN quando aggiungiamo una qualche forma di rete, generalmente uno switch, tra il dispositivo e il dispositivo finale che consuma lo storage. Non c’è alcuna differenza tecnologica tra questi dispositivi. Una SAN tradizionale può essere collegata direttamente a un desktop e usata come un disco rigido esterno. Un disco rigido esterno può essere collegato a uno switch e usato da più dispositivi su una rete. L’interfaccia tra il dispositivo di storage e il sistema che lo utilizza è il blocco. I protocolli comuni per lo storage a blocchi includono iSCSI, Fibre Channel, SAS, eSATA, USB, Thunderbolt, IEEE1394 (alias Firewire), Fibre Channel over Ethernet (FCoE) e ATA over Ethernet (AoE). Un dispositivo che si collega a un dispositivo di storage a blocchi vedrà sempre lo storage presentato come un’unità disco, niente di più.
Un NAS, noto anche come “filer”, è un dispositivo di storage a file. Ciò significa che espone il proprio storage come un filesystem di rete. Quindi qualsiasi dispositivo che si collega a questo storage non vede un’unità disco, ma vede invece un filesystem montabile. Quando un NAS non è confezionato come appliance, lo chiamiamo semplicemente file server, e quasi tutti i dispositivi informatici, dai desktop ai server, includono in qualche misura questa funzionalità. I protocolli comuni per i dispositivi di storage a file includono NFS, SMB / CIFS e AFP. Ce ne sono però molti altri, e tecnicamente esistono protocolli di storage a file per casi particolari come FTP e HTTP che dovrebbero qualificarsi anch’essi. Come esempio estremo, un tradizionale web server è una forma molto specializzata di dispositivo di storage a file.
Ciò che distingue i dispositivi di storage a blocchi da quelli di storage a file è il tipo di interfaccia che presentano al mondo esterno o, per pensarla in un altro modo, dove avviene la divisione tra dispositivo server e dispositivo client all’interno dello stack di storage.
È diventato estremamente comune oggi che i dispositivi di storage includano sia lo storage a blocchi sia lo storage a file dallo stesso dispositivo. I sistemi che fanno questo si chiamano storage unificato. Con lo storage unificato, il fatto che si possa dire che si comporti come un dispositivo di storage a blocchi o a file (SAN o NAS nel linguaggio comune) o entrambi dipende dal comportamento che si configura per il dispositivo, non da ciò che si acquista. Questo è importante perché ribadisce il concetto che si tratta puramente di una distinzione di protocollo o di interfaccia, e non di dimensione, capacità, affidabilità, prestazioni, funzionalità, ecc.
Entrambi i tipi di dispositivo hanno l’opzione, ma non l’obbligo, di fornire funzionalità estese al di sotto del “punto di demarcazione” in cui consegnano lo storage verso l’esterno. Entrambi possono, o meno, fornire RAID, gestione di volumi logici, monitoraggio, ecc. Lo storage a file (NAS) può anche fornire funzionalità di filesystem come le ACL di Windows NTFS.
Il vantaggio chiave dello storage a blocchi è che ai sistemi che vi si collegano viene data l’opportunità di manipolare il sistema di storage come se fosse un’unità disco tradizionale. Ciò significa che il RAID e la gestione di volumi logici, che potrebbero essere già stati eseguiti nella “scatola nera” del dispositivo di storage, possono ora essere eseguiti di nuovo, se lo si desidera, a un livello superiore. I dispositivi client non sono consapevoli di che tipo di dispositivo stiano vedendo, ma solo del fatto che appare come un’unità disco. Quindi si può scegliere di fidarsene (assumere che disponga di un RAID di livello adeguato, ad esempio) oppure si possono combinare più dispositivi di storage a blocchi insieme in RAID proprio come se fossero normali dischi locali. Questo è estremamente raro ma è un’opzione interessante, ed esistono prodotti progettati per essere usati in questo modo.
Più comunemente, una gestione di volumi logici come Linux LVM, Solaris ZFS o Windows Dynamic Disks viene applicata al di sopra dello storage a blocchi esposto dal dispositivo e poi, al di sopra di questa, verrebbe impiegato un filesystem. È importante ricordarlo: con i dispositivi di storage a blocchi il filesystem viene creato e gestito dal dispositivo client, non dal dispositivo di storage. Il dispositivo di storage è beatamente all’oscuro di come venga usato lo storage a blocchi che sta presentando e consente all’utente finale di usarlo come meglio crede con il pieno controllo. Questo si estende fino al punto che si possono concatenare dispositivi di storage a blocchi, con uno che fornisce lo storage al successivo, magari combinati in gruppi RAID – i dispositivi di storage a blocchi possono essere stratificati, più o meno, indefinitamente.
In alternativa, un dispositivo di storage a file contiene tutta la porzione a blocchi dello storage, quindi qualsiasi opportunità di RAID, gestione di volumi logici e monitoraggio deve essere gestita dal dispositivo di storage a file. Poi, al di sopra dello storage a blocchi, viene applicato un filesystem. Comunemente questo sarebbe EXT4 di Linux, ZFS di FreeBSD e Solaris, NTFS di Windows, ma altri filesystem come WAFL, XFS, JFS, BtrFS, UFS e altri ancora sono certamente possibili. Su questo filesystem verranno archiviati i dati. Per poi condividere questi dati con il mondo esterno viene usato un filesystem di rete (noto anche come filesystem distribuito) che fornisce un’interfaccia di filesystem abilitata alla rete – NFS, SMB e AFP sono i più comuni ma, come in qualsiasi famiglia di protocolli, esistono numerose possibilità per casi particolari ed esotiche.
Un dispositivo remoto che voglia usare lo storage sul dispositivo di storage a file lo vedrebbe sulla rete allo stesso modo in cui vedrebbe un filesystem locale ed è in grado di montarlo in maniera identica. Questo rende lo storage a file particolarmente facile e immediato da usare per il consumatore finale, poiché è molto naturale sotto ogni aspetto. Usiamo i filesystem di rete ogni giorno per il normale lavoro su desktop. Quando “mappiamo un’unità” in Windows, ad esempio, stiamo usando un filesystem di rete.
Una differenziazione critica tra storage a blocchi e storage a file che deve essere distinta è che, sebbene entrambi possano potenzialmente trovarsi su una rete e consentire a più macchine client di collegarsi ad essi, solo i dispositivi di storage a file hanno la capacità di arbitrare quell’accesso. Questo è molto importante e non può essere liquidato con leggerezza.
Lo storage a blocchi appare come un’unità disco. Se si collega semplicemente un’unità disco a due o più computer contemporaneamente, si può immaginare cosa accadrà – ciascuno non saprà nulla dell’altro e sarà ignaro dei nuovi file creati e di altri modificati, e i sistemi inizieranno rapidamente a sovrascriversi a vicenda. Se il filesystem è di sola lettura su tutti i nodi, questo non è un problema. Ma se un qualsiasi sistema sta scrivendo o modificando i dati, gli altri avranno problemi. Questo si traduce generalmente in una corruzione dei dati molto rapidamente, tipicamente nell’ordine dei minuti. Per vedere questo in azione estrema, immaginate di avere due o tre sistemi client che credano tutti di avere accesso esclusivo a un’unità disco e fateli deframmentare tutti nello stesso momento. Tutti i dati sull’unità verranno scombinati in pochi secondi.
Un dispositivo di storage a file, d’altra parte, ha un arbitraggio naturale poiché il filesystem di rete gestisce le comunicazioni per l’accesso al filesystem reale e i filesystem, per loro natura, sono naturalmente multiutente. Quindi, se un sistema collegato a un dispositivo di storage a file apporta una modifica, tutti i sistemi ne sono immediatamente consapevoli e non si “pesteranno i piedi a vicenda”. Anche se tentassero di farlo, il filesystem del dispositivo di storage a file arbitra l’accesso e ha l’ultima parola e non lascia che ciò accada. Questo rende la condivisione dei dati facile e trasparente per gli utenti finali. (Uso qui il termine “utenti finali” per includere gli amministratori di sistema.)
Questo non significa che non esista alcun mezzo per condividere lo storage da un dispositivo a blocchi, ma l’arbitraggio di tale condivisione non può essere gestito dal dispositivo di storage a blocchi stesso. I dispositivi di storage a blocchi vengono resi “condivisibili” usando ciò che è noto come clustered file system. Questi tipi di filesystem ebbero origine all’epoca in cui i cluster di server condividevano le risorse di storage avendo due server collegati con un controller SCSI a ciascuna estremità di un singolo cavo SCSI e con le unità condivise collegate al centro del cavo. L’unico mezzo con cui i server potevano comunicare era attraverso il filesystem stesso, e così furono sviluppati speciali clustered file system che consentivano che vi fossero comunicazioni tra i dispositivi, avvisando ciascuno delle modifiche apportate dall’altro, attraverso il filesystem stesso. Questo funziona in realtà sorprendentemente bene, ma i clustered file system sono relativamente poco comuni, con GFS di Red Hat e OCFS di Oracle tra i più noti nel mondo dei server tradizionali e con il molto più recente VMFS di VMWare divenuto estremamente noto grazie al suo utilizzo per lo storage di virtualizzazione. Gli utenti normali, inclusi gli amministratori di sistema, potrebbero non avere accesso ai clustered file system o potrebbero avere esigenze che non ne consentono l’uso. Da notare in modo importante è anche che l’arbitraggio è gestito tramite fiducia, non tramite imposizione, come avviene con un dispositivo di storage a file. Con un dispositivo di storage a file, il dispositivo stesso gestisce l’arbitraggio dell’accesso e non c’è modo di aggirarlo. Con i dispositivi di storage a blocchi che usano un clustered file system, qualsiasi dispositivo che si colleghi allo storage può ignorare il clustered file system e semplicemente bypassare l’arbitraggio passivo – questo è così semplice che normalmente accadrebbe per caso. Può accadere quando si monta il filesystem e si specifica il tipo di filesystem errato, oppure a causa di un’unità che si comporta in modo anomalo o di qualsiasi azione malevola. Quindi la sicurezza dell’accesso è fondamentale a livello di rete per proteggere lo storage a livello di blocco.
Il concetto di fondo che viene qui messo in luce è che i dispositivi di storage a blocchi sono dispositivi “stupidi” (pensate a un’unità disco potenziata) e i dispositivi di storage a file sono dispositivi “intelligenti” (pensate a un server tradizionale). I dispositivi di storage a file devono contenere un “computer” completo e funzionante con CPU, memoria, storage, filesystem e rete. I dispositivi di storage a blocchi possono contenere queste cose ma non è necessario. Nella loro forma più semplice, i dispositivi di storage a blocchi possono essere nient’altro che un’unità disco con un adattatore USB o Ethernet collegato ad essa. In realtà non è raro che siano nient’altro che un controller RAID a cui sono collegati adattatori Ethernet o Fibre Channel.
In entrambi i casi, dispositivo di storage a blocchi e dispositivo di storage a file, possiamo scalare verso il basso fino a dispositivi banalmente semplici o scalare verso l’alto fino a enormi sistemi “di classe mainframe” a disponibilità ultra-elevata. Entrambi possono essere veloci o lenti. Uno non è migliore o peggiore, uno non è più alto o più basso, uno non è più o meno enterprise – sono diversi e servono in generale a scopi diversi. E ci sono funzionalità avanzate che l’uno o l’altro possono contenere o meno. La sfida sta nel sapere quale sia giusto per quale lavoro.
Mi piace pensare ai protocolli di storage a blocchi come a uno stream di “standard output”, proprio come su una riga di comando. Quindi il livello di base di qualsiasi “pipeline” di storage è sempre un dispositivo a blocchi, e possono esistere numerosi dispositivi a blocchi o trasformazioni, ciascuno collegato in pipe all’altro, finché l’output rimane un protocollo di storage a blocchi. Terminiamo la catena solo quando applichiamo un filesystem. In questo modo RAID hardware, RAID di rete, gestione di volumi logici, ecc. possono essere applicati in molteplici combinazioni secondo necessità. Lo storage a blocchi non è davvero solo blocchi di dati, ma i mattoni costitutivi dei sistemi di storage.
Un punto molto interessante è che, poiché i dispositivi di storage a blocchi possono essere concatenati e poiché i dispositivi di storage di rete devono accettare lo storage a blocchi come loro “input”, è in realtà piuttosto comune che un dispositivo di storage a blocchi (SAN) venga usato come storage di base per un dispositivo di storage a file (NAS), specialmente nei sistemi di fascia alta. Possono coesistere all’interno di un unico chassis oppure possono lavorare in modo cooperativo sulla rete.
