Storacle — decentralizované úložisko súborov

Storacle — decentralizované úložisko súborov

Predtým, než začnem, musím zanechať odkaz na predchádzajúci článok, aby bolo jasné, o čom presne hovorím.

V tomto článku by som chcel rozobrať vrstvu, ktorá zodpovedá za ukladanie súborov, a ako to môže využiť ktokoľvek. Storacle — samostatná knižnica, nie je priamo spojená s hudbou. Môže sa organizovať ukladanie akýchkoľvek súborov.

V predchádzajúcom článku som trochu "načrel do" ipfs, ale to sa stalo presne v kontexte úlohy, ktorú som riešil. Celkovo považujem tento projekt za skvelý. Len sa mi viac páči možnosť vytvárať rôzne siete na rôzne úlohy. To umožňuje lepšie organizovať štruktúru a znižovať zaťaženie jednotlivých uzlov a siete ako celku. Môže sa dokonca v rámci jedného projektu, ak je to potrebné, rozdeľovať sieť na časti podľa rôznych kritérií, čím sa znižuje celkové zaťaženie.

Takže, storacle využíva mechanizmus spreadable na organizáciu siete. Hlavné vlastnosti:

  • Súbory môžu byť pridávané do úložiska cez hociktorý uzol.
  • Súbory sú uložené celé, nie po blokoch.
  • Každý súbor má svoj unikátny hash na základe obsahu pre ďalšiu prácu s ním.
  • Súbory môžu byť duplikované pre väčšiu spoľahlivosť
  • Počet súborov na jednom uzle je obmedzený len súborovým systémom (existuje výnimka, o ktorej bude reč nižšie)
  • Počet súborov v sieti je obmedzený možnosťami spreadable podľa počtu povolených uzlov v sieti, ktoré v druhej verzii budú schopné umožniť prácu s nekonečným počtom uzlov (o tom v inom článku)

Jednoduchý príklad, ako to vôbec funguje z programu:

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

Pohľad zvnútra

Pod kapotou nie je nič nadprirodzené. Informácie o počte súborov, ich celkovom veľkosti a ďalších aspektoch sa ukladajú v in-memory databáze a aktualizujú sa pri odstraňovaní a pridávaní súborov, takže nie je potrebné často pristupovať k súborovému systému. Výnimkou je zapnutie zberača odpadu, keď je potrebná cirkulácia súborov pri dosahovaní určitých veľkostí úložiska, a nie zákaz pridávania nových. V tomto prípade je potrebné prechádzať úložiskom a práca s veľkým počtom súborov (povedzme viac ako milión) môže spôsobovať značné zaťaženie. A je lepšie ukladať menej súborov a spúšťať viac uzlov. Ak je "čistič" vypnutý, takýto problém nie je.

Úložisko súborov pozostáva z 256 priečinkov a 2 úrovní hĺbky. Súbory sú uložené v priečinkoch druhej úrovne. To znamená, že pri 1 milióne súborov v každom takomto priečinku bude približne 62500 kusov (1000000 / sqrt(256)).

Názvy priečinkov sa generujú z hash súboru, aby sa k nim dalo rýchlo pristupovať, ak poznáte hash.

Takáto štruktúra bola zvolená na základe mnohých rôznych požiadaviek na úložisko: podpora slabých súborových systémov, kde nie je žiaduce mať veľa súborov v jednom priečinku, rýchle prechádzanie všetkých priečinkov v prípade potreby atď. Nejaký zlatý stred.

Kešovanie

Pri pridávaní súborov, ako aj pri ich získavaní, sa do kešee zapisujú odkazy na súbory.
Vďaka tomu sa veľmi často nie je potrebné prechádzať celou sieťou pri hľadaní súboru. To urýchľuje získanie odkazov a znižuje zaťaženie siete. Takisto sa kešovanie deje prostredníctvom http hlavičiek.

Izomorfnosť

Klient je napísaný v JavaScripte a je izomorfný, môže sa používať priamo z prehliadača. 
Možno nahrať súbor https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js ako skript a získať prístup k window.ClientStoracle alebo importovať prostredníctvom systému zostavovania a podobne.

Odložené odkazy

