Storacle – detsentraliseeritud failisalvestus

Storacle – detsentraliseeritud failisalvestus

Enne kui alustan, pean lahkuma link eelmisele artiklileet oleks selge, millest me täpselt räägime.

Selles artiklis tahaksin vaadata kihti, mis vastutab failide salvestamise eest ja kuidas seda igaüks kasutada saab. Storacle on iseseisev raamatukogu, puudub otsene seos muusikaga. Saate korraldada mis tahes failide salvestust.

Eelmises artiklis "veerisin tünni" veidi edasi ipfs, kuid see juhtus just minu lahendatava probleemi kontekstis. Üldiselt arvan, et see projekt on lahe. Eelistan lihtsalt võimalust luua erinevate ülesannete jaoks erinevaid võrgustikke. See võimaldab teil struktuuri paremini korraldada ja vähendada üksikute sõlmede ja võrgu kui terviku koormust. Isegi ühe projekti raames saate vajadusel võrgu osadeks jagada mõne kriteeriumi järgi, vähendades üldist koormust.

Nii et Storacle kasutab mehhanismi levitav võrgustiku korraldamiseks. Põhijooned:

  • Faile saab hoidlasse lisada mis tahes sõlme kaudu.
  • Failid salvestatakse täielikult, mitte plokkidena.
  • Igal failil on oma kordumatu sisu räsi, et sellega edasi töötada.
  • Suurema usaldusväärsuse tagamiseks saab faile dubleerida
  • Failide arvu ühes sõlmes piirab ainult failisüsteem (on erand, sellest lähemalt allpool)
  • Võrgus olevate failide arvu piiravad levitatavad võimalused vastavalt võrgu kehtivate sõlmede arvule, mis teises versioonis on võimelised töötama lõpmatu arvu sõlmedega (sellest lähemalt teises artiklis)

Lihtne näide selle kohta, kuidas see programmis üldiselt töötab:

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

Seestvaade

Kapoti all pole midagi uhket. Teave failide arvu, nende kogumahu ja muude punktide kohta salvestatakse mälus olevasse andmebaasi ning seda uuendatakse failide kustutamisel ja lisamisel, nii et failisüsteemile pole vaja sageli juurde pääseda. Erandiks on prügikoguja lubamine, kui peate teatud salvestusmahu saavutamisel faile ringlema, mitte keelama uute lisamist. Sellisel juhul peate hoidlast mööda minema ja suure hulga failidega (> ütleme miljon) töötamine võib kaasa tuua märkimisväärseid koormusi. Ja parem on salvestada vähem faile ja käitada rohkem sõlmi. Kui "puhastaja" on keelatud, siis sellist probleemi pole.

Failide salvestusruum koosneb 256 kaustast ja kahest pesastamistasemest. Faile salvestatakse teise taseme kaustadesse. See tähendab, et kui on 2 miljon. Igas sellises kaustas on umbes 1 62500 faili (1000000 256 XNUMX / sqrt (XNUMX)).

Kaustanimed moodustatakse failiräsist, et saaksite sellele kiiresti juurde pääseda, kui teate räsi.

Selle struktuuri valikul lähtuti suurest hulgast erinevatest salvestusnõuetest: nõrkade failisüsteemide tugi, kus ühes kaustas ei ole soovitav palju faile, vajadusel kõigi kaustade kiire läbimine jne. Mingi kuldne kesktee.

vahemällu salvestamine

Failide lisamisel ja ka vastuvõtmisel kirjutatakse failide lingid vahemällu.
Tänu sellele pole sageli vaja faili otsimiseks kogu võrku läbida. See kiirendab linkide vastuvõtmist ja vähendab võrgu koormust. Vahemällu salvestamine toimub ka http-päiste kaudu.

Isomorfia

Klient on kirjutatud javascriptis ja on isomorfne, seda saab kasutada otse brauserist. 
Saate faili üles laadida https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js skriptina ja juurdepääsuna aken.ClientStoracle või importida ehitussüsteemi kaudu jne.

Edasilükatud lingid

Huvitav funktsioon on ka "edasilükkatud viide". See on link failile, mille saab hankida sünkroonselt, siin ja praegu, ning fail tõmmatakse üles, kui see on juba mälust leitud. See on väga mugav, kui peate näiteks saidil mõnda pilti näitama. Panime lihtsalt src-sse edasilükatud lingi ja kõik. Võite tulla paljude juhtumitega.

Kliendi API

  • async Client.prototype.storeFile() - faili salvestamine
  • async Client.prototype.getFileLink() — failile otselingi saamine
  • async Client.prototype.getFileLinks() — failile viivate otselinkide loendi hankimine kõigist sõlmedest, kus see on olemas
  • async Client.prototype.getFileToBuffer() — laadige fail puhvrisse
  • async Client.prototype.getFileToPath() — hankige fail failisüsteemi
  • async Client.prototype.getFileToBlob() - hankige fail blobis (brauseri versiooni jaoks)
  • async Client.prototype.removeFile() - faili kustutamine
  • Client.prototype.createRequestedFileLink() — looge edasilükatud link

Ekspordi failid teise serverisse

Failide teisaldamiseks teise sõlme saate teha järgmist.

  • Lihtsalt kopeerige kogu salvestuskaust koos sätetega. (see ei pruugi tulevikus toimida)
  • Kopeerige ainult failidega kaust. Kuid sel juhul peate funktsiooni üks kord käivitama node.normalizeFilesInfo()et kõik andmed ümber arvutada ja andmebaasi sisestada.
  • kasuta funktsiooni node.exportFiles()mis hakkab faile kopeerima.

Põhilised sõlme seaded
Salvestussõlme käivitamisel saate määrata kõik vajalikud sätted.
Kirjeldan kõige elementaarsemaid, ülejäänud leiate Githubist.

  • storage.dataSize — failidega kausta suurus
  • ladustamine.tempSize — ajutine kausta suurus
  • storage.autoCleanSize — minimaalne ladustamismaht, mida tuleb hoida. Kui määrate selle parameetri, kustutatakse niipea, kui ruum hakkab otsa saama, kõige vähem kasutatud failid.
  • file.maxSize - maksimaalne faili suurus
  • file.minSize — faili minimaalne suurus
  • file.preferredDuplikaadid — eelistatud failiduplikaatide arv võrgus
  • file.mimeWhitelist - kehtivad failitüübid
  • file.mimeMust nimekiri - kehtetud failitüübid
  • file.extWhitelist - kehtivad faililaiendid
  • file.extMust nimekiri - kehtetud faililaiendid
  • file.linkCache - erinevad linkide vahemällu salvestamise seaded

Peaaegu kõiki mõõtmetega seotud parameetreid saab sisestada nii absoluut- kui ka suhtelistes väärtustes.

Töötamine käsurea kaudu
Teeki saab kasutada käsurea kaudu. Selleks peate selle globaalselt installima: npm i -g salvestusruum. Pärast seda saate käivitada vajalikud toimingud projektikataloogist, kus sõlm asub. Näiteks, Storacle -a StoreFile -f ./file.txt -c ./config.jsfaili lisamiseks. Kõik toimingud leiate siit https://github.com/ortexx/storacle/blob/master/bin/actions.js

Miks sa seda vajad?

  • Kui soovite luua mingisuguse detsentraliseeritud projekti, milles kavatsete faile mugavate meetoditega salvestada ja nendega töötada. Näiteks kasutab artikli alguses lingil kirjeldatud muusikaprojekt hoidla.
  • Kui töötate mõne muu projektiga, kus peate faile jaotatud viisil salvestama. Saate hõlpsasti luua suletud võrku, paindlikult konfigureerida sõlmi ja vajadusel lisada uusi.
  • Kui teil on vaja lihtsalt oma veebisaidi failid kuhugi salvestada ja teil on liiga palju kõike ise kirjutada. Võib-olla sobib see raamatukogu teie puhul paremini kui teised.
  • Kui teil on projekt, milles töötate failidega, kuid soovite kõiki manipuleerimisi teha brauserist. Saate vältida serveri koodi kirjutamist.

Minu kontaktid:

Allikas: www.habr.com

Lisa kommentaar