O armazenamento persistente refere-se à retenção de dados de forma não volátil, de modo que permaneçam disponíveis mesmo após um dispositivo ou aplicativo ser desabilitado, ou reiniciado. O armazenamento e recuperação de dados permitem que aplicativos web salvem informações e estados do usuário e operem de forma confiável.

Em aplicativos monolíticos, o acesso ao armazenamento é simples porque o servidor e o armazenamento estão juntos. No entanto, sistemas distribuídos geograficamente tornam o acesso mais complexo, pois o sistema de armazenamento deve permanecer disponível para todos os componentes em todo o mundo.

A conteinerização complica ainda mais a questão, pois contêineres são leves, sem estado e efêmeros — características inadequadas para armazenar dados. Portanto, qualquer solução de armazenamento persistente deve ser capaz de trabalhar de forma integrada com contêineres, adicionando outra camada de complexidade.

A plataforma de Hospedagem de Aplicativos conteinerizada da Kinsta usa volumes persistentes do Kubernetes para associar armazenamento persistente a um ou mais processos de um aplicativo. Os usuários da Kinsta podem definir suas necessidades de armazenamento persistente ao criar aplicativos no painel MyKinsta.

Este artigo oferece um olhar independente de plataforma sobre armazenamento persistente, explorando seus tipos, arquitetura e casos de uso. Ele também fornece uma demonstração prática ilustrando a diferença entre armazenamento de volume e armazenamento de volume persistente no Docker.

Tipos de armazenamento persistente

Existem vários tipos de armazenamento não volátil, incluindo discos giratórios tradicionais (discos rígidos ou HDDs), unidades de estado sólido (SSDs), armazenamento conectado à rede (NAS) e redes de área de armazenamento (SANs).

  • HDDs são dispositivos eletromecânicos de armazenamento de dados que armazenam e recuperam dados digitais usando discos giratórios de mídia magnética. Os discos usam cabeças magnéticas em um braço atuador móvel que lê e escreve dados.
  • SSDs, às vezes chamados de dispositivos de armazenamento semicondutores, dispositivos de estado sólido ou discos de estado sólido, usam conjuntos de circuitos integrados para armazenar dados de forma persistente, geralmente usando dispositivo flash interconectados que não possuem partes para dispositivos móveis. Sua natureza estacionária os torna mais rápidos e confiáveis do que HDDs.
  • Armazenamento conectado à rede é um grupo de HDDs, SSDs ou ambos, conectados por meio de uma rede local usando um sistema de arquivos como o New Technology File System (NTFS) ou o quarto sistema de arquivos estendido (EXT4).
  • SANs são dispositivos de armazenamento em nível de bloco de alta velocidade conectados em rede, como bibliotecas de fitas ou arrays de disco. Sua conexão aparece para o sistema operacional como armazenamento local e não é acessível por meio da rede local (LAN).

Arquitetura de armazenamento persistente

Existem três abordagens para o armazenamento persistente, cada uma com casos de uso e limitações únicas.

Arquitetura persistente de objetos

A abordagem de arquitetura persistente de objetos utiliza mapeamento objeto-relacional (ORM) para armazenar dados como objetos em um banco de dados relacional ou de chave-valor. Esta abordagem é útil quando os dados não têm um esquema definido, já que o ORM cuida de seu armazenamento e recuperação.

Arquitetura persistente de blocos

A arquitetura persistente de blocos usa dispositivos de armazenamento em nível de bloco, úteis para armazenar grandes arquivos. Esta abordagem é benéfica ao armazenar grandes quantidades de dados, pois você pode usar vários blocos para aumentar a capacidade de armazenamento.

Arquitetura persistente de arquivos (Filestore)

Como o nome sugere, a abordagem de arquitetura persistente de arquivos (Filestore) utiliza um sistema de arquivo para armazenar dados. Um método envolve o uso de servidores de banco de dados, que fornecem uma forma centralizada de armazenamento de dados. Soluções de hospedagem em nuvem como as da Kinsta usam servidores de banco de dados que são facilmente acoplados a aplicativos e oferecem persistência.

A arquitetura de armazenamento de arquivos (Filestore) é útil em aplicativos que exigem recuperação frequente de arquivos e quando você precisa de uma interface para gerenciá-los.

Casos de uso de armazenamento persistente

Esta seção discute alguns dos casos de uso de cada tipo de armazenamento.

Armazenamento persistente de objetos

  • Armazenamento em nuvem: O armazenamento persistente de objetos é comumente usado em soluções de armazenamento em nuvem para armazenar e recuperar grandes quantidades de dados não estruturados, tais como imagens, vídeos e documentos. Os provedores de nuvens usam o armazenamento de objetos para fornecer aos clientes serviços de armazenamento escaláveis, altamente disponíveis e duráveis.
  • Grandes análises de dados: O armazenamento persistente de objetos é usado em grandes análises de dados para armazenar e gerenciar grandes conjuntos de dados frequentemente usados para análise de dados, aprendizado de máquinas (Learn Machine) e IA. O armazenamento de objetos permite que os dados sejam acessados rápida e eficientemente, tornando um componente-chave de grandes arquiteturas de dados.
  • Redes de entrega de conteúdo: O armazenamento persistente de objetos é usado em redes de entrega de conteúdo (CDNs) para armazenar e distribuir conteúdo, como imagens, vídeos e arquivos estáticos, através de uma rede global de servidores. O armazenamento de objetos permite que as CDNs entreguem conteúdo de alta velocidade aos usuários em todo o mundo, independentemente da localização.