Zaujímavou funkciou je aj "odložený odkaz". Je to odkaz na súbor, ktorý môžete získať synchronne, tu a teraz, a súbor sa načíta, keď sa už nájde v úložisku. Je to veľmi praktické, keď je napríklad potrebné zobraziť na stránke nejaké obrázky. Stačí nastaviť odložený odkaz v src a hotovo. Môžete vymyslieť veľa scenárov.

Api klienta

  • async Client.prototype.storeFile() — uloženie súboru
  • async Client.prototype.getFileLink() — získanie priameho odkazu na súbor
  • async Client.prototype.getFileLinks() — získanie zoznamu priamych odkazov na súbor zo všetkých uzlov, kde sa nachádza
  • async Client.prototype.getFileToBuffer() — získať súbor do vyrovnávacej pamäte
  • async Client.prototype.getFileToPath() — získať súbor do súborového systému
  • async Client.prototype.getFileToBlob() — získať súbor do blobu (pre webovú verziu)
  • async Client.prototype.removeFile() — odstrániť súbor
  • Client.prototype.createRequestedFileLink() — vytvoriť oneskorený odkaz

Export súborov na iný server

Ak chcete preniesť súbory na iný uzol, môžete:

  • Jednoducho skopírovať celý priečinok úložiska spolu s nastaveniami. (v budúcnosti to nemusí fungovať)
  • Skopírovať iba priečinok so súbormi. Ale v tomto prípade bude potrebné raz spustiť funkciu node.normalizeFilesInfo(), aby sa prepočítali všetky údaje a zapísali do databázy.
  • Použiť funkciu node.exportFiles(), ktorá spustí kopírovanie súborov.

Hlavné nastavenia uzla
Pri spustení uzla úložiska je možné zadať všetky potrebné nastavenia.
Popíšem najdôležitejšie, ostatné nájdete na GitHube.

  • storage.dataSize — veľkosť priečinka so súbormi
  • storage.tempSize — veľkosť dočasného priečinka
  • storage.autoCleanSize — minimálna veľkosť úložiska, ktorú je potrebné udržiavať. Ak zadáte tento parameter, akonáhle začne byť málo miesta, najmenej používané súbory budú odstránené.
  • file.maxSize — maximálna veľkosť súboru
  • file.minSize — minimálna veľkosť súboru
  • file.preferredDuplicates — preferovaný počet duplikátov súboru v sieti
  • file.mimeWhitelist — povolené typy súborov
  • file.mimeBlacklist — zakázané typy súborov
  • file.extWhitelist — povolené prípony súborov
  • file.extBlacklist — zakázané prípony súborov
  • file.linkCache — rôzne nastavenia cache odkazu

Takmer všetky parametre týkajúce sa veľkostí môžu byť zadané ako v absolútnych, tak aj v relatívnych hodnotách.

Práca cez príkazový riadok
Knižnicu je možné používať cez príkazový riadok. Na to je potrebné ju nainštalovať globálne: npm i -g storacle. Po tom môžete spúšťať požadované akcie z adresára s projektom, kde je uzol. Napríklad, storacle -a storeFile -f ./file.txt -c ./config.js, aby ste pridali súbor. Všetky akcie nájdete v https://github.com/ortexx/storacle/blob/master/bin/actions.js

Prečo by to mohlo byť potrebné

  • Ak chcete vytvoriť nejaký decentralizovaný projekt, v ktorom sa plánuje uchovávať a pracovať so súbormi pohodlnými metódami. Napríklad projekt s hudbou, opísaný podľa odkazu na začiatku článku, využíva storacle.
  • Ak pracuješ na akýchkoľvek iných projektoch, kde je potrebné distribuovane ukladať súbory. Môžeš si jednoducho vybudovať svoju uzavretú sieť, pružne nastaviť uzly a pridávať nové, keď to potrebuješ.
  • Ak len potrebuješ niekde uložiť súbory svojho webu a nechce sa ti písať všetko sám. Možno ti táto knižnica vyhovuje viac ako iné v tvojom prípade.
  • Ak máš projekt, v ktorom pracuješ so súbormi, ale chceš všetky manipulácie vykonávať z prehliadača. Môžeš sa vyhnúť písaniu serverového kódu.

Moje kontakty:

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster