Storacle - armazenamento descentralizado de arquivos

Storacle - armazenamento descentralizado de arquivos

Antes de começar, devo sair link para artigo anteriorpara que fique claro do que exatamente estamos falando.

Neste artigo gostaria de ver a camada responsável pelo armazenamento de arquivos e como ela pode ser usada por qualquer pessoa. Storacle é uma biblioteca independente, não há conexão direta com a música. Você pode organizar o armazenamento de qualquer arquivo.

No artigo anterior, “rolei um pouco o barril” ipfs, mas isso aconteceu justamente no contexto do problema que eu estava resolvendo. No geral, acho esse projeto legal. Prefiro apenas a capacidade de criar redes diferentes para tarefas diferentes. Isso permite organizar melhor a estrutura e reduzir a carga em nós individuais e na rede como um todo. Mesmo no âmbito de um projeto, se necessário, é possível dividir a rede em partes de acordo com alguns critérios, reduzindo a carga geral.

Então o storagele usa o mecanismo espalhavel para organizar uma rede. Características principais:

  • Os arquivos podem ser adicionados ao repositório por meio de qualquer nó.
  • Os arquivos são salvos inteiramente, não em blocos.
  • Cada arquivo possui seu próprio hash de conteúdo exclusivo para trabalho posterior com ele.
  • Os arquivos podem ser duplicados para maior confiabilidade
  • O número de arquivos em um nó é limitado apenas pelo sistema de arquivos (há uma exceção, mais sobre isso abaixo)
  • A quantidade de arquivos na rede é limitada pelas capacidades de propagação de acordo com a quantidade de nós válidos na rede, que na segunda versão poderá trabalhar com um número infinito de nós (mais sobre isso em outro artigo)

Um exemplo simples de como isso geralmente funciona no programa:

Servidor:

const  Node = require('storacle').Node;

(async () => {
  try {
    const node = new Node({
      port: 4000,
      hostname: 'localhost'
    });
    await node.init();
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

Cliente:

const  Client = require('storacle').Client;

(async () => {
  try {
    const client = new  Client({
      address: 'localhost:4000'
    });
    await client.init();
    const hash = await client.storeFile('./my-file');
    const link = await client.getFileLink(hash); 
    await client.removeFile(hash);
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

Visão interna

Não há nada sofisticado sob o capô. Informações sobre o número de arquivos, seu tamanho total e outros pontos são armazenados em um banco de dados na memória e são atualizados quando os arquivos são excluídos e adicionados, portanto, não há necessidade de acessar frequentemente o sistema de arquivos. Uma exceção é habilitar o coletor de lixo quando você precisar circular arquivos quando um determinado tamanho de armazenamento for atingido, e não proibir a adição de novos. Nesse caso, você terá que ignorar o armazenamento e trabalhar com um grande número de arquivos (> digamos um milhão) pode levar a cargas significativas. E é melhor armazenar menos arquivos e executar mais nós. Se o "limpador" estiver desabilitado, esse problema não existe.

O armazenamento de arquivos consiste em 256 pastas e 2 níveis de aninhamento. Os arquivos são armazenados em pastas de segundo nível. Isto é, se houver 1 milhão. Haverá cerca de 62500 arquivos em cada pasta (1000000 / sqrt(256)).

Os nomes das pastas são formados a partir do hash do arquivo para que você possa acessá-lo rapidamente se souber o hash.

Esta estrutura foi escolhida com base em um grande número de diferentes requisitos de armazenamento: suporte para sistemas de arquivos fracos, onde não é desejável ter muitos arquivos em uma pasta, passagem rápida de todas as pastas se necessário, etc. Algum tipo de meio-termo.

cache

Ao adicionar arquivos, bem como ao recebê-los, os links para os arquivos são gravados no cache.
Graças a isso, muitas vezes não há necessidade de percorrer toda a rede em busca de um arquivo. Isso agiliza o recebimento de links e reduz a carga na rede. O cache também ocorre por meio de cabeçalhos http.

Isomorfia

O cliente é escrito em javascript e é isomórfico, podendo ser utilizado diretamente do navegador. 
Você pode fazer upload do arquivo https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js como um script e acesso janela.ClientStoracle ou importar através do sistema de compilação, etc.

Links diferidos

Uma característica interessante também é a “referência diferida”. Este é um link para um arquivo que pode ser obtido de forma síncrona, aqui e agora, e o arquivo será extraído quando já for encontrado no armazenamento. Isso é muito conveniente quando, por exemplo, você precisa mostrar algumas fotos no site. Acabamos de colocar um link diferido em src e pronto. Você pode inventar muitos casos.

API do cliente

  • async Cliente.prototype.storeFile() - salvando o arquivo
  • async Cliente.prototype.getFileLink() — obtendo um link direto para o arquivo
  • async Cliente.prototype.getFileLinks() — obter uma lista de links diretos para um arquivo de todos os nós onde ele existe
  • async Cliente.prototype.getFileToBuffer() - coloque o arquivo no buffer
  • async Cliente.prototype.getFileToPath() - coloca um arquivo no sistema de arquivos
  • async Cliente.prototype.getFileToBlob() — obtenha o arquivo no blob (para versão do navegador)
  • async Cliente.prototype.removeFile() - excluir um arquivo
  • Cliente.prototype.createRequestedFileLink() - crie um link diferido

Exportar arquivos para outro servidor

Para transferir arquivos para outro nó, você pode:

  • Basta copiar toda a pasta de armazenamento junto com as configurações. (isso pode não funcionar no futuro)
  • Copie apenas a pasta com os arquivos. Mas, neste caso, você precisará executar a função uma vez node.normalizeFilesInfo()para recalcular todos os dados e inseri-los no banco de dados.
  • usar função node.exportFiles()que começará a copiar os arquivos.

Configurações básicas do nó
Ao iniciar o nó de armazenamento, você pode especificar todas as configurações necessárias.
Descreverei os mais básicos, o restante pode ser encontrado no Github.

  • armazenamento.dataSize — tamanho da pasta com arquivos
  • armazenamento.tempSize — tamanho da pasta temporária
  • armazenamento.autoCleanSize — o tamanho mínimo de armazenamento que precisa ser mantido. Se você especificar este parâmetro, assim que o espaço começar a acabar, os arquivos menos usados ​​serão excluídos.
  • arquivo.maxSize — tamanho máximo do arquivo
  • arquivo.minSize — tamanho mínimo do arquivo
  • arquivo.preferredDuplicates — número preferido de arquivos duplicados na rede
  • arquivo.mimeWhitelist - tipos de arquivos válidos
  • arquivo.mimeBlacklist - tipos de arquivo inválidos
  • arquivo.extWhitelist - extensões de arquivo válidas
  • arquivo.extlista negra - extensões de arquivo inválidas
  • arquivo.linkCache - várias configurações de cache de link

Quase todos os parâmetros relacionados às dimensões podem ser inseridos em valores absolutos e relativos.

Trabalhando através da linha de comando
A biblioteca pode ser usada através da linha de comando. Para fazer isso, você precisa instalá-lo globalmente: npm i -g armazenamento. Depois disso, você pode iniciar as ações necessárias a partir do diretório do projeto onde está o nó. Por exemplo, storacle -a storeFile -f ./file.txt -c ./config.jspara adicionar o arquivo. Todas as ações podem ser encontradas em https://github.com/ortexx/storacle/blob/master/bin/actions.js

Por que você pode precisar disso?

  • Se você deseja criar algum tipo de projeto descentralizado no qual planeja armazenar e trabalhar com arquivos usando métodos convenientes. Por exemplo, o projeto musical descrito no link no início do artigo usa armazenamento.
  • Se você trabalha em qualquer outro projeto onde precise armazenar arquivos de maneira distribuída. Você pode construir facilmente sua rede fechada, configurar nós com flexibilidade e adicionar novos quando necessário.
  • Se você só precisa armazenar os arquivos do seu site em algum lugar e é demais para você escrever tudo sozinho. Talvez esta biblioteca seja mais adequada do que outras no seu caso.
  • Se você tem um projeto no qual trabalha com arquivos, mas deseja realizar todas as manipulações a partir do navegador. Você pode evitar escrever código do servidor.

Meus contatos:

Fonte: habr.com

Adicionar um comentário