Storacle - decentraliserad fillagring

Storacle - decentraliserad fillagring

Innan jag börjar måste jag gå länk till tidigare artikelså att det är tydligt exakt vad vi pratar om.

I den här artikeln skulle jag vilja titta på lagret som är ansvarigt för att lagra filer, och hur det kan användas av vem som helst. Storacle är ett fristående bibliotek, det finns ingen direkt koppling till musik. Du kan organisera lagringen av alla filer.

I förra artikeln "rullade jag tunnan" lite på ipfs, men detta hände just i samband med problemet jag löste. Sammantaget tycker jag att det här projektet är coolt. Jag föredrar bara möjligheten att skapa olika nätverk för olika uppgifter. Detta gör att du kan organisera strukturen bättre och minska belastningen på enskilda noder och nätverket som helhet. Även inom ramen för ett projekt, om det behövs, kan du dela upp nätverket i bitar enligt vissa kriterier, vilket minskar den totala belastningen.

Så storage använder mekanismen spridbar för att organisera ett nätverk. Nyckelfunktioner:

  • Filer kan läggas till i arkivet genom vilken nod som helst.
  • Filer sparas helt, inte i block.
  • Varje fil har sin egen unika innehållshash för vidare arbete med den.
  • Filer kan dupliceras för större tillförlitlighet
  • Antalet filer på en nod begränsas endast av filsystemet (det finns ett undantag, mer om det nedan)
  • Antalet filer i nätverket begränsas av de spridbara funktionerna enligt antalet giltiga noder i nätverket, vilket i den andra versionen kommer att tillåta att arbeta med ett oändligt antal noder (mer om detta i en annan artikel)

Ett enkelt exempel på hur detta i allmänhet fungerar från 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);
  }
})();

Insidan

Det finns inget fint under huven. Information om antalet filer, deras totala storlek och andra punkter lagras i en databas i minnet och uppdateras när filer raderas och läggs till, så det finns inget behov av att ofta komma åt filsystemet. Ett undantag är att aktivera sopsamlaren när du behöver cirkulera filer när en viss lagringsstorlek har uppnåtts, och inte förbjuda att lägga till nya. I det här fallet måste du kringgå lagringen och att arbeta med ett stort antal filer (> säg en miljon) kan leda till betydande belastningar. Och det är bättre att lagra färre filer och köra fler noder. Om "rengöraren" är inaktiverad, så finns det inget sådant problem.

Fillagringen består av 256 mappar och 2 nivåer av kapsling. Filer lagras i mappar på andra nivån. Det vill säga om det finns 1 miljon. Det kommer att finnas cirka 62500 1000000 filer i varje sådan mapp (256 XNUMX XNUMX / sqrt(XNUMX)).

Mappnamnen bildas från filens hash så att du snabbt kan komma åt den om du känner till hashen.

Denna struktur valdes utifrån ett stort antal olika lagringskrav: stöd för svaga filsystem, där det inte är önskvärt att ha många filer i en mapp, snabb genomgång av alla mappar vid behov, etc. Någon sorts gyllene medelväg.

cachelagring

När du lägger till filer, såväl som när du tar emot dem, skrivs länkar till filer till cachen.
Tack vare detta finns det ofta inget behov av att korsa hela nätverket på jakt efter en fil. Detta påskyndar mottagandet av länkar och minskar belastningen på nätverket. Cachning sker också via http-rubriker.

Isomorfi

Klienten är skriven i javascript och är isomorf, den kan användas direkt från webbläsaren. 
Du kan ladda upp filen https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js som manus och tillgång fönster.ClientStoracle eller importera genom byggsystemet, etc.

Uppskjutna länkar

En intressant funktion är också "uppskjuten referens". Detta är en länk till en fil som kan hämtas synkront, här och nu, och filen kommer att dras upp när den redan finns i lagringen. Detta är väldigt praktiskt när du till exempel behöver visa några bilder på sajten. Vi har bara lagt en uppskjuten länk i src och det är allt. Du kan komma på många fall.

Klient-API

  • async Client.prototype.storeFile() - sparar filen
  • async Client.prototype.getFileLink() — få en direktlänk till filen
  • async Client.prototype.getFileLinks() — få en lista med direktlänkar till en fil från alla noder där den finns
  • async Client.prototype.getFileToBuffer() — hämta filen i bufferten
  • async Client.prototype.getFileToPath() — få in en fil i filsystemet
  • async Client.prototype.getFileToBlob() — hämta filen i blob (för webbläsarversion)
  • async Client.prototype.removeFile() - radera en fil
  • Client.prototype.createRequestedFileLink() — skapa en uppskjuten länk

Exportera filer till en annan server

För att överföra filer till en annan nod kan du:

  • Kopiera bara hela lagringsmappen tillsammans med inställningarna. (det här kanske inte fungerar i framtiden)
  • Kopiera endast mappen med filer. Men i det här fallet måste du köra funktionen en gång node.normalizeFilesInfo()för att räkna om all data och lägga in den i databasen.
  • använd funktion node.exportFiles()som kommer att börja kopiera filer.

Grundläggande nodinställningar
När du startar lagringsnoden kan du ange alla nödvändiga inställningar.
Jag kommer att beskriva de mest grundläggande, resten finns på Github.

  • storage.dataSize — storleken på mappen med filer
  • storage.tempSize — temporär mappstorlek
  • storage.autoCleanSize — Den minsta lagringsstorlek som måste hållas. Om du anger den här parametern kommer de minst använda filerna att raderas så snart utrymmet börjar ta slut.
  • file.maxSize — maximal filstorlek
  • file.minSize — minsta filstorlek
  • file.preferredDuplicates — föredraget antal fildubbletter på nätverket
  • file.mimeWhitelist - giltiga filtyper
  • file.mimeBlacklist - ogiltiga filtyper
  • file.extWhitelist - Giltiga filtillägg
  • file.extBlacklist - ogiltiga filtillägg
  • file.linkCache - olika inställningar för länkcache

Nästan alla parametrar relaterade till dimensioner kan anges i både absoluta och relativa värden.

Arbetar via kommandoraden
Biblioteket kan användas via kommandoraden. För att göra detta måste du installera det globalt: npm i -g lagring. Efter detta kan du starta de nödvändiga åtgärderna från projektkatalogen där noden finns. Till exempel, storacle -a storeFile -f ./file.txt -c ./config.jsför att lägga till filen. Alla åtgärder finns i https://github.com/ortexx/storacle/blob/master/bin/actions.js

Varför kan du behöva detta?

  • Om du vill skapa något slags decentraliserat projekt där du planerar att lagra och arbeta med filer med praktiska metoder. Till exempel använder musikprojektet som beskrivs i länken i början av artikeln förråd.
  • Om du arbetar med andra projekt där du behöver lagra filer på ett distribuerat sätt. Du kan enkelt bygga ditt slutna nätverk, flexibelt konfigurera noder och lägga till nya när det behövs.
  • Om du bara behöver lagra dina webbplatsfiler någonstans och det är för mycket för dig att skriva allt själv. Kanske är det här biblioteket bättre lämpat än andra i ditt fall.
  • Om du har ett projekt där du arbetar med filer, men vill utföra alla manipulationer från webbläsaren. Du kan undvika att skriva serverkod.

Mina kontakter:

Källa: will.com

Lägg en kommentar