Storacle - decentraliseret fillagring

Storacle - decentraliseret fillagring

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

I denne artikel vil jeg gerne analysere det lag, der er ansvarlig for lagring af filer, og hvordan det kan bruges af alle. Storacle - et selvstændigt bibliotek, der er ingen direkte forbindelse med musik. Du kan organisere lagring af alle filer.

I den forrige artikel gik jeg lidt overbord ipfs, men det skete netop i forbindelse med det problem, jeg løste. Alt i alt synes jeg, at dette projekt er fedt. Jeg kan bare godt lide evnen til at skabe forskellige netværk til forskellige opgaver. Dette giver mulighed for bedre organisering af strukturen og reduktion af belastningen på individuelle noder og netværket som helhed. Det er endda muligt inden for rammerne af et enkelt projekt om nødvendigt at opdele netværket i stykker efter bestemte kriterier, hvilket reducerer den samlede belastning.

Så storage bruger mekanismen spredbar til netværksorganisation. Nøglefunktioner:

  • Filer kan tilføjes til depotet gennem enhver node.
  • Filer gemmes som en helhed, ikke i blokke.
  • Hver fil har sin egen unikke hash af dens indhold til videre 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 for antallet af tilladte noder i netværket, som i den anden version vil være i stand til at arbejde med et uendeligt antal noder (mere om dette i en anden artikel)

Et simpelt eksempel på, hvordan dette 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 intet ud over det sædvanlige under motorhjelmen. Oplysninger om antallet af filer, deres samlede størrelse og andre detaljer 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 skraldeopsamleren, når du skal cirkulere filer, når du når en vis lagerstørrelse, i stedet for at forbyde tilføjelse af nye. I dette tilfælde skal du omgå lagringen, og arbejde med et stort antal filer (f.eks. > 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)).

Mappenavne dannes ud fra filens hash, så du hurtigt kan få adgang til dem ved at kende hashen.

Denne struktur er valgt ud fra en lang række forskellige lagringskrav: 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 form for gylden middelvej.

caching

Når du tilføjer filer, såvel som når du modtager dem, skrives links til filerne til cachen.
Takket være dette er der ofte ikke behov for at gå gennem hele netværket på jagt efter en fil. Dette fremskynder linkopsamling og reducerer netværksbelastningen. Caching sker også gennem http-headere.

Isomorfi

Klienten er skrevet i javascript og isomorphic, den kan bruges direkte fra browseren. 
Du kan uploade en fil https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js som et script og få adgang til vindue.ClientStoracle eller importer gennem byggesystemet osv.

Udskudte links

En anden interessant funktion er det "udsatte link". Dette er et link til en fil, der kan hentes synkront, her og nu, og filen vil blive trukket op, når den findes i lageret. Det er meget praktisk, når du for eksempel skal vise nogle billeder på en hjemmeside. Vi har lige lagt et udskudt link i src, og det er det. Der er mange sager, der kan oprettes.

Client API

  • async Client.prototype.storeFile() — gemmer fil
  • async Client.prototype.getFileLink() - få et direkte link til en fil
  • 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 til buffer
  • async Client.prototype.getFileToPath() - få filen ind i filsystemet
  • async Client.prototype.getFileToBlob() - Hent fil i blob (for browserversion)
  • async Client.prototype.removeFile() — slet 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(), for 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 grundlæggende, resten kan findes på GitHub.

  • storage.dataSize — størrelsen på mappen med filer
  • storage.tempSize — størrelsen af ​​den midlertidige mappe
  • storage.autoCleanSize — den mindste lagerstørrelse, der skal opretholdes. 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 — minimum filstørrelse
  • file.preferredDuplicates — det foretrukne antal filduplikater på netværket
  • file.mimeWhitelist — tilladte 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 angives i både absolutte og relative værdier.

Arbejder via kommandolinje
Biblioteket kan bruges via kommandolinjen. For at gøre dette skal du installere det globalt: npm i -g lager. Herefter kan du køre de nødvendige handlinger fra projektbiblioteket, hvor noden er. f.eks. storacle -a storeFile -f ./file.txt -c ./config.jsfor at tilføje en fil. 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 et eller andet decentralt 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 eget 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 du er for doven til at skrive alt selv. Måske vil dette bibliotek passe bedre til din sag end andre.
  • Hvis du har et projekt, hvor du arbejder med filer, men ønsker at udføre alle manipulationer fra browseren. Du kan undgå at skrive kode på serversiden.

Mine kontakter:

Kilde: www.habr.com

Køb pålidelig hosting til websteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster