Storacle - decentralizirana pohrana datoteka

Storacle - decentralizirana pohrana datoteka

Prije nego počnem, moram otići link na prethodni članakkako bi bilo jasno o čemu točno govorimo.

U ovom članku želio bih pogledati sloj koji je odgovoran za pohranjivanje datoteka i kako ga svatko može koristiti. Storacle je samostalna biblioteka, nema izravne veze s glazbom. Možete organizirati pohranu bilo koje datoteke.

U prošlom članku sam malo "zakotrljao bačvu". ipfs, ali to se dogodilo upravo u kontekstu problema koji sam rješavao. Sve u svemu, mislim da je ovaj projekt super. Više volim mogućnost stvaranja različitih mreža za različite zadatke. To vam omogućuje bolju organizaciju strukture i smanjenje opterećenja pojedinačnih čvorova i mreže u cjelini. Čak iu okviru jednog projekta, ako je potrebno, možete podijeliti mrežu na dijelove prema nekim kriterijima, smanjujući ukupno opterećenje.

Dakle, Storacle koristi mehanizam mazive za organiziranje mreže. Glavne značajke:

  • Datoteke se mogu dodati u repozitorij kroz bilo koji čvor.
  • Datoteke se spremaju u cijelosti, a ne u blokovima.
  • Svaka datoteka ima svoj jedinstveni hash 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 u mreži ograničen je mogućnostima širenja prema broju valjanih čvorova u mreži, koji će u drugoj verziji moći raditi s beskonačnim brojem čvorova (više o tome u drugom članku)

Jednostavan primjer kako to općenito 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

Ispod haube nema ničeg otmjenog. Podaci o broju datoteka, njihovoj ukupnoj veličini i drugim točkama pohranjuju se u bazu podataka u memoriji i ažuriraju se kada se datoteke brišu i dodaju, tako da nema potrebe za čestim pristupom datotečnom sustavu. Izuzetak je omogućavanje skupljača smeća kada trebate cirkulirati datoteke kada se dosegne određena veličina pohrane, a ne zabraniti dodavanje novih. U ovom slučaju morate zaobići pohranu, a rad s velikim brojem datoteka (> recimo milijun) može dovesti do značajnih opterećenja. I bolje je pohraniti manje datoteka i pokrenuti više čvorova. Ako je "čistač" onemogućen, onda nema takvog problema.

Pohrana datoteka sastoji se od 256 mapa i 2 razine ugniježđivanja. Datoteke se pohranjuju u mape druge razine. Odnosno, ako ih ima 1 milijun. U svakoj takvoj mapi bit će oko 62500 1000000 datoteka (256 XNUMX XNUMX / sqrt(XNUMX)).

Imena mapa formirana su iz hash datoteke tako da joj možete brzo pristupiti ako znate hash.

Ova struktura je odabrana na temelju velikog broja različitih zahtjeva za pohranu: podrška za slabe datotečne sustave, gdje nije poželjno imati mnogo datoteka u jednoj mapi, brzo prolaženje svih mapa ako je potrebno, itd. Neka vrsta zlatne sredine.

predmemoriranje

Prilikom dodavanja datoteka, kao i kada ih primate, poveznice na datoteke zapisuju se u predmemoriju.
Zahvaljujući tome, vrlo često nema potrebe proći cijelu mrežu u potrazi za datotekom. Time se ubrzava primanje veza i smanjuje opterećenje mreže. Predmemoriranje se također događa putem http zaglavlja.

Izomorfija

Klijent je napisan u javascriptu i izomorfan je, može se koristiti izravno iz preglednika. 
Možete učitati datoteku https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js kao skripta i pristup prozor.ClientStoracle ili uvoz kroz sustav za izgradnju, itd.

Odgođene veze

Zanimljiva značajka je i "odgođena referenca". Ovo je poveznica na datoteku koja se može dobiti sinkrono, ovdje i sada, a datoteka će biti povučena gore kada se već nađe u pohrani. Ovo je vrlo zgodno kada, na primjer, trebate prikazati neke slike na web mjestu. Samo smo stavili odgođenu vezu u src i to je to. Možete smisliti mnogo slučajeva.

API klijenta

  • async Client.prototype.storeFile() - spremanje datoteke
  • async Client.prototype.getFileLink() — dobivanje izravne poveznice na datoteku
  • async Client.prototype.getFileLinks() — dobivanje popisa izravnih poveznica na datoteku sa svih čvorova na kojima ona postoji
  • async Client.prototype.getFileToBuffer() — staviti datoteku u međuspremnik
  • async Client.prototype.getFileToPath() — dobiti datoteku u datotečni sustav
  • async Client.prototype.getFileToBlob() — dobiti datoteku u blob (za verziju preglednika)
  • async Client.prototype.removeFile() - izbrisati datoteku
  • Client.prototype.createRequestedFileLink() — stvoriti odgođenu vezu

Izvoz datoteka na drugi poslužitelj

Da biste prenijeli datoteke 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. Ali, u ovom slučaju, morat ćete pokrenuti funkciju jednom čvor.normalizeFilesInfo()preračunati sve podatke i unijeti ih u bazu podataka.
  • Koristite funkciju node.exportFiles()koji će početi kopirati datoteke.

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

  • skladištenje.veličina podataka — veličina mape s datotekama
  • skladištenje.tempSize — veličina privremene mape
  • skladištenje.autoCleanSize — minimalna veličina skladišta koju je potrebno držati. Ako navedete ovaj parametar, čim počne ponestajati prostora, datoteke koje se najmanje koriste bit će izbrisane.
  • datoteka.maxSize — maksimalna veličina datoteke
  • datoteka.minSize — minimalna veličina datoteke
  • file.preferredDuplicates — željeni broj duplikata datoteka na mreži
  • file.mimeWhitelist - važeće vrste datoteka
  • datoteka.mimeCrna lista - nevažeće vrste datoteka
  • file.extWhitelist - važeće ekstenzije datoteka
  • file.extBlacklist - nevažeći nastavci datoteka
  • file.linkCache - razne postavke predmemoriranja veza

Gotovo svi parametri koji se odnose na dimenzije mogu se unijeti u apsolutnim i relativnim vrijednostima.

Rad preko naredbenog retka
Knjižnica se može koristiti putem naredbenog retka. Da biste to učinili, trebate ga instalirati globalno: npm i -g storacle. Nakon toga možete pokrenuti potrebne akcije iz direktorija projekta u kojem se nalazi čvor. Na primjer, storacle -a storeFile -f ./file.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 neku vrstu decentraliziranog projekta u kojem planirate pohranjivati ​​i raditi s datotekama koristeći prikladne metode. Na primjer, glazbeni projekt opisan na poveznici na početku članka koristi skladište.
  • Ako radite na bilo kojem drugom projektu gdje trebate pohranjivati ​​datoteke na distribuiran način. Možete jednostavno izgraditi svoju zatvorenu mrežu, fleksibilno konfigurirati čvorove i dodati nove po potrebi.
  • Ako samo trebate negdje pohraniti datoteke svoje web stranice i previše vam je da sve sami pišete. Možda je ova biblioteka prikladnija od drugih u vašem slučaju.
  • Ako imate projekt u kojem radite s datotekama, ali želite izvršiti sve manipulacije iz preglednika. Možete izbjeći pisanje poslužiteljskog koda.

Moji kontakti:

Izvor: www.habr.com

Dodajte komentar