Armazenamento persistente de blocos

  • Computação de alta performance (HPC): Ambientes HPC: Processamento rápido e eficiente de volumes de dados de grande porte. O armazenamento persistente de blocos permite que clusters de HPC armazenem e recuperem grandes conjuntos de dados, como simulações científicas, modelagem meteorológica e análise financeira. O armazenamento em bloco é frequentemente preferido para HPC porque ele fornece acesso de alto desempenho e baixa latência aos dados e permite operações de entrada/saída (E/S) paralelas, o que pode melhorar significativamente os tempos de processamento.
  • Edição de vídeo: Aplicativos de edição de vídeo requerem acesso de alto desempenho e baixa latência a grandes arquivos de vídeo. Eles também devem acomodar um número significativo de operações de I/O por segundo e baixa latência para renderizar e editar arquivos de vídeo em tempo real. O armazenamento de blocos oferece essas capacidades, tornando-o uma solução ideal para fluxos de trabalho de edição de vídeo.
  • Jogos: Aplicativos de jogos também exigem alto desempenho e baixa latência para acessar ativos de jogos e dados de jogadores. O armazenamento de blocos armazena e recupera rapidamente grandes volumes de dados, garantindo que os ambientes de jogo sejam carregados prontamente e permaneçam responsivos durante o jogo.

Armazenamento de arquivos (Filestore)

  • Mídia e entretenimento: Aplicativos de edição de vídeo, animação e renderização comumente usam armazenamento persistente. Esses aplicativos requerem acesso de alto desempenho e baixa latência a grandes arquivos de mídia, como vídeo, áudio e imagens. O Filestore oferece um sistema de arquivos compartilhado que pode ser acessado por vários clientes, tornando-se uma solução de armazenamento ideal para esses aplicativos.
  • Gerenciamento de conteúdo web: Sistemas de gerenciamento de conteúdo (CMSs) usam o armazenamento persistente de arquivos em sistemas de arquivos compartilhados para armazenar e gerenciar o conteúdo do site, como textos, imagens e arquivos multimídia. O Filestore fornece uma localização central para o conteúdo do site, facilitando o gerenciamento e a atualização do mesmo. Ele também permite que vários usuários trabalhem simultaneamente no mesmo conteúdo, melhorando a colaboração e a produtividade.

Armazenamento persistente em contêineres

Contêineres são leves, portáteis, seguros e simples, oferecendo uma fusão entre diferentes aplicativos. Eles precisam ter um mecanismo para persistir dados entre reinicializações e remoções de contêineres. Contêineres têm armazenamento de arquivos ou um sistema de arquivos como aplicativos tradicionais, mas sempre que você os reconstrói com novas mudanças, perde todos os dados não-persistentes.

É por isso que contêineres oferecem a opção de incluir armazenamento de volume ou montar um volume de armazenamento. Contêineres tratam volumes de armazenamento como um diretório. Qualquer dado escrito no volume vai para o sistema de arquivos do host.

O armazenamento persistente para contêineres deve funcionar dessa forma, porque reiniciar um contêiner cria uma nova instância e descarta a instância antiga. Se um contêiner não tiver uma visão consistente dos dados, os dados desaparecerão quando o contêiner for reiniciado. Um volume de armazenamento preserva os dados entre sessões e reinicializações de contêineres, permitindo que o contêiner mantenha seu estado mesmo se for movido ou reiniciado.

Volume vs Volume persistente

Contêineres fornecem 2 formas de armazenar dados persistentes: usando volumes e volumes persistentes. Há uma diferença significativa entre eles. Um contêiner gerencia os dados em armazenamento de volume. Quando você para um contêiner, os dados permanecem e estão disponíveis quando você reinicia o contêiner. No entanto, quando você exclui ou remove um contêiner, os dados são perdidos, pois você também exclui o armazenamento de volume subjacente.

O armazenamento de volume persistente ou bind mounts é uma forma de armazenar os dados fora do sistema de arquivos do contêiner. Dessa forma, os dados não são perdidos mesmo quando você exclui o contêiner. Eles são persistentes até serem excluídos manualmente.

A seção seguinte demonstra ambos os tipos de volume com exemplos.

Demonstração de armazenamento persistente em contêiner

Criamos um pequeno aplicativo web para demonstrar o armazenamento persistente com contêineres Docker. Você pode acompanhar instalando o Docker e obtendo o código deste repositório GitHub.

O aplicativo é um formulário básico com 2 campos para entrada do usuário:

  • Title
  • Document Text
Screenshot: The demo application's feedback form graphical interface.
Interface gráfica do aplicativo de demonstração com campos de Título e Texto do Documento.

Depois de salvar a entrada do usuário, você pode acessá-la abrindo o arquivo no diretório de feedback com o nome fornecido no campo Title. A entrada do campo Document Text é o conteúdo do arquivo.

Como usar o armazenamento de volume

Uma vez que você tenha instalado o aplicativo em sua própria máquina, ele pode usar o armazenamento de volume como mostrado no Dockerfile.

Screenshot: Contents of the Docker file, including a VOLUME attribute.
Dockerfile mostrando o uso do armazenamento de volume.

Agora, você constrói a imagem e executa o contêiner. Para fazer isso, execute os seguintes comandos.

docker build -t feedback-node:volumes .
docker run -d -p 3000:80 --name feedback-app feedback-node:volumes
Screenshot: Terminal window showing results of the docker build command with volume storage.
Construindo o aplicativo com armazenamento de volume.
Screenshot: Terminal window after executing the docker run command with volume storage.
A execução do contêiner mostra que ele está gerenciando o armazenamento de volume.

Assim que o aplicativo for executado, navegue até o localhost:3000 para enviar o feedback.

Screenshot: Submitting feedback via the demo application's graphical interface.
Enviando feedback para o aplicativo.

Clique em Save e navegue até localhost:3000/feedback/test.txt se a entrada foi armazenada com sucesso ou não.

Screenshot: A browser with the submitted test.txt file open.
Feedback confirmado com sucesso.

Remova e reinicie o contêiner para verificar se a entrada permanece.

docker stop feedback-app
docker start feedback-app

Se você visitar a mesma URL agora, verá que o feedback ainda está lá. Mas o que acontece se você remover o contêiner e reiniciá-lo?

docker stop feedback-app
docker rm feedback-app
docker run -d -p 3000:80 --name feedback-app feedback-node:volumes

Uma vez reiniciado, se você retornar a essa URL, ela não existirá mais porque os dados foram perdidos ao remover o contêiner. Os dados do volume persistem apenas quando o contêiner é interrompido, não quando é removido.

Screenshot: Browser reporting failure to open test.txt file.
Os dados de feedback foram perdidos.

Para mitigar esse problema e manter os dados mesmo ao remover o contêiner, você deve usar armazenamento de volume persistente ou armazenamento nomeado. Primeiramente, você deve limpar os contêineres e as imagens.

docker stop feedback-app
docker rm feedback-app
docker rmi feedback-node:volumes

Como usar o armazenamento persistente de volume

Antes de testar isso, você deve remover o atributo VOLUME do Dockerfile e reconstruir a imagem.

Screenshot: Dockerfile edited to remove VOLUME attribute.
Dockerfile atualizado para remover o atributo VOLUME.
docker build -t feedback-node:volumes .
docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes

Como você pode ver, no segundo comando, você usa a flag -v para definir o volume persistente fora do contêiner, que persiste mesmo quando você remove o contêiner.

Como no passo anterior, tente adicionar feedback e acessá-lo assim que você parar, remover e reiniciar o contêiner.

Screenshot: Entering text in the demo application's feedback form.
Adicionando novo feedback para um teste de persistência.
docker stop feedback-app
docker rm feedback-app
docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes

Como você pode ver, mesmo após parar e remover o contêiner, os dados continuam acessíveis e permanecem intactos.

Screenshot: Browser that has successfully opened the second test file.
Após parar e remover o contêiner, os dados permanecem intactos.

Resumo

O armazenamento persistente é vital para aplicativos em contêineres porque permite a persistência de dados além do ciclo de vida de um contêiner. Os dois principais tipos de armazenamento persistente para aplicativos em contêineres são volumes e montagens vinculadas, cada um com suas vantagens e casos de uso.

Volumes são armazenados no sistema de arquivos do contêiner, enquanto montagens vinculadas são diretamente acessíveis na máquina hospedeira.

O armazenamento persistente possibilita o compartilhamento de dados entre contêineres, possibilitando construir aplicativos complexos de várias camadas. Esse tipo de armazenamento é essencial para garantir a estabilidade e continuidade de aplicativos em contêineres, fornecendo uma maneira confiável e flexível de armazenar dados cruciais.

Você está desenvolvendo um aplicativo que requer armazenamento persistente? Navegue pela nossa biblioteca de exemplos rápidos para ver como implantar seu aplicativo na Kinsta a partir da hospedagem Git como GitHub, GitLab e Bitbucket. Nossa documentação oficial sobre armazenamento persistente ajudará você a colocar seu aplicativo e seus dados on-line rapidamente.

Steve Bonisteel Kinsta

Steve Bonisteel is a Technical Editor at Kinsta who began his writing career as a print journalist, chasing ambulances and fire trucks. He has been covering Internet-related technology since the late 1990s.