Storacle ā€” decentralizēta failu krātuve

Storacle ā€” decentralizēta failu krātuve

Pirms es sāku, man jādodas prom saite uz iepriekŔējo rakstulai bÅ«tu skaidrs, par ko Ä«sti ir runa.

Å ajā rakstā es vēlētos aplÅ«kot slāni, kas ir atbildÄ«gs par failu glabāŔanu, un kā to var izmantot ikviens. Storacle ir atseviŔķa bibliotēka, nav tieÅ”as saistÄ«bas ar mÅ«ziku. Varat organizēt jebkuru failu glabāŔanu.

IepriekŔējā rakstā nedaudz ā€œuzripināju mucuā€. ipfs, bet tas notika tieÅ”i tās problēmas kontekstā, kuru es risinu. Kopumā es domāju, ka Å”is projekts ir forÅ”s. Es vienkārÅ”i dodu priekÅ”roku iespējai izveidot dažādus tÄ«klus dažādiem uzdevumiem. Tas ļauj labāk organizēt struktÅ«ru un samazināt atseviŔķu mezglu un tÄ«kla slodzi kopumā. Pat viena projekta ietvaros, ja nepiecieÅ”ams, var sadalÄ«t tÄ«klu gabalos pēc kādiem kritērijiem, samazinot kopējo slodzi.

Tātad Storacle izmanto mehānismu izkaisāms tÄ«kla organizÄ“Å”anai. Galvenās iezÄ«mes:

  • Failus var pievienot krātuvei, izmantojot jebkuru mezglu.
  • Faili tiek saglabāti pilnÄ«bā, nevis blokos.
  • Katram failam ir savs unikāls satura sajaukums turpmākam darbam ar to.
  • Lai nodroÅ”inātu lielāku uzticamÄ«bu, failus var dublēt
  • Failu skaitu vienā mezglā ierobežo tikai failu sistēma (ir izņēmums, vairāk par to tālāk)
  • Failu skaitu tÄ«klā ierobežo izkliedējamās iespējas atbilstoÅ”i derÄ«go mezglu skaitam tÄ«klā, kas otrajā versijā varēs strādāt ar bezgalÄ«gu skaitu mezglu (vairāk par to citā rakstā)

VienkārÅ”s piemērs tam, kā tas parasti darbojas no programmas:

Serveris:

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

Klients:

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

IekŔā izskats

Zem pārsega nav nekā grezna. Informācija par failu skaitu, to kopējo lielumu un citiem punktiem tiek glabāta atmiņas datu bāzē un tiek atjaunināta, kad faili tiek dzēsti un pievienoti, tāpēc nav nepiecieÅ”ams bieži piekļūt failu sistēmai. Izņēmums ir atkritumu savācēja iespējoÅ”ana, kad nepiecieÅ”ams izplatÄ«t failus, kad ir sasniegts noteikts krātuves lielums, nevis aizliegt jaunu failu pievienoÅ”anu. Å ajā gadÄ«jumā jums ir apiet krātuvi, un darbs ar lielu skaitu failu (> teiksim, miljons) var izraisÄ«t ievērojamas slodzes. Un labāk ir saglabāt mazāk failu un palaist vairāk mezglu. Ja "tÄ«rÄ«tājs" ir atspējots, tad Ŕādas problēmas nav.

Failu krātuve sastāv no 256 mapēm un 2 ligzdoÅ”anas lÄ«meņiem. Faili tiek glabāti otrā lÄ«meņa mapēs. Tas ir, ja ir 1 milj. Katrā Ŕādā mapē bÅ«s aptuveni 62500 1000000 failu (256 XNUMX XNUMX / kvadrātkilometri (XNUMX)).

Mapju nosaukumi tiek veidoti no faila hash, lai jūs varētu ātri piekļūt, ja zināt jaucējkodu.

Å Ä« struktÅ«ra tika izvēlēta, pamatojoties uz lielu skaitu dažādu uzglabāŔanas prasÄ«bu: atbalsts vājām failu sistēmām, kur nav vēlams, lai vienā mapē bÅ«tu daudz failu, nepiecieÅ”amÄ«bas gadÄ«jumā ātra visu mapju apceļoÅ”ana utt. Kaut kāds zelta vidusceļŔ.

keÅ”atmiņa

Pievienojot failus, kā arÄ« tos saņemot, saites uz failiem tiek ierakstÄ«tas keÅ”atmiņā.
Pateicoties tam, ļoti bieži nav nepiecieÅ”ams Ŕķērsot visu tÄ«klu, meklējot failu. Tas paātrina saiÅ”u saņemÅ”anu un samazina tÄ«kla slodzi. KeÅ”atmiņa notiek arÄ«, izmantojot http galvenes.

Izomorfija

Klients ir rakstÄ«ts javascript un ir izomorfs, to var izmantot tieÅ”i no pārlÅ«kprogrammas. 
Varat augÅ”upielādēt failu https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js kā skripts un piekļuve logs.ClientStoracle vai importēt, izmantojot bÅ«vÄ“Å”anas sistēmu utt.

Atliktās saites

Interesanta iezÄ«me ir arÄ« ā€œatliktā atsauceā€. Å Ä« ir saite uz failu, kuru var iegÅ«t sinhroni Å”eit un tagad, un fails tiks izvilkts, kad tas jau bÅ«s atrasts krātuvē. Tas ir ļoti ērti, ja, piemēram, jums ir jāparāda daži attēli vietnē. Mēs vienkārÅ”i ievietojām atlikto saiti src, un tas arÄ« viss. JÅ«s varat izdomāt daudzus gadÄ«jumus.

Klienta API

  • async Client.prototype.storeFile() - faila saglabāŔana
  • async Client.prototype.getFileLink() ā€” iegÅ«t tieÅ”u saiti uz failu
  • async Client.prototype.getFileLinks() ā€” iegÅ«t tieÅ”o saiÅ”u sarakstu uz failu no visiem mezgliem, kur tas pastāv
  • async Client.prototype.getFileToBuffer() ā€” iegÅ«t failu buferÄ«
  • async Client.prototype.getFileToPath() ā€” iegÅ«t failu failu sistēmā
  • async Client.prototype.getFileToBlob() ā€” iegÅ«t failu blob (pārlÅ«ka versijai)
  • async Client.prototype.removeFile() - izdzēst failu
  • Client.prototype.createRequestedFileLink() ā€” izveidot atlikto saiti

Eksportējiet failus uz citu serveri

Lai pārsūtītu failus uz citu mezglu, varat:

  • VienkārÅ”i nokopējiet visu krātuves mapi kopā ar iestatÄ«jumiem. (tas var nedarboties nākotnē)
  • Kopējiet tikai mapi ar failiem. Bet Å”ajā gadÄ«jumā funkcija bÅ«s jāpalaiž vienu reizi node.normalizeFilesInfo()lai pārrēķinātu visus datus un ievadÄ«tu tos datu bāzē.
  • izmantot funkciju node.exportFiles()kas sāks kopēt failus.

Pamata mezgla iestatījumi
Startējot krātuves mezglu, varat norādÄ«t visus nepiecieÅ”amos iestatÄ«jumus.
Es aprakstÄ«Å”u visvienkārŔākos, pārējos var atrast Github.

  • storage.dataSize ā€” mapes ar failiem lielums
  • uzglabāŔana.tempSize ā€” pagaidu mapes lielums
  • storage.autoCleanSize ā€” minimālais uzglabāŔanas apjoms, kas jāuzglabā. Ja norādāt Å”o parametru, tad, tiklÄ«dz sāk pietrÅ«kt vietas, vismazāk izmantotie faili tiks dzēsti.
  • fails.maxSize ā€” maksimālais faila lielums
  • fails.minSize ā€” minimālais faila lielums
  • file.preferredDublikāti ā€” vēlamais failu dublikātu skaits tÄ«klā
  • file.mimeWhitelist - derÄ«gi failu tipi
  • file.mimeMelnais saraksts - nederÄ«gi failu tipi
  • file.extWhitelist - derÄ«gi failu paplaÅ”inājumi
  • file.extMelnais saraksts - nederÄ«gi failu paplaÅ”inājumi
  • file.linkCache - dažādi saiÅ”u keÅ”atmiņas iestatÄ«jumi

Gandrīz visus parametrus, kas saistīti ar izmēriem, var ievadīt gan absolūtā, gan relatīvā vērtībā.

Darbs, izmantojot komandrindu
Bibliotēku var izmantot, izmantojot komandrindu. Lai to izdarÄ«tu, tas jāinstalē globāli: npm i -g Storacle. Pēc tam jÅ«s varat palaist nepiecieÅ”amās darbÄ«bas no projekta direktorija, kurā atrodas mezgls. Piemēram, storacle -a storeFile -f ./file.txt -c ./config.jslai pievienotu failu. Visas darbÄ«bas var atrast https://github.com/ortexx/storacle/blob/master/bin/actions.js

Kāpēc jums tas varētu būt vajadzīgs?

  • Ja vēlaties izveidot kādu decentralizētu projektu, kurā plānojat uzglabāt un strādāt ar failiem, izmantojot ērtas metodes. Piemēram, mÅ«zikas projekts, kas aprakstÄ«ts raksta sākumā esoÅ”ajā saitē, izmanto krātuve.
  • Ja strādājat ar citiem projektiem, kur faili jāglabā izplatÄ«tā veidā. Varat viegli izveidot savu slēgto tÄ«klu, elastÄ«gi konfigurēt mezglus un vajadzÄ«bas gadÄ«jumā pievienot jaunus.
  • Ja jums vienkārÅ”i kaut kur jāglabā vietnes faili un jums ir pārāk daudz rakstÄ«t visu pats. Iespējams, Ŕī bibliotēka jÅ«su gadÄ«jumā ir labāk piemērota nekā citas.
  • Ja jums ir projekts, kurā strādājat ar failiem, bet vēlaties veikt visas manipulācijas no pārlÅ«kprogrammas. Varat izvairÄ«ties no servera koda rakstÄ«Å”anas.

Mani kontakti:

Avots: www.habr.com

Pievieno komentāru