Storacle — um armazenamento de arquivos descentralizado

Storacle — um armazenamento de arquivos descentralizado

Antes de começar, devo deixar um link para o artigo anterior, para que fique claro sobre o que estamos falando.

Neste artigo, gostaria de discutir a camada que é responsável pelo armazenamento de arquivos e como isso pode ser utilizado por qualquer pessoa. Storacle — uma biblioteca independente, não tem relação direta com música. Pode-se organizar o armazenamento de qualquer arquivo.

No artigo anterior, eu mencionei um pouco sobre ipfs, mas isso aconteceu no contexto da tarefa que eu estava resolvendo. No geral, considero este projeto interessante. Apenas prefiro a possibilidade de criar diferentes redes para diferentes tarefas. Isso permite organizar melhor a estrutura e reduzir a carga em nós individuais e na rede como um todo. É possível, mesmo dentro de um projeto específico, dividir a rede em partes com base em determinados critérios, diminuindo a carga geral.

Então, o storacle utiliza o mecanismo spreadable para organizar a rede. Principais características:

  • Arquivos podem ser adicionados ao repositório através de qualquer nó.
  • Os arquivos são salvos na íntegra, não em blocos.
  • Cada arquivo tem seu próprio hash exclusivo baseado em seu conteúdo para futuras operações.
  • 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, que será mencionada abaixo)
  • O número de arquivos na rede é limitado pelas capacidades do spreadable em termos do número permitido de nós na rede, que na segunda versão permitirá trabalhar com um número infinito de nós (isso será abordado em outro artigo)

Um exemplo simples de como isso 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);
  }
})();

Uma visão de dentro

Sob o capô, nada sobrenatural. As informações sobre o número de arquivos, seu tamanho total e outros detalhes são armazenadas em uma base de dados in-memory e são atualizadas quando arquivos são adicionados ou removidos, portanto, não há necessidade de acessar o sistema de arquivos com frequência. A exceção é a ativação do coletor de lixo, quando é necessário circular arquivos ao atingir certos tamanhos de armazenamento, e não proibir a adição de novos. Nesse caso, é necessário percorrer o armazenamento, e o trabalho com um grande número de arquivos (> um milhão, digamos) pode causar cargas significativas. É melhor armazenar menos arquivos e ativar mais nós. Se o "limpador" estiver desativado, esse problema não ocorre.

O armazenamento de arquivos consiste em 256 pastas e 2 níveis de profundidade. Os arquivos são armazenados nas pastas de segundo nível. Ou seja, com 1 milhão de arquivos, cada uma dessas pastas conterá cerca de 62.500 arquivos (1000000 / sqrt(256)).

Os nomes das pastas são gerados a partir do hash do arquivo, permitindo acesso rápido, conhecendo o hash.

Essa estrutura foi escolhida com base em uma série de requisitos variados para o armazenamento: suporte a sistemas de arquivos deficientes, onde não é desejável ter muitos arquivos em uma única pasta, acesso rápido a todas as pastas quando necessário, etc. Uma espécie de meio-termo.

Cache

Ao adicionar arquivos, bem como ao recuperá-los, referências aos arquivos são escritas no cache.
Graças a isso, muitas vezes não há necessidade de percorrer toda a rede em busca de um arquivo. Isso acelera a obtenção de referências e reduz a carga na rede. O cache também é feito através de cabeçalhos http.

Isomorfismo

O cliente é escrito em javascript e é isomórfico, podendo ser utilizado diretamente do navegador. 
É possível carregar um arquivo https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js como um script e acessar window.ClientStoracle ou importá-lo através de um sistema de construção, etc.

Referências adiadas

Uma característica interessante é a "referência adiada". É uma referência a um arquivo que pode ser obtida de forma síncrona, aqui e agora, enquanto o arquivo será carregado assim que for encontrado no armazenamento. Isso é muito conveniente, por exemplo, quando é necessário exibir algumas imagens no site. Basta definir a referência adiada no src e tudo. É possível pensar em muitos casos.

API do cliente

  • assíncrono Client.prototype.storeFile() — para salvar um arquivo
  • assíncrono Client.prototype.getFileLink() — para obter um link direto para o arquivo
  • assíncrono Client.prototype.getFileLinks() — obter uma lista de links diretos para o arquivo de todos os nós onde ele está presente
  • assíncrono Client.prototype.getFileToBuffer() — obter o arquivo no buffer
  • assíncrono Client.prototype.getFileToPath() — obter o arquivo no sistema de arquivos
  • assíncrono Client.prototype.getFileToBlob() — obter o arquivo em blob (para a versão do navegador)
  • assíncrono Client.prototype.removeFile() — remover arquivo
  • Client.prototype.createRequestedFileLink() — criar um link adiado

Exportar arquivos para outro servidor

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

  • Apenas copiar toda a pasta de armazenamento junto com as configurações. (no futuro, isso pode não funcionar)
  • Copiar apenas a pasta com os arquivos. Mas, neste caso, será necessário executar uma vez a função node.normalizeFilesInfo(), para recalcular todos os dados e registrá-los no banco.
  • Usar a função node.exportFiles(), que iniciará a cópia dos arquivos.

Configurações principais do nó
Ao iniciar o nó de armazenamento, é possível especificar todas as configurações necessárias.
Descreverei as mais básicas; o restante pode ser encontrado no GitHub.

  • storage.dataSize — tamanho da pasta com os arquivos
  • storage.tempSize — tamanho da pasta temporária
  • storage.autoCleanSize — tamanho mínimo de armazenamento que deve ser mantido. Se este parâmetro for especificado, assim que o espaço começar a faltar, os arquivos menos utilizados serão removidos.
  • file.maxSize — tamanho máximo do arquivo
  • file.minSize — tamanho mínimo do arquivo
  • file.preferredDuplicates — número preferido de duplicatas do arquivo na rede
  • file.mimeWhitelist — tipos de arquivo permitidos
  • file.mimeBlacklist — tipos de arquivo não permitidos
  • file.extWhitelist — extensões de arquivo permitidas
  • file.extBlacklist — extensões de arquivo não permitidas
  • file.linkCache — diferentes configurações de cache de links

Quase todos os parâmetros relacionados aos tamanhos podem ser especificados tanto em unidades absolutas quanto relativas.

Operação através da linha de comando
A biblioteca pode ser utilizada através da linha de comando. Para isso, precisa ser instalada globalmente: npm i -g storacle. Após isso, você pode executar as ações necessárias do diretório com o projeto, onde está o nó. Por exemplo, storacle -a storeFile -f ./file.txt -c ./config.js, para adicionar um 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 um projeto descentralizado no qual pretende armazenar e trabalhar com arquivos de maneiras convenientes. Por exemplo, o projeto de música, descrito no link no início do artigo, utiliza storacle.
  • Se você está trabalhando em outros projetos que precisam armazenar arquivos de forma distribuída. Você pode facilmente construir sua própria rede privada, configurar nós flexivelmente e adicionar novos quando necessário.
  • Se você só precisa de um lugar para armazenar os arquivos do seu site e não quer escrever tudo sozinho. Esta biblioteca pode ser mais adequada do que outras, no seu caso.
  • Se você tem um projeto em que está trabalhando com arquivos, mas quer realizar todas as operações a partir do navegador. Você pode evitar a necessidade de escrever código do lado do servidor.

Meus contatos:

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster