Storacle: emmagatzematge descentralitzat de fitxers

Storacle: emmagatzematge descentralitzat de fitxers

Abans de començar, he de marxar enllaç a l'article anteriorperquè quedi clar de què estem parlant exactament.

En aquest article m'agradaria veure la capa que s'encarrega d'emmagatzemar els fitxers i com pot ser utilitzada per qualsevol. Storacle és una biblioteca autònoma, no hi ha connexió directa amb la música. Podeu organitzar l'emmagatzematge de qualsevol fitxer.

A l'article anterior, vaig "enrotllar el barril" una mica IPFS, però això va passar precisament en el context del problema que estava resolent. En general, em sembla genial aquest projecte. Només prefereixo la possibilitat de crear xarxes diferents per a diferents tasques. Això us permet organitzar millor l'estructura i reduir la càrrega dels nodes individuals i de la xarxa en conjunt. Fins i tot en el marc d'un projecte, si cal, podeu dividir la xarxa en peces segons alguns criteris, reduint la càrrega global.

Així, Storacle utilitza el mecanisme extensible per organitzar una xarxa. Característiques clau:

  • Els fitxers es poden afegir al repositori mitjançant qualsevol node.
  • Els fitxers es guarden completament, no en blocs.
  • Cada fitxer té el seu propi hash de contingut únic per seguir treballant amb ell.
  • Els fitxers es poden duplicar per a una major fiabilitat
  • El nombre de fitxers d'un node només està limitat pel sistema de fitxers (hi ha una excepció, més a continuació)
  • El nombre de fitxers a la xarxa està limitat per les capacitats extensibles segons el nombre de nodes vàlids a la xarxa, que en la segona versió podran funcionar amb un nombre infinit de nodes (més sobre això en un altre article)

Un exemple senzill de com funciona això generalment des del 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);
  }
})();

Client:

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);
  }
})();

Vista interior

No hi ha res fantàstic sota el capó. La informació sobre el nombre de fitxers, la seva mida total i altres punts s'emmagatzemen en una base de dades a la memòria i s'actualitza quan se suprimeixen i s'afegeixen fitxers, de manera que no cal accedir amb freqüència al sistema de fitxers. Una excepció és habilitar el col·lector d'escombraries quan necessiteu fer circular fitxers quan s'arribi a una mida d'emmagatzematge determinada, i no prohibir-ne d'afegir-ne de nous. En aquest cas, heu de passar per alt l'emmagatzematge i treballar amb un gran nombre de fitxers (> per exemple un milió) pot comportar càrregues importants. I és millor emmagatzemar menys fitxers i executar més nodes. Si el "netejador" està desactivat, no hi ha cap problema.

L'emmagatzematge de fitxers consta de 256 carpetes i 2 nivells d'imbricació. Els fitxers s'emmagatzemen en carpetes de segon nivell. És a dir, si n'hi ha 1 milió. Hi haurà uns 62500 fitxers a cadascuna d'aquestes carpetes (1000000 / sqrt(256)).

Els noms de les carpetes es formen a partir del hash del fitxer perquè pugueu accedir-hi ràpidament si coneixeu el hash.

Aquesta estructura es va escollir en funció d'un gran nombre de requisits d'emmagatzematge diferents: suport per a sistemes de fitxers febles, on no és desitjable tenir molts fitxers en una carpeta, recorregut ràpid de totes les carpetes si cal, etc. Una mena de mitjà daurat.

memòria cau

En afegir fitxers, així com en rebre'ls, els enllaços als fitxers s'escriuen a la memòria cau.
Gràcies a això, molt sovint no cal recórrer tota la xarxa a la recerca d'un fitxer. Això accelera la recepció d'enllaços i redueix la càrrega a la xarxa. La memòria cau també es produeix mitjançant les capçaleres http.

Isomorfia

El client està escrit en javascript i és isomorf, es pot utilitzar directament des del navegador. 
Podeu pujar el fitxer https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js com a guió i accés window.ClientStoracle o importar mitjançant el sistema de compilació, etc.

Enllaços ajornats

Una característica interessant també és la "referència diferida". Aquest és un enllaç a un fitxer que es pot obtenir de manera sincrònica, aquí i ara, i el fitxer s'extraurà quan ja es trobi a l'emmagatzematge. Això és molt convenient quan, per exemple, necessiteu mostrar algunes imatges al lloc. Acabem de posar un enllaç diferit a src i ja està. Pots trobar molts casos.

API del client

  • Asinc Client.prototype.storeFile() - desar el fitxer
  • Asinc Client.prototype.getFileLink() — obtenir un enllaç directe al fitxer
  • Asinc Client.prototype.getFileLinks() — obtenir una llista d'enllaços directes a un fitxer des de tots els nodes on existeix
  • Asinc Client.prototype.getFileToBuffer() - introduïu el fitxer a la memòria intermèdia
  • Asinc Client.prototype.getFileToPath() — obtenir un fitxer al sistema de fitxers
  • Asinc Client.prototype.getFileToBlob() - obtenir el fitxer a blob (per a la versió del navegador)
  • Asinc Client.prototype.removeFile() - esborrar un fitxer
  • Client.prototype.createRequestedFileLink() — crear un enllaç diferit

Exporta fitxers a un altre servidor

Per transferir fitxers a un altre node, podeu:

  • Només cal que copieu tota la carpeta d'emmagatzematge juntament amb la configuració. (és possible que això no funcioni en el futur)
  • Copieu només la carpeta amb fitxers. Però, en aquest cas, haureu d'executar la funció una vegada node.normalizeFilesInfo()per tornar a calcular totes les dades i introduir-les a la base de dades.
  • utilitzar la funció node.exportFiles()que començarà a copiar fitxers.

Configuració bàsica del node
Quan inicieu el node d'emmagatzematge, podeu especificar tots els paràmetres necessaris.
Descriuré els més bàsics, la resta es pot trobar a Github.

  • storage.dataSize — mida de la carpeta amb fitxers
  • storage.tempSize - mida de la carpeta temporal
  • storage.autoCleanSize — La mida mínima d'emmagatzematge que cal mantenir. Si especifiqueu aquest paràmetre, tan aviat com comenci a esgotar l'espai, s'eliminaran els fitxers menys utilitzats.
  • file.maxSize - mida màxima del fitxer
  • file.minSize - Mida mínima del fitxer
  • file.preferredDuplicates — nombre preferit de fitxers duplicats a la xarxa
  • file.mimeWhitelist - tipus de fitxer vàlids
  • file.mimeBlacklist - tipus de fitxer no vàlids
  • file.extWhitelist - extensions de fitxer vàlides
  • file.extBlacklist - extensions de fitxer no vàlides
  • file.linkCache - Diversos paràmetres de memòria cau d'enllaços

Gairebé tots els paràmetres relacionats amb les dimensions es poden introduir tant en valors absoluts com relatius.

Treballant mitjançant la línia d'ordres
La biblioteca es pot utilitzar mitjançant la línia d'ordres. Per fer-ho, cal instal·lar-lo globalment: npm i -g storacle. Després d'això, podeu iniciar les accions necessàries des del directori del projecte on es troba el node. Per exemple, storacle -a storeFile -f ./file.txt -c ./config.jsper afegir el fitxer. Totes les accions es poden trobar a https://github.com/ortexx/storacle/blob/master/bin/actions.js

Per què podria necessitar això?

  • Si voleu crear algun tipus de projecte descentralitzat en el qual teniu previst emmagatzemar i treballar amb fitxers mitjançant mètodes convenients. Per exemple, el projecte musical descrit a l'enllaç al començament de l'article utilitza magatzem.
  • Si treballeu en altres projectes on necessiteu emmagatzemar fitxers de manera distribuïda. Podeu construir fàcilment la vostra xarxa tancada, configurar nodes de manera flexible i afegir-ne de nous quan sigui necessari.
  • Si només necessiteu emmagatzemar els fitxers del vostre lloc web en algun lloc i és massa per escriure-ho tot vosaltres mateixos. Potser aquesta biblioteca és més adequada que altres en el vostre cas.
  • Si teniu un projecte en què treballeu amb fitxers, però voleu realitzar totes les manipulacions des del navegador. Podeu evitar escriure codi del servidor.

Els meus contactes:

Font: www.habr.com

Afegeix comentari