Storacle - decentralizirana pohrana datoteka

Storacle - decentralizirana pohrana datoteka

Prije nego što počnem, moram otići poveznica na prethodni članak, tako da bude jasno o čemu točno govorimo.

U ovom članku želio bih analizirati sloj koji je odgovoran za pohranu datoteka i kako ga svatko može koristiti. Storacle je samostalna bibliotekaNema izravne veze s glazbom. Možete organizirati pohranu bilo kojih datoteka.

U prethodnom članku sam malo pretjerao ipfs, ali dogodilo se konkretno u kontekstu problema koji sam rješavao. Sveukupno, mislim da je ovaj projekt super. Jednostavno preferiram mogućnost stvaranja različitih mreža za različite zadatke. To omogućuje bolju organizaciju i smanjuje opterećenje pojedinačnih čvorova i mreže u cjelini. Čak možete, ako je potrebno, podijeliti mrežu na dijelove unutar jednog projekta na temelju određenih kriterija, smanjujući ukupno opterećenje.

Dakle, storacle koristi mehanizam mazive za organizaciju mreže. Ključne značajke:

  • Datoteke se mogu dodati u repozitorij putem bilo kojeg čvora.
  • Datoteke se spremaju kao cjeline, a ne u blokovima.
  • Svaka datoteka ima svoj jedinstveni hash svog sadržaja za daljnji rad s njom.
  • Datoteke se mogu duplicirati radi veće pouzdanosti.
  • Broj datoteka na jednom čvoru ograničen je samo datotečnim sustavom (postoji iznimka, više o tome u nastavku)
  • Broj datoteka na mreži ograničen je mogućnostima širenja broja dopuštenih čvorova na mreži, koja će u drugoj verziji moći raditi s beskonačnim brojem čvorova (više o tome u drugom članku).

Jednostavan primjer kako ovo funkcionira iz programa:

poslužitelj:

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

Klijent:

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

Pogled iznutra

Nema ništa posebno. Informacije o broju datoteka, njihovoj ukupnoj veličini i drugim detaljima pohranjene su u bazi podataka u memoriji i ažuriraju se kada se datoteke brišu i dodaju, tako da nema potrebe za čestim pristupom datotečnom sustavu. Iznimka je omogućavanje sakupljanja smeća, koje zahtijeva rotaciju datoteka kada se dosegne određena veličina pohrane, umjesto sprječavanja novih dodavanja. U ovom slučaju, pohrana se mora proći, a rukovanje velikim brojem datoteka (recimo, preko milijun) može dovesti do značajnog opterećenja. Bolje je pohraniti manje datoteka i pokrenuti više čvorova. Ako je sakupljač smeća onemogućen, ovaj problem se ne pojavljuje.

Pohrana datoteka sastoji se od 256 mapa i dvije razine ugniježđivanja. Datoteke se pohranjuju u mapama druge razine. To znači da ako postoji milijun datoteka, svaka mapa će sadržavati približno 62 500 (1 000 000 / sqrt(256)).

Imena mapa formiraju se iz hash-a datoteke tako da im se može brzo pristupiti znajući hash.

Ova struktura je odabrana na temelju velikog broja različitih zahtjeva za pohranu: podrška za slabe datotečne sustave, gdje je nepoželjno imati mnogo datoteka u jednoj mapi, brzi obilazak svih mapa kada je to potrebno itd. Svojevrsna zlatna sredina.

predmemoriranje

Prilikom dodavanja datoteka, kao i prilikom njihovog primanja, poveznice na datoteke zapisuju se u predmemoriju.
To često eliminira potrebu za prelaskom cijele mreže kako bi se pronašla datoteka. To ubrzava dohvaćanje poveznica i smanjuje opterećenje mreže. Predmemoriranje se također događa putem HTTP zaglavlja.

Izomorfizam

Klijent je napisan u JavaScriptu i izomorfan je, može se koristiti izravno iz preglednika. 
Možete prenijeti datoteku https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js kao skriptu i dobiti pristup window.ClientStoracle ili uvoz putem sustava za izgradnju itd.

Odgođene veze

