Storacle - desentralisert fillagring

Storacle - desentralisert fillagring

Før jeg begynner, må jeg dra lenke til forrige artikkelslik at det er klart hva vi snakker om.

I denne artikkelen vil jeg se på laget som er ansvarlig for lagring av filer, og hvordan det kan brukes av hvem som helst. Storacle er et frittstående bibliotek, det er ingen direkte forbindelse med musikk. Du kan organisere lagringen av alle filer.

I forrige artikkel "rullet jeg tønnen" litt videre ipfs, men dette skjedde nettopp i sammenheng med problemet jeg løste. Alt i alt synes jeg dette prosjektet er kult. Jeg foretrekker bare muligheten til å lage forskjellige nettverk for forskjellige oppgaver. Dette lar deg organisere strukturen bedre og redusere belastningen på individuelle noder og nettverket som helhet. Selv innenfor rammen av ett prosjekt, om nødvendig, kan du dele nettverket i stykker i henhold til noen kriterier, noe som reduserer den totale belastningen.

Så lageracle bruker mekanismen spredbar for å organisere et nettverk. Nøkkelegenskaper:

  • Filer kan legges til depotet gjennom hvilken som helst node.
  • Filer lagres i sin helhet, ikke i blokker.
  • Hver fil har sin egen unike innholds-hash for videre arbeid med den.
  • Filer kan dupliseres for større pålitelighet
  • Antall filer på en node er begrenset kun av filsystemet (det er et unntak, mer om det nedenfor)
  • Antall filer i nettverket er begrenset av de spredbare mulighetene i henhold til antall gyldige noder i nettverket, som i den andre versjonen vil kunne fungere med et uendelig antall noder (mer om dette i en annen artikkel)

Et enkelt eksempel på hvordan dette generelt fungerer fra programmet:

Server:

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

Klient:

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

Innvendig visning

Det er ikke noe fancy under panseret. Informasjon om antall filer, deres totale størrelse og andre punkter lagres i en database i minnet og oppdateres når filer slettes og legges til, så det er ikke nødvendig å ha hyppig tilgang til filsystemet. Et unntak er å aktivere søppelsamleren når du trenger å sirkulere filer når en viss lagringsstørrelse er nådd, og ikke forby å legge til nye. I dette tilfellet må du omgå lagringen, og arbeid med et stort antall filer (> si en million) kan føre til betydelige belastninger. Og det er bedre å lagre færre filer og kjøre flere noder. Hvis "renseren" er deaktivert, er det ikke noe slikt problem.

Fillagringen består av 256 mapper og 2 nivåer av nesting. Filer lagres i mapper på andre nivå. Altså hvis det er 1 million. Det vil være omtrent 62500 1000000 filer i hver slik mappe (256 XNUMX XNUMX / sqrt(XNUMX)).

Mappenavnene er dannet fra filhashen slik at du raskt kan få tilgang til den hvis du kjenner hashen.

Denne strukturen ble valgt ut fra en lang rekke ulike lagringskrav: støtte for svake filsystemer, hvor det ikke er ønskelig å ha mange filer i én mappe, rask gjennomgang av alle mapper om nødvendig osv. En slags gylden middelvei.

caching

Når du legger til filer, så vel som når du mottar dem, skrives lenker til filer til hurtigbufferen.
Takket være dette er det ofte ikke nødvendig å krysse hele nettverket på jakt etter en fil. Dette gir raskere mottak av lenker og reduserer belastningen på nettverket. Bufring skjer også via http-hoder.

Isomorfi

Klienten er skrevet i javascript og er isomorf, den kan brukes direkte fra nettleseren. 
Du kan laste opp filen https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js som et skript og tilgang vindu.ClientStoracle eller importer gjennom byggesystemet osv.

Utsatte lenker

En interessant funksjon er også "utsatt referanse". Dette er en lenke til en fil som kan hentes synkront, her og nå, og filen vil bli trukket opp når den allerede finnes i lagringen. Dette er veldig praktisk når du for eksempel skal vise noen bilder på siden. Vi la bare en utsatt lenke i src og det er det. Du kan komme med mange saker.

Client API

  • async Client.prototype.storeFile() - lagrer filen
  • async Client.prototype.getFileLink() - få en direkte lenke til filen
  • async Client.prototype.getFileLinks() — få en liste over direkte lenker til en fil fra alle noder der den finnes
  • async Client.prototype.getFileToBuffer() - få filen inn i bufferen
  • async Client.prototype.getFileToPath() - få en fil inn i filsystemet
  • async Client.prototype.getFileToBlob() - få filen i blob (for nettleserversjon)
  • async Client.prototype.removeFile() - slette en fil
  • Client.prototype.createRequestedFileLink() — opprette en utsatt lenke

Eksporter filer til en annen server

For å overføre filer til en annen node kan du:

  • Bare kopier hele lagringsmappen sammen med innstillingene. (dette vil kanskje ikke fungere i fremtiden)
  • Kopier kun mappen med filer. Men i dette tilfellet må du kjøre funksjonen én gang node.normalizeFilesInfo()å beregne alle dataene på nytt og legge dem inn i databasen.
  • Bruk funksjon node.exportFiles()som vil begynne å kopiere filer.

Grunnleggende nodeinnstillinger
Når du starter lagringsnoden, kan du spesifisere alle nødvendige innstillinger.
Jeg vil beskrive de mest grunnleggende, resten finner du på Github.

  • storage.dataSize — størrelsen på mappen med filer
  • storage.tempSize — midlertidig mappestørrelse
  • storage.autoCleanSize — den minste lagringsstørrelsen som må oppbevares. Hvis du spesifiserer denne parameteren, vil de minst brukte filene bli slettet så snart plassen begynner å bli tom.
  • file.maxSize — maksimal filstørrelse
  • file.minSize — minste filstørrelse
  • file.preferredDuplicates — foretrukket antall filduplikater på nettverket
  • file.mimeWhitelist - gyldige filtyper
  • file.mimeBlacklist - ugyldige filtyper
  • file.extWhitelist - gyldige filtyper
  • file.extBlacklist - ugyldige filtyper
  • file.linkCache - ulike koblingsbufferinnstillinger

Nesten alle parametere knyttet til dimensjoner kan legges inn i både absolutte og relative verdier.

Jobber via kommandolinjen
Biblioteket kan brukes via kommandolinjen. For å gjøre dette må du installere det globalt: npm i -g lager. Etter dette kan du starte de nødvendige handlingene fra prosjektkatalogen der noden er. For eksempel, storacle -a storeFile -f ./file.txt -c ./config.jsfor å legge til filen. Alle handlinger finner du i https://github.com/ortexx/storacle/blob/master/bin/actions.js

Hvorfor kan du trenge dette?

  • Hvis du vil lage et slags desentralisert prosjekt der du planlegger å lagre og jobbe med filer ved hjelp av praktiske metoder. For eksempel bruker musikkprosjektet beskrevet i lenken i begynnelsen av artikkelen lager.
  • Hvis du jobber med andre prosjekter der du trenger å lagre filer på en distribuert måte. Du kan enkelt bygge ditt lukkede nettverk, fleksibelt konfigurere noder og legge til nye ved behov.
  • Hvis du bare trenger å lagre nettstedfilene dine et sted og det er for mye for deg å skrive alt selv. Kanskje dette biblioteket er bedre egnet enn andre i ditt tilfelle.
  • Hvis du har et prosjekt der du jobber med filer, men ønsker å utføre alle manipulasjoner fra nettleseren. Du kan unngå å skrive serverkode.

Kontaktene mine:

Kilde: www.habr.com

Legg til en kommentar