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

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster