Armazenamento persistente: memória de longo prazo na era dos contêineres
Publicados: 2023-04-17O armazenamento persistente refere-se à retenção de dados de maneira não volátil, de modo que permaneça disponível mesmo depois que um dispositivo ou aplicativo for desligado ou reiniciado. O armazenamento e a recuperação de dados permitem que os aplicativos da Web salvem informações e estados do usuário e operem de maneira confiável.
Em aplicativos monolíticos, o acesso ao armazenamento é direto porque o servidor e o armazenamento vivem 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 o problema porque os 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 funcionar perfeitamente com contêineres, adicionando outra camada de complexidade.
Este artigo investiga o armazenamento persistente explorando seus tipos, arquitetura e casos de uso. Ele também fornece uma demonstração prática que ilustra 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 (unidades de disco rígido 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çotes magnéticos em um braço atuador móvel que lê e grava dados.
- SSDs , às vezes chamados de dispositivos de armazenamento de semicondutores, dispositivos de estado sólido ou discos de estado sólido, usam conjuntos de circuitos integrados para armazenar dados persistentemente, geralmente usando dispositivos flash interconectados sem partes móveis. Sua natureza estacionária os torna mais rápidos e confiáveis do que os HDDs.
- O 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 em rede, como bibliotecas de fitas ou matrizes de disco. Sua conexão aparece para o sistema operacional como armazenamento local e não é acessível através da rede local (LAN).
Arquitetura de armazenamento persistente
Existem três abordagens para armazenamento persistente, cada uma com casos de uso e limitações exclusivos.
Arquitetura Persistente de Objeto
A abordagem de arquitetura persistente de objeto usa mapeamento relacional de objeto (ORM) para armazenar dados como objetos em um banco de dados relacional ou de valor-chave. Essa abordagem é útil quando os dados não possuem um esquema definido, pois o ORM cuida de seu armazenamento e recuperação.
Bloquear Arquitetura Persistente
A arquitetura persistente de bloco usa dispositivos de armazenamento em nível de bloco, que são úteis ao armazenar arquivos grandes. Essa abordagem é benéfica ao armazenar grandes quantidades de dados, pois você pode usar vários blocos para aumentar a capacidade de armazenamento.
Arquitetura Persistente do Filestore
Como o nome sugere, a abordagem de arquitetura persistente de armazenamento de arquivos usa um sistema de arquivos para armazenar dados. Um método envolve o uso de servidores de banco de dados, que fornecem uma maneira centralizada de armazenar dados. As soluções de hospedagem em nuvem como Kinsta usam servidores de banco de dados que são facilmente conectados a aplicativos e oferecem persistência.
A arquitetura persistente do 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 Objeto
- 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, como imagens, vídeos e documentos. Os provedores de nuvem usam armazenamento de objetos para fornecer aos clientes serviços de armazenamento escaláveis, altamente disponíveis e duráveis.
- Análise de big data: o armazenamento persistente de objetos é usado na análise de big data para armazenar e gerenciar grandes conjuntos de dados frequentemente usados para análise de dados, aprendizado de máquina e IA. O armazenamento de objetos permite que os dados sejam acessados de forma rápida e eficiente, tornando-se um componente chave das arquiteturas de big data.
- 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, em uma rede global de servidores. O armazenamento de objetos permite que os CDNs forneçam conteúdo de alta velocidade para usuários em todo o mundo, independentemente da localização.
Bloquear armazenamento persistente
- Computação de alto desempenho (HPC) : Ambientes HPC processamento rápido e eficiente de volumes consideráveis de dados. O armazenamento persistente em bloco permite que os clusters HPC armazenem e recuperem grandes conjuntos de dados, como simulações científicas, modelagem meteorológica e análise financeira. O armazenamento em bloco geralmente é preferido para HPC porque fornece acesso de alto desempenho e baixa latência aos dados e permite operações paralelas de entrada/saída (E/S), que podem melhorar significativamente os tempos de processamento.
- Edição de vídeo: os aplicativos de edição de vídeo exigem acesso de alto desempenho e baixa latência a arquivos de vídeo grandes. Eles também devem acomodar um número significativo de operações de E/S por segundo e baixa latência para renderizar e editar arquivos de vídeo em tempo real. O armazenamento em bloco fornece esses recursos, tornando-o uma solução ideal para fluxos de trabalho de edição de vídeo.
- Jogos: os aplicativos de jogos também exigem alto desempenho e baixa latência para acessar os recursos do jogo e os dados do jogador. O armazenamento em bloco armazena e recupera rapidamente grandes quantidades de dados, garantindo que os ambientes do jogo carreguem prontamente e permaneçam responsivos durante o jogo.
Armazenamento Persistente Filestore
- Mídia e entretenimento: aplicativos de edição, animação e renderização de vídeo geralmente usam armazenamento persistente. Esses aplicativos exigem acesso de alto desempenho e baixa latência a grandes arquivos de mídia, como vídeo, áudio e imagens. O Filestore fornece um sistema de arquivos compartilhado que pode ser acessado por vários clientes, tornando-o uma solução de armazenamento ideal para esses aplicativos.
- Gerenciamento de conteúdo da Web: Os sistemas de gerenciamento de conteúdo da Web (CMSs) usam armazenamento persistente de armazenamento de arquivos em sistemas de arquivos compartilhados para armazenar e gerenciar o conteúdo do site, como texto, imagens e arquivos multimídia. O Filestore fornece um local central para o conteúdo do site, facilitando o gerenciamento e a atualização. 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
Os contêineres são leves, portáteis, seguros e diretos, oferecendo uma fusão entre diferentes aplicações. Eles devem ter um mecanismo para manter os dados entre as reinicializações e a remoção do contêiner. Os contêineres têm armazenamento de arquivos ou um sistema de arquivos como os aplicativos tradicionais, mas sempre que você os reconstrói com novas alterações, perde todos os dados não persistentes.
É por isso que os contêineres oferecem a opção de incluir armazenamento de volume ou montar um volume de armazenamento. Os contêineres tratam os volumes de armazenamento como um diretório. Todos os dados gravados no volume vão para o sistema de arquivos do host.
O armazenamento persistente para contêineres deve funcionar dessa maneira porque reiniciar um contêiner cria uma nova instância e descarta a instância antiga. Se um contêiner não tiver uma exibição consistente dos dados, os dados desaparecerão quando o contêiner for reiniciado. Um volume de armazenamento preserva os dados entre as sessões e as reinicializações do contêiner, permitindo que o contêiner mantenha seu estado mesmo que seja movido ou reiniciado.
Volume x Volume Persistente
Os contêineres fornecem 2 maneiras de armazenar dados persistentes: usando volumes e volumes persistentes. Há uma diferença significativa entre eles. Um contêiner gerencia os dados no armazenamento de volume. Quando você para um contêiner, os dados permanecem e ficam 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.
Armazenamento de volume persistente ou montagens de ligação é uma maneira 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. É persistente até ser excluído manualmente.
A seção a seguir demonstra os dois tipos de volume com exemplos.
Demonstração de armazenamento persistente de contêiner
Criamos um pequeno aplicativo da Web para demonstrar armazenamento persistente com contêineres do Docker. Você pode acompanhar instalando o Docker e pegando o código deste repositório GitHub.
O aplicativo é um formulário elementar com 2 campos para entrada do usuário:
- Título
- Texto do Documento
Depois de salvar a entrada do usuário, você pode acessá-la abrindo o arquivo no diretório de comentários com o nome fornecido no campo Título . A entrada do campo Document Text é o conteúdo do arquivo.
Como usar o armazenamento de volume
Depois de instalar o aplicativo em sua própria máquina, ele pode usar o armazenamento de volume conforme mostrado no Dockerfile .
Agora, você cria 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
Depois que o aplicativo for executado, navegue até localhost:3000 para enviar comentários.
Clique em Salvar e navegue até localhost:3000/feedback/test.txt para ver se a entrada foi armazenada com sucesso ou não.
Remova e reinicie o contêiner para ver se a entrada persiste.
docker stop feedback-app docker start feedback-app
Se você agora visitar o mesmo URL, 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 esse URL, ele não existirá mais porque os dados foram perdidos quando você removeu o contêiner. Os dados de volume persistem apenas ao parar o contêiner, não ao removê-lo.
Para atenuar esse problema e persistir os dados mesmo quando você remover o contêiner, deve-se usar armazenamento de volume persistente ou armazenamento nomeado. Primeiro, 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 de volume persistente
Antes de testar isso, você deve remover o atributo VOLUME do Dockerfile e reconstruir a imagem.
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 o sinalizador -v
para definir o volume persistente fora do contêiner, que persiste mesmo quando você remove o contêiner.
Como na etapa anterior, tente adicionar comentários e acesse-os assim que parar, remover e reiniciar o contêiner.
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ê vê, mesmo depois de parar e remover o contêiner, os dados são acessíveis e permanecem.
Resumo
O armazenamento persistente é vital para aplicativos em contêiner porque permite dados persistentes fora do ciclo de vida de um contêiner. Os 2 principais tipos de armazenamento persistente para aplicativos em contêineres são volumes e montagens de ligação, cada um com seus benefícios e casos de uso.
Os volumes são armazenados no sistema de arquivos do contêiner, enquanto as montagens vinculadas podem ser acessadas diretamente na máquina host.
O armazenamento persistente permite que os dados sejam compartilhados entre contêineres, possibilitando a criação de aplicativos complexos de várias camadas. O armazenamento persistente é essencial para garantir a estabilidade e a continuidade dos aplicativos em contêineres, fornecendo uma maneira confiável e flexível de armazenar dados cruciais.
E se você estiver usando o Docker para desenvolver seus aplicativos da web, descobrirá que é muito fácil configurar as implantações do Dockerfile com o serviço de hospedagem de aplicativos da Kinsta.