Storacle — ett decentraliserat filsystem

Storacle — ett decentraliserat filsystem

Innan jag börjar, behöver jag lÀmna en lÀnk till den tidigare artikeln, sÄ att det Àr klart vad det handlar om.

I den hĂ€r artikeln skulle jag vilja gĂ„ igenom lagret som ansvarar för fillagring och hur detta kan anvĂ€ndas av vem som helst. Storacle — ett fristĂ„ende bibliotek, utan nĂ„gon direkt koppling till musik. Man kan organisera lagring av alla typer av filer.

I den tidigare artikeln gnÀllde jag lite över ipfs, men det skedde faktiskt i kontexten av den uppgift jag sysslade med. Generellt anser jag att detta projekt Àr fantastiskt. Jag gillar bara mer möjligheten att skapa olika nÀtverk för olika uppgifter. Det gör det möjligt att bÀttre organisera strukturen och minska belastningen pÄ enskilda noder och nÀtverket som helhet. Man kan till och med inom ett specifikt projekt, vid behov, dela upp nÀtverket i segment baserat pÄ vissa kriterier för att minska den totala belastningen.

SÄ, storacle anvÀnder mekanismen spreadable för att organisera nÀtverket. Huvudfunktionerna Àr:

  • Filer kan lĂ€ggas till lagret via vilken nod som helst.
  • Filer sparas i sin helhet, inte i block.
  • Varje fil har sin egen unika hash baserat pĂ„ innehĂ„llet för framtida arbete med den.
  • Filer kan dupliceras för högre tillförlitlighet
  • Antalet filer pĂ„ en nod begrĂ€nsas endast av filsystemet (det finns ett undantag, som nĂ€mns lĂ€ngre ner)
  • Antalet filer i nĂ€tverket begrĂ€nsas av spridbarhet utifrĂ„n antalet tillĂ„tna noder i nĂ€tverket, som i den andra versionen kommer att göra det möjligt att arbeta med ett oĂ€ndligt antal noder (om detta i en annan artikel)

Ett enkelt exempel pÄ hur detta fungerar frÄn programmet:

Servern:

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

En inblick inifrÄn

Under the hood, there’s nothing extraordinary. Information about the number of files, their total size, and other details are stored in an in-memory database and updated upon file addition and deletion, meaning frequent access to the file system is unnecessary. The only exception is during the activation of the garbage collector, which requires file circulation when certain storage size limits are reached, rather than a prohibition on adding new files. In this case, it is necessary to traverse the storage, and handling a large number of files (> a million, let's say) can lead to significant load. It's better to keep fewer files and run more nodes. If the 'cleaner' is disabled, this issue does not arise.

The file storage consists of 256 folders with 2 levels of nesting. Files are stored in the second-level folders. Therefore, with 1 million files, there will be about 62500 files in each folder (1000000 / sqrt(256)).

The names of the folders are generated from the file hash to enable quick access when the hash is known.

This structure was chosen based on a wide range of requirements for the storage: support for weak file systems where it’s undesirable to have many files in one folder, quick traversal of all folders when necessary, etc. It's a sort of golden mean.

Caching

When files are added or retrieved, links to the files are cached.
Thanks to this, there is often no need to traverse the entire network in search of a file. This speeds up link retrieval and reduces network load. Caching also occurs through HTTP headers.

Isomorphism

The client is written in JavaScript and isomorphic, meaning it can be used directly from the browser. 
You can upload a file https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js as a script and gain access to window.ClientStoracle or import through a build system, etc.

Deferred links

An interesting feature is also the 'deferred link'. This is a link to a file that can be obtained synchronously, here and now, while the file will be pulled in once it is found in storage. This is very convenient when, for instance, you need to display some images on your website. You just set the deferred link in the src and that’s it. There are many scenarios that can be imagined.

Client API

  • async Client.prototype.storeFile() — storing a file
  • async Client.prototype.getFileLink() — obtaining a direct link to a file
  • async Client.prototype.getFileLinks() — fĂ„ en lista över direkta lĂ€nkar till filen frĂ„n alla noder dĂ€r den finns
  • async Client.prototype.getFileToBuffer() — hĂ€mta filen till en buffert
  • async Client.prototype.getFileToPath() — hĂ€mta filen till filsystemet
  • async Client.prototype.getFileToBlob() — hĂ€mta filen som blob (för webblĂ€sarversionen)
  • async Client.prototype.removeFile() — ta bort filen
  • 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:

  • Enkelt kopiera hela lagringsmappen med instĂ€llningarna (detta kanske inte fungerar i framtiden)
  • Kopiera endast mappen med filer. Men i sĂ„ fall mĂ„ste du en gĂ„ng köra funktionen node.normalizeFilesInfo(), för att rĂ€kna om alla data och lagra dem i databasen.
  • AnvĂ€nda funktionen node.exportFiles(), som pĂ„börjar kopieringen av filer.

HuvudinstÀllningar för noden
NÀr man startar lagringsnoden kan man ange alla nödvÀndiga instÀllningar.
Jag kommer att beskriva de mest grundlÀggande, resten kan hittas pÄ GitHub.

  • storage.dataSize — storleken pĂ„ mappen med filer
  • storage.tempSize — storleken pĂ„ temporĂ€rmappen
  • storage.autoCleanSize — minimala lagringsstorlek som mĂ„ste upprĂ€tthĂ„llas. Om denna parameter anges, kommer de minst anvĂ€nda filerna att tas bort sĂ„ snart utrymmet börjar ta slut.
  • file.maxSize — maximal filstorlek
  • file.minSize — minimal filstorlek
  • file.preferredDuplicates — önskat antal dubbletter av filen i nĂ€tverket
  • file.mimeWhitelist — tillĂ„tna filtyper
  • file.mimeBlacklist — otillĂ„tna filtyper
  • file.extWhitelist — tillĂ„tna filĂ€ndelser
  • file.extBlacklist — otillĂ„tna filĂ€ndelser
  • file.linkCache — olika instĂ€llningar för lĂ€nkcache

NÀstan alla parametrar relaterade till storlekar kan anges bÄde i absoluta och relativa enheter.

Arbeta via kommandoraden
Biblioteket kan anvÀndas via kommandoraden. För detta mÄste du installera det globalt: npm i -g storacle. Efter detta kan du köra de nödvÀndiga ÄtgÀrderna frÄn katalogen med projektet dÀr noden finns. Till exempel, storacle -a storeFile -f ./file.txt -c ./config.js, för att lÀgga till en fil. Alla ÄtgÀrder kan hittas i https://github.com/ortexx/storacle/blob/master/bin/actions.js

Varför du kan behöva detta

  • Om du vill skapa ett decentraliserat projekt dĂ€r du planerar att lagra och arbeta med filer pĂ„ bekvĂ€ma sĂ€tt. Till exempel, projektet med musik som beskrivs i lĂ€nken i början av artikeln, anvĂ€nder storacle.
  • Om du arbetar med andra projekt dĂ€r du behöver lagra filer distribuerat. DĂ„ kan du enkelt bygga ditt privata nĂ€tverk, flexibelt konfigurera noder och lĂ€gga till nya nĂ€r det behövs.
  • Om du bara behöver lagra filer för din webbplats och inte vill skriva allting sjĂ€lv. Kanske passar detta bibliotek bĂ€ttre Ă€n andra i ditt fall.
  • Om du har ett projekt dĂ€r du arbetar med filer, men vill göra alla manipulationer frĂ„n webblĂ€saren. Du kan undvika att skriva serverkod.

Mina kontaktuppgifter:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster