Storacle — decentralizirana pohrana datoteka

Storacle — decentralizirana pohrana datoteka

Prije nego što započnem, moram ostaviti link na prethodni članak, kako bi bilo jasno o čemu se zapravo radi.

U ovom članku bih želio obraditi sloj koji je odgovoran za pohranu datoteka i kako to može iskoristiti bilo koja osoba. Storacle — samostalna biblioteka, nema direktne veze s muzikom. Može se organizirati pohrana bilo kojih datoteka.

U prethodnom članku malo sam "napao" ipfs, ali to se dogodilo upravo u kontekstu problema koji sam rješavao. U načelu, smatram ovaj projekt sjajnim. Samo mi više odgovara mogućnost stvaranja različitih mreža za različite zadatke. To omogućava bolju organizaciju strukture i smanjenje opterećenja na pojedinim čvorovima i mreži u cjelini. Čak se i unutar jednog određenog projekta, ako je potrebno, može razbiti mreža na dijelove prema nekim kriterijima, smanjujući ukupno opterećenje.

Dakle, storacle koristi mehanizam spreadable za organizaciju mreže. Glavne karakteristike:

  • Datoteke se mogu dodavati u skladište putem bilo kojeg čvora.
  • Datoteke se čuvaju u cijelini, ne blokovima.
  • Svaka datoteka ima svoj jedinstveni hash prema sadržaju 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 (ima iznimaka, o tome će biti riječi kasnije)
  • Broj datoteka u mreži ograničen je mogućnostima spreadable po broju dopuštenih čvorova u mreži, koji će u drugoj verziji moći raditi s beskrajnim brojem čvorova (o tome u drugom članku)

Jednostavan primjer kako to zapravo funkcionira iz programa:

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

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čega nadnaravnog. Informacije o broju datoteka, njihovoj ukupnoj veličini i drugim aspektima čuvaju se u in-memory bazi i ažuriraju se prilikom brisanja i dodavanja datoteka, stoga nema potrebe često pristupati datotečnom sustavu. Iznimka su aktivacije sakupljača smeća, kada je potrebna cirkulacija datoteka kada se dostigne određena veličina pohrane, a ne zabrana dodavanja novih. U tom slučaju potrebno je obići pohranu, a rad s velikim brojem datoteka (> milijun recimo) može uzrokovati značajna opterećenja. Bolje je čuvati manje datoteka i pokretati više čvorova. Ako je "čišćenje" onemogućeno, taj problem ne postoji.

Pohrana datoteka se sastoji od 256 mapa i 2 razine ugniježđenja. Datoteke se nalaze u mapama druge razine. To znači da, s 1 milijunom datoteka, svaka takva mapa ima oko 62500 datoteka (1000000 / sqrt(256)).

Nazivi mapa formiraju se iz hash-a datoteka, kako bi se moglo brzo pristupiti kada se zna hash.

Takva struktura je odabrana na temelju velikog broja različitih zahtjeva za pohranu: podrška za slabe datotečne sustave, gdje nije poželjno imati puno datoteka u jednoj mapi, brzo obilazak svih mapa kada je potrebno, itd. Neka zlatna sredina.

Keširanje

Prilikom dodavanja datoteka, kao i prilikom njihovog preuzimanja, u keš se zapisuje poveznice na datoteke.
Zahvaljujući tome, vrlo često nema potrebe prelaziti cijelu mrežu u potrazi za datotekom. To ubrzava dobivanje poveznica i smanjuje opterećenje na mreži. Također, keširanje se događa putem http zaglavlja.

Izomorfizam

Klijent je napisan na JavaScript-u i izomorfan je, može se koristiti direktno iz preglednika. 
Možete učitati datoteku https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js kao skriptu i dobiti pristup window.ClientStoracle ili je uvesti kroz sustav gradnje itd.

Odložene poveznice

Zanimljiva značajka također je "odložena poveznica". To je poveznica na datoteku, koju možete dobiti sinkrono, ovdje i sada, dok će se datoteka preuzeti kada bude pronađena u pohrani. To je vrlo korisno, kada, na primjer, trebate prikazati neke slike na webu. Jednostavno postavite odloženu poveznicu u src i to je to. Mnoge situacije su moguće.

Api klijent

  • (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.storeFile() — spremanje datoteke
  • (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileLink() — dobivanje izravne poveznice na datoteku
  • (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileLinks() — dobivanje popisa izravnih poveznica na datoteku sa svih čvorova na kojima postoji
  • (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileToBuffer() — preuzeti datoteku u memorijski prostor
  • (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileToPath() — preuzeti datoteku u datotečni sustav
  • (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.getFileToBlob() — preuzeti datoteku u blob (za verziju preglednika)
  • (196 tisuća redaka koda, 11 autora, 7 commitera, 11 neodgovorenih problema); Client.prototype.removeFile() — ukloni datoteku
  • Client.prototype.createRequestedFileLink() — stvoriti odgođenu poveznicu

Izvoz datoteka na drugi server

Da biste prenijeli datoteke na drugi čvor, možete:

  • Jednostavno kopirati cijelu mapu pohrane zajedno s postavkama. (u budućnosti to možda neće raditi)
  • Kopirati samo mapu s datotekama. No, u tom slučaju, potrebno je jednom pokrenuti funkciju node.normalizeFilesInfo(), kako bi se preračunali svi podaci i unijeli u bazu.
  • Koristiti funkciju node.exportFiles(), koja započinje kopiranje datoteka.

Osnovne postavke čvora
Pokretanjem čvora pohrane, možete navesti sve potrebne postavke.
Opišem najosnovnije, ostalo možete naći na GitHubu.

  • storage.dataSize — veličina mape s datotekama
  • storage.tempSize — veličina privremene mape
  • storage.autoCleanSize — minimalna veličina pohrane koja se mora održavati. Ako navedete ovu vrijednost, čim prostor počne nedostajati, najneiskorištenije datoteke će biti izbrisane.
  • file.maxSize — maksimalna veličina datoteke
  • file.minSize — minimalna veličina datoteke
  • file.preferredDuplicates — preferirani broj duplicata datoteke u mreži
  • file.mimeWhitelist — prihvatljive vrste datoteka
  • file.mimeBlacklist — neprihvatljive vrste datoteka
  • file.extWhitelist — prihvatljive ekstenzije datoteka
  • file.extBlacklist — neprihvatljive ekstenzije datoteka
  • file.linkCache — razne postavke predmemoriranja poveznica

Gotovo svi parametri povezani s veličinama mogu se postaviti i u apsolutnim i u relativnim vrijednostima.

Rad preko naredbenog retka
Biblioteku možete koristiti preko naredbenog retka. Za to je potrebno instalirati je globalno: npm i -g storacle. Nakon toga možete pokretati potrebne akcije iz direktorija s projektom gdje se nalazi čvor. Na primjer, storacle -a storeFile -f ./file.txt -c ./config.js, kako biste dodali datoteku. Sve akcije možete pronaći na https://github.com/ortexx/storacle/blob/master/bin/actions.js

Zašto bi ti ovo moglo biti potrebno

  • Ako želiš stvoriti neki decentralizirani projekt u kojem se planira pohranjivati i raditi s datotekama na praktične načine. Na primjer, projekt s muzikom, opisan na linku na početku članka, koristi storacle.
  • Ako radite na bilo kojim drugim projektima gdje je potrebno distribuirano pohranjivanje datoteka. Možete lako izgraditi svoju privatnu mrežu, fleksibilno postavljati čvorove i dodavati nove kada je to potrebno.
  • Ako vam je samo potrebno negdje pohraniti datoteke svog web-mjesta i ne želite sve sami pisati. Ova biblioteka bi mogla bolje odgovarati vašim potrebama.
  • Ako imate projekt u kojem radite s datotekama, ali želite sve manipulacije izvršavati iz preglednika. Možete izbjeći pisanje serverskog koda.

Moji kontakti:

Izvor: habr.com

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