Još jedna zanimljiva značajka je "odgođena poveznica". To je poveznica na datoteku koja se može sinkronizirano dohvatiti, ovdje i sada, a datoteka će se dohvatiti nakon što se pronađe u pohrani. To je vrlo praktično kada, na primjer, trebate prikazati neke slike na web stranici. Jednostavno dodajte odgođenu poveznicu u src i to je to. Postoji mnogo slučajeva upotrebe koje možete smisliti.

Klijentski API

  • async Klijent.prototip.storeFile() - spremanje datoteke
  • async Klijent.prototip.getFileLink() - dobivanje izravne poveznice na datoteku
  • async Klijent.prototip.getFileLinks() - dobivanje popisa izravnih poveznica na datoteku sa svih čvorova gdje se ona nalazi
  • async Client.prototype.getFileToBuffer() — spremiti datoteku u međuspremnik
  • async Client.prototype.getFileToPath() — ubaciti datoteku u datotečni sustav
  • async Client.prototype.getFileToBlob() — dohvati datoteku u blobu (za verziju preglednika)
  • async Klijent.prototip.ukloniDatoteku() - izbrisati datoteku
  • Client.prototype.createRequestedFileLink() - stvorite odgođenu vezu

Izvoz datoteka na drugi poslužitelj

Za prijenos datoteka na drugi čvor možete:

  • Samo kopirajte cijelu mapu za pohranu zajedno s postavkama. (Ovo možda neće raditi u budućnosti.)
  • Kopirajte samo mapu s datotekama. Međutim, u ovom slučaju, morat ćete pokrenuti funkciju jednom. node.normalizeFilesInfo()ponovno izračunati sve podatke i unijeti ih u bazu podataka.
  • Koristite funkciju node.exportFiles(), što će započeti kopiranje datoteka.

Osnovne postavke čvora
Prilikom pokretanja čvora za pohranu možete odrediti sve potrebne postavke.
Opisat ću najosnovnije, ostale možete pronaći na GitHubu.

  • storage.dataSize — veličina mape s datotekama
  • storage.tempSize — veličina privremene mape
  • storage.autoCleanSize — minimalna veličina pohrane koju treba održavati. Ako navedete ovaj parametar, najmanje korištene datoteke bit će izbrisane čim prostor postane nedovoljan.
  • datoteka.maxSize — maksimalna veličina datoteke
  • file.minSize — minimalna veličina datoteke
  • datoteka.preferredDuplicates — željeni broj duplikata datoteka na mreži
  • datoteka.mimeBijela lista — prihvatljive vrste datoteka
  • file.mimeCrna lista - nevažeće vrste datoteka
  • datoteka.extBijela lista — prihvatljive ekstenzije datoteka
  • datoteka.extCrna lista - nevažeće ekstenzije datoteka
  • datoteka.linkCache - razne postavke predmemoriranja poveznica

Gotovo svi parametri vezani uz dimenzije mogu se specificirati i u apsolutnim i u relativnim vrijednostima.

Rad putem komandne linije
Biblioteka se može koristiti putem naredbenog retka. Da biste to učinili, instalirajte je globalno: npm i-g pohranaNakon toga možete pokrenuti potrebne radnje iz direktorija projekta u kojem se nalazi čvor. Na primjer, pohrana -a pohranaDatoteka -f ./datoteka.txt -c ./config.jsza dodavanje datoteke. Sve radnje možete pronaći u https://github.com/ortexx/storacle/blob/master/bin/actions.js

Zašto bi vam ovo moglo trebati?

  • Ako želite stvoriti decentralizirani projekt koji vam omogućuje pohranu i upravljanje datotekama pomoću prikladnih metoda. Na primjer, glazbeni projekt opisan u poveznici na početku članka koristi skladište.
  • Ako radite na bilo kojim drugim projektima koji zahtijevaju distribuiranu pohranu datoteka, možete jednostavno izgraditi vlastitu privatnu mrežu, fleksibilno konfigurirati čvorove i dodavati nove po potrebi.
  • Ako vam je potrebno samo mjesto za pohranu datoteka vaše web stranice i ne možete se zamarati time da sve sami pišete, ova biblioteka bi mogla bolje odgovarati vašim potrebama.
  • Ako imate projekt u kojem radite s datotekama, ali želite sve manipulacije obavljati iz preglednika, možete izbjeći pisanje koda na strani poslužitelja.

Moji kontakti:

Izvor: www.habr.com

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster