Storacle - decentraliseret fillagring

Storacle - decentraliseret fillagring

Før jeg begynder, må jeg gå link til tidligere artikelså det er tydeligt, hvad vi præcis taler om.

I denne artikel vil jeg gerne se på laget, der er ansvarlig for at gemme filer, og hvordan det kan bruges af alle. Storacle er et selvstændigt bibliotek, der er ingen direkte forbindelse med musik. Du kan organisere lagringen af ​​alle filer.

I forrige artikel "rullede jeg tønden" lidt videre ipfs, men dette skete netop i forbindelse med det problem, jeg løste. Alt i alt synes jeg, at dette projekt er fedt. Jeg foretrækker bare muligheden for at skabe forskellige netværk til forskellige opgaver. Dette giver dig mulighed for bedre at organisere strukturen og reducere belastningen på individuelle noder og netværket som helhed. Selv inden for rammerne af et projekt kan du om nødvendigt opdele netværket i stykker efter nogle kriterier, hvilket reducerer den samlede belastning.

Så storage bruger mekanismen spredbar til at organisere et netværk. Nøglefunktioner:

  • Filer kan tilføjes til depotet gennem enhver node.
  • Filer gemmes fuldstændigt, ikke i blokke.
  • Hver fil har sin egen unikke indholdshash til yderligere arbejde med den.
  • Filer kan duplikeres for større pålidelighed
  • Antallet af filer på én node er kun begrænset af filsystemet (der er en undtagelse, mere om det nedenfor)
  • Antallet af filer i netværket er begrænset af de spredbare muligheder i henhold til antallet af gyldige noder i netværket, som i den anden version vil kunne arbejde med et uendeligt antal noder (mere om dette i en anden artikel)

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

Inderside

Der er ikke noget fancy under motorhjelmen. Oplysninger om antallet af filer, deres samlede størrelse og andre punkter gemmes i en database i hukommelsen og opdateres, når filer slettes og tilføjes, så der ikke er behov for hyppigt at få adgang til filsystemet. En undtagelse er at aktivere affaldsopsamleren, når du skal cirkulere filer, når en vis lagerstørrelse er nået, og ikke forbyde tilføjelse af nye. I dette tilfælde skal du omgå lageret, og arbejde med et stort antal filer (> sige en million) kan føre til betydelige belastninger. Og det er bedre at gemme færre filer og køre flere noder. Hvis "renseren" er deaktiveret, er der ikke noget sådant problem.

Fillageret består af 256 mapper og 2 niveauer af indlejring. Filer gemmes i mapper på andet niveau. Altså hvis der er 1 mio. Der vil være omkring 62500 filer i hver sådan mappe (1000000 / sqrt(256)).

Mappenavnene er dannet ud fra filens hash, så du hurtigt kan få adgang til den, hvis du kender hashen.

Denne struktur er valgt ud fra en lang række forskellige opbevaringskrav: understøttelse af svage filsystemer, hvor det ikke er ønskeligt at have mange filer i én mappe, hurtig gennemgang af alle mapper, hvis det er nødvendigt, osv. En slags gylden middelvej.

caching

Når du tilføjer filer, såvel som når du modtager dem, skrives links til filer til cachen.
Takket være dette er det meget ofte ikke nødvendigt at krydse hele netværket på jagt efter en fil. Dette fremskynder modtagelsen af ​​links og reducerer belastningen på netværket. Caching sker også via http-headers.

Isomorfi

Klienten er skrevet i javascript og er isomorf, den kan bruges direkte fra browseren. 
Du kan uploade filen https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js som script og adgang vindue.ClientStoracle eller import gennem byggesystemet osv.

Udskudte links

En interessant funktion er også "udskudt reference". Dette er et link til en fil, der kan hentes synkront, her og nu, og filen vil blive trukket op, når den allerede er fundet i lageret. Dette er meget praktisk, når du for eksempel skal vise nogle billeder på siden. Vi har lige lagt et udskudt link i src, og det er det. Du kan komme med mange sager.

Client API

  • async Client.prototype.storeFile() - gemmer filen
  • async Client.prototype.getFileLink() — få et direkte link til filen
  • async Client.prototype.getFileLinks() — få en liste over direkte links til en fil fra alle noder, hvor den findes
  • async Client.prototype.getFileToBuffer() — få filen ind i bufferen
  • async Client.prototype.getFileToPath() — få en fil ind i filsystemet
  • async Client.prototype.getFileToBlob() - Hent filen i blob (for browserversion)
  • async Client.prototype.removeFile() - slet en fil
  • Client.prototype.createRequestedFileLink() — oprette et udskudt link

Eksporter filer til en anden server

For at overføre filer til en anden node kan du:

  • Bare kopier hele lagermappen sammen med indstillingerne. (dette virker muligvis ikke i fremtiden)
  • Kopier kun mappen med filer. Men i dette tilfælde skal du køre funktionen én gang node.normalizeFilesInfo()at genberegne alle data og indtaste dem i databasen.
  • brug funktionen node.exportFiles()som vil begynde at kopiere filer.

Grundlæggende nodeindstillinger
Når du starter lagernoden, kan du angive alle de nødvendige indstillinger.
Jeg vil beskrive de mest basale, resten kan findes på Github.

  • storage.dataSize — størrelsen på mappen med filer
  • storage.tempSize — midlertidig mappestørrelse
  • storage.autoCleanSize — den mindste lagerstørrelse, der skal opbevares. Hvis du angiver denne parameter, vil de mindst brugte filer blive slettet, så snart pladsen begynder at løbe tør.
  • file.maxSize — maksimal filstørrelse
  • fil.minStørrelse — mindste filstørrelse
  • file.preferredDuplicates — foretrukket antal filduplikater på netværket
  • file.mimeWhitelist - gyldige filtyper
  • file.mimeSortliste - ugyldige filtyper
  • file.extWhitelist - gyldige filtypenavne
  • file.extSortliste - ugyldige filtypenavne
  • file.linkCache - forskellige indstillinger for linkcache

Næsten alle parametre relateret til dimensioner kan indtastes i både absolutte og relative værdier.

Arbejder via kommandolinjen
Biblioteket kan bruges via kommandolinjen. For at gøre dette skal du installere det globalt: npm i -g lager. Herefter kan du starte de nødvendige handlinger fra projektbiblioteket, hvor noden er. For eksempel, storacle -a storeFile -f ./file.txt -c ./config.jsfor at tilføje filen. Alle handlinger kan findes i https://github.com/ortexx/storacle/blob/master/bin/actions.js

Hvorfor kan du have brug for dette?

  • Hvis du vil oprette en form for decentraliseret projekt, hvor du planlægger at gemme og arbejde med filer ved hjælp af praktiske metoder. For eksempel bruger musikprojektet beskrevet i linket i begyndelsen af ​​artiklen opbevaring.
  • Hvis du arbejder på andre projekter, hvor du skal gemme filer på en distribueret måde. Du kan nemt bygge dit lukkede netværk, fleksibelt konfigurere noder og tilføje nye, når det er nødvendigt.
  • Hvis du bare skal gemme dine hjemmesidefiler et sted, og det er for meget for dig at skrive alt selv. Måske er dette bibliotek bedre egnet end andre i dit tilfælde.
  • Hvis du har et projekt, hvor du arbejder med filer, men ønsker at udføre alle manipulationer fra browseren. Du kan undgå at skrive serverkode.

Mine kontakter:

Kilde: www.habr.com

Tilføj en kommentar