Storacle - gedecentraliseerde bestandsopslag

Storacle - gedecentraliseerde bestandsopslag

Voordat ik begin, moet ik vertrekken link naar vorig artikelzodat het duidelijk is waar we het precies over hebben.

In dit artikel wil ik kijken naar de laag die verantwoordelijk is voor het opslaan van bestanden, en hoe deze door iedereen kan worden gebruikt. Storacle is een zelfstandige bibliotheek, er is geen direct verband met muziek. U kunt de opslag van alle bestanden organiseren.

In het vorige artikel heb ik “de loop een beetje opgerold”. IPFs, maar dit gebeurde precies in de context van het probleem dat ik aan het oplossen was. Over het algemeen vind ik dit project cool. Ik geef gewoon de voorkeur aan de mogelijkheid om verschillende netwerken te creëren voor verschillende taken. Hierdoor kunt u de structuur beter organiseren en de belasting van individuele knooppunten en het netwerk als geheel verminderen. Zelfs binnen het kader van één project kunt u, indien nodig, het netwerk op basis van bepaalde criteria in stukken splitsen, waardoor de totale belasting wordt verminderd.

Dus storacle gebruikt het mechanisme smeerbaar voor het organiseren van een netwerk. Belangrijkste kenmerken:

  • Bestanden kunnen via elk knooppunt aan de repository worden toegevoegd.
  • Bestanden worden volledig opgeslagen, niet in blokken.
  • Elk bestand heeft zijn eigen unieke inhoudshash waarmee u er verder mee kunt werken.
  • Bestanden kunnen worden gedupliceerd voor een grotere betrouwbaarheid
  • Het aantal bestanden op één knooppunt wordt alleen beperkt door het bestandssysteem (er is een uitzondering, daarover hieronder meer)
  • Het aantal bestanden in het netwerk wordt beperkt door de spreidbare mogelijkheden op basis van het aantal geldige knooppunten in het netwerk, die in de tweede versie met een oneindig aantal knooppunten zullen kunnen werken (meer hierover in een ander artikel)

Een eenvoudig voorbeeld van hoe dit over het algemeen werkt vanuit het programma:

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

Cliënt:

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

Binnenaanzicht

Er zit niets bijzonders onder de motorkap. Informatie over het aantal bestanden, hun totale grootte en andere punten worden opgeslagen in een database in het geheugen en worden bijgewerkt wanneer bestanden worden verwijderd en toegevoegd, zodat het niet nodig is om regelmatig toegang te krijgen tot het bestandssysteem. Een uitzondering is het inschakelen van de garbage collector wanneer u bestanden moet laten circuleren wanneer een bepaalde opslaggrootte is bereikt, en het toevoegen van nieuwe niet verbiedt. In dit geval moet u de opslag omzeilen, en het werken met een groot aantal bestanden (> zeg een miljoen) kan tot aanzienlijke belasting leiden. En het is beter om minder bestanden op te slaan en meer knooppunten uit te voeren. Als de "cleaner" is uitgeschakeld, is er geen dergelijk probleem.

De bestandsopslag bestaat uit 256 mappen en 2 nestniveaus. Bestanden worden opgeslagen in mappen op het tweede niveau. Dat wil zeggen, als er 1 miljoen zijn. Er zullen ongeveer 62500 bestanden in elke map staan ​​(1000000 / sqrt(256)).

De mapnamen worden gevormd op basis van de bestandshash, zodat u er snel toegang toe hebt als u de hash kent.

Deze structuur werd gekozen op basis van een groot aantal verschillende opslagvereisten: ondersteuning voor zwakke bestandssystemen, waarbij het niet wenselijk is om veel bestanden in één map te hebben, snelle doorloop van alle mappen indien nodig, enz. Een soort gulden middenweg.

caching

Bij het toevoegen van bestanden, maar ook bij het ontvangen ervan, worden links naar bestanden naar de cache geschreven.
Hierdoor is het vaak niet nodig om het hele netwerk te doorkruisen op zoek naar een bestand. Dit versnelt de ontvangst van links en vermindert de belasting van het netwerk. Caching vindt ook plaats via http-headers.

Isomorfie

De client is geschreven in javascript en is isomorf, hij kan rechtstreeks vanuit de browser worden gebruikt. 
U kunt het bestand uploaden https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js als script en toegang venster.ClientStoracle of importeer via het buildsysteem, enz.

Uitgestelde links

Een interessant kenmerk is ook ‘uitgestelde referentie’. Dit is een link naar een bestand dat synchroon kan worden verkregen, hier en nu, en het bestand zal worden opgehaald wanneer het al in de opslag is gevonden. Dit is erg handig wanneer u bijvoorbeeld enkele foto's op de site wilt laten zien. We hebben zojuist een uitgestelde link in src geplaatst en dat is alles. Je kunt veel gevallen bedenken.

Klant-API

  • async Client.prototype.storeFile() - het bestand opslaan
  • async Client.prototype.getFileLink() — een directe link naar het bestand verkrijgen
  • async Client.prototype.getFileLinks() — een lijst met directe links naar een bestand ophalen van alle knooppunten waar het bestaat
  • async Client.prototype.getFileToBuffer() — Haal het bestand in de buffer
  • async Client.prototype.getFileToPath() — Haal een bestand in het bestandssysteem
  • async Client.prototype.getFileToBlob() — haal het bestand op in blob (voor browserversie)
  • async Client.prototype.removeFile() - verwijder een bestand
  • Client.prototype.createRequestedFileLink() — maak een uitgestelde link

Exporteer bestanden naar een andere server

Om bestanden naar een ander knooppunt over te brengen, kunt u:

  • Kopieer gewoon de volledige opslagmap samen met de instellingen. (dit werkt mogelijk niet in de toekomst)
  • Kopieer alleen de map met bestanden. Maar in dit geval moet u de functie één keer uitvoeren node.normalizeFilesInfo()om alle gegevens opnieuw te berekenen en in de database in te voeren.
  • functie gebruiken knooppunt.exportFiles()die zal beginnen met het kopiëren van bestanden.

Basis knooppuntinstellingen
Bij het starten van het opslagknooppunt kunt u alle benodigde instellingen opgeven.
Ik zal de meest basale beschrijven, de rest is te vinden op Github.

  • opslag.dataSize — grootte van de map met bestanden
  • opslag.tempSize — tijdelijke mapgrootte
  • storage.autoCleanSize — de minimale opslaggrootte die moet worden bewaard. Als u deze parameter opgeeft, worden de minst gebruikte bestanden verwijderd zodra de ruimte opraakt.
  • bestand.maxSize — maximale bestandsgrootte
  • bestand.minSize — minimale bestandsgrootte
  • bestand.preferredDuplicates — voorkeursaantal bestandsduplicaten op het netwerk
  • bestand.mimeWhitelist - geldige bestandstypen
  • bestand.mimeZwarte lijst - ongeldige bestandstypen
  • file.extWhitelist - geldige bestandsextensies
  • bestand.extZwarte lijst - ongeldige bestandsextensies
  • bestand.linkCache - Verschillende instellingen voor linkcaching

Bijna alle parameters met betrekking tot dimensies kunnen zowel in absolute als relatieve waarden worden ingevoerd.

Werken via de opdrachtregel
De bibliotheek kan worden gebruikt via de opdrachtregel. Om dit te doen moet je het globaal installeren: npm i -g opslag. Hierna kunt u de benodigde acties starten vanuit de projectdirectory waar het knooppunt zich bevindt. Bijvoorbeeld, storacle -a storeFile -f ./bestand.txt -c ./config.jsom het bestand toe te voegen. Alle acties zijn te vinden in https://github.com/ortexx/storacle/blob/master/bin/actions.js

Waarom heb je dit nodig?

  • Als u een soort gedecentraliseerd project wilt maken waarin u bestanden op handige manieren wilt opslaan en ermee wilt werken. Het muziekproject dat wordt beschreven in de link aan het begin van het artikel maakt bijvoorbeeld gebruik van opbergruimte.
  • Als u aan andere projecten werkt waarbij u bestanden gedistribueerd moet opslaan. U kunt eenvoudig uw gesloten netwerk opbouwen, knooppunten flexibel configureren en nieuwe toevoegen wanneer dat nodig is.
  • Als u uw websitebestanden alleen maar ergens wilt opslaan en het te veel voor u is om alles zelf te schrijven. Misschien is deze bibliotheek in uw geval beter geschikt dan andere.
  • Als u een project heeft waarin u met bestanden werkt, maar alle manipulaties vanuit de browser wilt uitvoeren. U kunt het schrijven van servercode vermijden.

Mijn contacten:

Bron: www.habr.com

Voeg een reactie