Storage persistente: la memoria a lungo termine nell'era dei container
Pubblicato: 2023-04-17L'archiviazione persistente si riferisce alla conservazione dei dati in modo non volatile in modo che rimangano disponibili anche dopo lo spegnimento o il riavvio di un dispositivo o di un'applicazione. L'archiviazione e il recupero dei dati consentono alle applicazioni Web di salvare le informazioni e gli stati dell'utente e di funzionare in modo affidabile.
Nelle applicazioni monolitiche, l'accesso allo storage è semplice perché il server e lo storage convivono. Tuttavia, i sistemi geograficamente distribuiti rendono l'accesso più complesso, in quanto il sistema di archiviazione deve rimanere disponibile per tutti i componenti in tutto il mondo.
La containerizzazione complica ulteriormente il problema perché i container sono leggeri, senza stato ed effimeri, caratteristiche inadatte per l'archiviazione dei dati. Pertanto, qualsiasi soluzione di storage persistente deve essere in grado di funzionare perfettamente con i container, aggiungendo un ulteriore livello di complessità.
Questo articolo approfondisce l'archiviazione persistente esplorandone i tipi, l'architettura e i casi d'uso. Fornisce inoltre una dimostrazione pratica che illustra la differenza tra l'archiviazione del volume e l'archiviazione del volume persistente in Docker.
Tipi di archiviazione persistente
Esistono diversi tipi di storage non volatile, inclusi i tradizionali dischi rotanti (dischi rigidi o HDD), unità a stato solido (SSD), NAS (Network-Attached Storage) e SAN (Storage Area Network).
- Gli HDD sono dispositivi di archiviazione dati elettromeccanici che memorizzano e recuperano dati digitali utilizzando dischi rotanti di supporti magnetici. I dischi utilizzano testine magnetiche su un braccio attuatore mobile che leggono e scrivono dati.
- Gli SSD , a volte chiamati dispositivi di archiviazione a semiconduttore, dispositivi a stato solido o dischi a stato solido, utilizzano gruppi di circuiti integrati per archiviare i dati in modo persistente, solitamente utilizzando dispositivi flash interconnessi che non contengono parti mobili. La loro natura stazionaria li rende più veloci e più affidabili degli HDD.
- L'archiviazione collegata alla rete è un gruppo di HDD, SSD o entrambi, collegati tramite una rete locale utilizzando un file system come il New Technology File System (NTFS) o il quarto file system esteso (EXT4).
- Le SAN sono dispositivi di archiviazione a livello di blocco ad alta velocità collegati in rete, come le librerie a nastro o gli array di dischi. La loro connessione appare al sistema operativo come memoria locale e non è accessibile attraverso la rete locale (LAN).
Architettura di archiviazione persistente
Esistono tre approcci all'archiviazione persistente, ciascuno con casi d'uso e limitazioni univoci.
Oggetto Architettura persistente
L'approccio all'architettura persistente dell'oggetto utilizza l'ORM (object-relational mapping) per archiviare i dati come oggetti in un database relazionale o di valore-chiave. Questo approccio è utile quando i dati non hanno uno schema definito, poiché l'ORM ne gestisce l'archiviazione e il recupero.
Blocca l'architettura persistente
L'architettura persistente a blocchi utilizza dispositivi di archiviazione a livello di blocco, utili per l'archiviazione di file di grandi dimensioni. Questo approccio è vantaggioso quando si archiviano grandi quantità di dati, poiché è possibile utilizzare più blocchi per aumentare la capacità di archiviazione.
Architettura persistente dell'archivio file
Come suggerisce il nome, l'approccio dell'architettura persistente filestore utilizza un file system per memorizzare i dati. Un metodo prevede l'utilizzo di server di database, che forniscono un modo centralizzato di archiviazione dei dati. Le soluzioni di cloud hosting come Kinsta utilizzano server di database facilmente collegati alle applicazioni e offrono persistenza.
L'architettura persistente di Filestore è utile nelle applicazioni che richiedono il recupero frequente di file e quando è necessaria un'interfaccia per gestirli.
Casi d'uso di archiviazione persistente
Questa sezione illustra alcuni dei casi d'uso di ciascun tipo di archiviazione.
Archiviazione persistente degli oggetti
- Archiviazione cloud: l'archiviazione persistente degli oggetti viene comunemente utilizzata nelle soluzioni di archiviazione cloud per archiviare e recuperare grandi quantità di dati non strutturati, come immagini, video e documenti. I fornitori di servizi cloud utilizzano l'object storage per fornire ai clienti servizi di archiviazione scalabili, altamente disponibili e durevoli.
- Analisi dei big data: l'archiviazione persistente degli oggetti viene utilizzata nell'analisi dei big data per archiviare e gestire set di dati di grandi dimensioni spesso utilizzati per l'analisi dei dati, l'apprendimento automatico e l'intelligenza artificiale. L'object storage consente di accedere ai dati in modo rapido ed efficiente, rendendolo un componente chiave delle architetture di big data.
- Reti di distribuzione dei contenuti: l'archiviazione persistente degli oggetti viene utilizzata nelle reti di distribuzione dei contenuti (CDN) per archiviare e distribuire contenuti, come immagini, video e file statici, attraverso una rete globale di server. L'object storage consente ai CDN di fornire contenuti ad alta velocità agli utenti di tutto il mondo, indipendentemente dalla loro posizione.
Blocca l'archiviazione persistente
- Calcolo ad alte prestazioni (HPC) : ambienti HPC elaborazione rapida ed efficiente di volumi considerevoli di dati. Lo storage persistente a blocchi consente ai cluster HPC di archiviare e recuperare set di dati di grandi dimensioni, come simulazioni scientifiche, modelli meteorologici e analisi finanziarie. Lo storage a blocchi è spesso preferito per l'HPC perché fornisce accesso ai dati ad alte prestazioni e bassa latenza e consente operazioni di input/output (I/O) parallele, che possono migliorare significativamente i tempi di elaborazione.
- Editing video: le applicazioni di editing video richiedono prestazioni elevate e accesso a bassa latenza a file video di grandi dimensioni. Devono inoltre supportare un numero significativo di operazioni di I/O al secondo e una bassa latenza per il rendering e l'editing di file video in tempo reale. L'archiviazione a blocchi fornisce queste funzionalità, rendendola una soluzione ideale per i flussi di lavoro di editing video.
- Gioco: le applicazioni di gioco richiedono anche prestazioni elevate e bassa latenza per accedere alle risorse di gioco e ai dati dei giocatori. Lo storage a blocchi memorizza e recupera rapidamente grandi quantità di dati, assicurando che gli ambienti di gioco si carichino prontamente e rimangano reattivi durante il gioco.
Filestore Archiviazione persistente
- Media e intrattenimento: le applicazioni di editing video, animazione e rendering utilizzano comunemente l'archiviazione persistente. Queste applicazioni richiedono un accesso ad alte prestazioni e bassa latenza a file multimediali di grandi dimensioni, come video, audio e immagini. Filestore fornisce un file system condiviso a cui possono accedere più client, rendendolo una soluzione di archiviazione ideale per queste applicazioni.
- Gestione dei contenuti Web: i sistemi di gestione dei contenuti Web (CMS) utilizzano l'archiviazione persistente di filestore nei file system condivisi per archiviare e gestire i contenuti dei siti Web, come testo, immagini e file multimediali. Filestore fornisce una posizione centrale per il contenuto del sito Web, semplificandone la gestione e l'aggiornamento. Consente inoltre a più utenti di lavorare contemporaneamente sullo stesso contenuto, migliorando la collaborazione e la produttività.
Stoccaggio persistente in contenitori
I container sono leggeri, portatili, sicuri e semplici, offrendo una fusione tra diverse applicazioni. Devono disporre di un meccanismo per rendere persistenti i dati tra il riavvio e la rimozione del contenitore. I contenitori hanno l'archiviazione dei file o un file system come le applicazioni tradizionali, ma ogni volta che li ricostruisci con nuove modifiche, perdi tutti i dati non persistenti.
Ecco perché i contenitori offrono la possibilità di includere l'archiviazione del volume o montare un volume di archiviazione. I contenitori trattano i volumi di archiviazione come una directory. Tutti i dati scritti sul volume vanno nel file system host.
L'archiviazione persistente per i contenitori deve funzionare in questo modo perché il riavvio di un contenitore crea una nuova istanza ed elimina la vecchia istanza. Se un contenitore non dispone di una visualizzazione coerente dei dati, i dati scompariranno al riavvio del contenitore. Un volume di archiviazione conserva i dati tra le sessioni e i riavvii del contenitore, consentendo al contenitore di mantenere il proprio stato anche se viene spostato o riavviato.
Volume vs volume persistente
I contenitori forniscono 2 modi per archiviare dati persistenti: utilizzando volumi e volumi persistenti. C'è una differenza significativa tra loro. Un contenitore gestisce i dati nell'archiviazione del volume. Quando arresti un contenitore, i dati rimangono e sono disponibili quando riavvii il contenitore. Tuttavia, quando elimini o rimuovi un contenitore, i dati vengono persi poiché elimini anche l'archiviazione del volume sottostante.
L'archiviazione persistente del volume o i montaggi di bind è un modo per archiviare i dati all'esterno del file system del contenitore. In questo modo, i dati non vengono persi anche quando elimini il contenitore. È persistente finché non viene eliminato manualmente.
La sezione seguente illustra entrambi i tipi di volume con esempi.
Demo dell'archiviazione persistente del contenitore
Abbiamo creato una piccola applicazione Web per dimostrare l'archiviazione persistente con i contenitori Docker. Puoi proseguire installando Docker e recuperando il codice da questo repository GitHub.
L'applicazione è una forma elementare con 2 campi per l'input dell'utente:
- Titolo
- Testo del documento
Dopo aver salvato l'input dell'utente, è possibile accedervi aprendo il file nella directory di feedback con il nome fornito nel campo Titolo . L'input dal campo Testo documento è il contenuto del file.
Come utilizzare l'archiviazione del volume
Dopo aver installato l'applicazione sul proprio computer, può utilizzare l'archiviazione del volume come mostrato nel Dockerfile .
Ora crei l'immagine ed esegui il contenitore. Per fare ciò, eseguire i seguenti comandi.
docker build -t feedback-node:volumes . docker run -d -p 3000:80 --name feedback-app feedback-node:volumes
Una volta eseguita l'applicazione, passare a localhost:3000 per inviare feedback.
Fare clic su Salva e passare a localhost:3000/feedback/test.txt per verificare se l'input è stato memorizzato correttamente o meno.
Rimuovi e riavvia il contenitore per vedere se l'input persiste.
docker stop feedback-app docker start feedback-app
Se ora visiti lo stesso URL, vedrai che il feedback è ancora presente. Ma cosa succede se rimuovi il contenitore e lo riavvii?
docker stop feedback-app docker rm feedback-app docker run -d -p 3000:80 --name feedback-app feedback-node:volumes
Una volta riavviato, se ritorni a quell'URL, non esiste più perché i dati sono stati persi quando hai rimosso il contenitore. I dati del volume persistono solo quando si arresta il contenitore, non quando lo si rimuove.
Per mitigare questo problema e rendere persistenti i dati anche quando si rimuove il contenitore, è necessario utilizzare l'archiviazione del volume persistente o l'archiviazione denominata. Innanzitutto, dovresti ripulire i contenitori e le immagini.
docker stop feedback-app docker rm feedback-app docker rmi feedback-node:volumes
Come utilizzare l'archiviazione del volume persistente
Prima di eseguire il test, è necessario rimuovere l'attributo VOLUME dal Dockerfile e ricostruire l'immagine.
docker build -t feedback-node:volumes . docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes
Come puoi vedere, nel secondo comando, usi il flag -v
per definire il volume persistente all'esterno del contenitore, che persiste anche quando rimuovi il contenitore.
Come nel passaggio precedente, prova ad aggiungere feedback e ad accedervi dopo aver arrestato, rimosso e riavviato il contenitore.
docker stop feedback-app docker rm feedback-app docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes
Come vedi, anche dopo aver fermato e rimosso il contenitore, i dati sono accessibili e rimangono.
Riepilogo
Lo storage persistente è vitale per le applicazioni containerizzate perché consente la persistenza dei dati al di fuori del ciclo di vita di un container. I 2 tipi principali di archiviazione persistente per le applicazioni containerizzate sono volumi e montaggi di bind, ciascuno con i suoi vantaggi e casi d'uso.
I volumi vengono archiviati all'interno del file system del contenitore, mentre i montaggi di bind sono direttamente accessibili sulla macchina host.
Lo storage persistente consente la condivisione dei dati tra i container, rendendo possibile la creazione di applicazioni complesse e multilivello. Lo storage persistente è essenziale per garantire la stabilità e la continuità delle applicazioni containerizzate, fornendo un modo affidabile e flessibile per archiviare dati cruciali.
E se state utilizzando Docker per sviluppare le vostre applicazioni web, scoprirete che è un gioco da ragazzi configurare le distribuzioni di Dockerfile con il servizio di hosting delle applicazioni di Kinsta.