Storacle — detsentraliseeritud failide salvestuskoht

Storacle — detsentraliseeritud failide salvestuskoht

Enne alustan, pean jÀtma lingi eelmisele artiklile, et oleks selge, millest jutt.

Selles artiklis tahaksin kĂ€sitleda kihti, mis vastutab failide salvestamise eest, ja kuidas seda saavad kasutada kĂ”ik huvilised. Storacle — iseseisev teek, mis ei ole otseselt seotud muusika maailmaga. Failide salvestamine on vĂ”imalik igasuguste failide jaoks.

Eelmises artiklis kritiseerisin ma veidi ipfs, kuid see juhtus just seoses minu lahendatava ĂŒlesandega. Üldiselt pean seda projekti Ă€gedaks. Lihtsalt mulle meeldib rohkem vĂ”imalus luua erinevaid vĂ”rgustikke erinevate ĂŒlesannete jaoks. See aitab paremini struktureerida ja vĂ€hendada koormust ĂŒksikutele sĂ”lmedele ja kogu vĂ”rgule. Ühe projekti raames on isegi vĂ”imalik vajadusel jagada vĂ”rgustikku tĂŒkkideks mingite kriteeriumide pĂ”hjal, vĂ€hendades ĂŒldkoormust.

Nii et storacle kasutab mehhanismi spreadable vÔrgustiku korraldamiseks. Peamised omadused:

  • Failid saavad salvestada igast sĂ”lmest.
  • Failid salvestatakse tĂ€ielikult, mitte plokkidena.
  • Igal failil on oma ainulaadne hash sisu pĂ”hjal edasiseks töötluseks.
  • Failide kopeerimine suurema usaldusvÀÀrsuse tagamiseks
  • Ühe sĂ”lme peal olevaid faile piirab ainult failisĂŒsteem (on erandeid, mis jĂ€rgnevas arutelus).
  • VĂ”rgus olevate failide arvu piirab spreadable vĂ”imekus sarnaste sĂ”lmede arvu osas, mis teises versioonis vĂ”imaldavad töötada lĂ”pmatu arvu sĂ”lmedega (sellest rÀÀgime teises artiklis).

Lihtne nÀide, kuidas see programmide kaudu 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);
  }
})();

Kliendi:

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

Vaade seest

Mootor on tavaline. Teave failide arvu, nende kogusuuruse ja teiste detailide kohta hoitakse in-memory andmebaasis ning seda uuendatakse failide kustutamisel ja lisamisel, seega pole sageli vajadust failisĂŒsteemi juurde pöörduda. Ainus erand on prĂŒgikoguja aktiviseerimine, kui on vaja faile ringlusse vĂ”tta, kui mingid salvestusmÔÔdud on saavutatud, mitte uute lisamise keelamine. Sellisel juhul tuleb salvestust ringi vaadata, ja suure arvu failidega (öelgem, ĂŒle miljoni) vĂ”ib see tekitada mĂ€rkimisvÀÀrset koormust. Seega on parem hoida vĂ€hem faile ja kĂ€ivitada rohkem sĂ”lmi. Kui 'puhastaja' on vĂ€lja lĂŒlitatud, ei ole sellist probleemi.

Failide salvestus koosneb 256 kaustast ja 2 taseme sĂŒgavusest. Failid asuvad teise taseme kaustades. Seega, kui on 1 miljon faili, on igas sellises kaustas umbes 62500 tĂŒkki (1000000 / sqrt(256)).

Kaustade nimed genereeritakse faili hash'i pÔhjal, et saaks kiiresti juurde pÀÀseda, teades hash'i.

Selline struktuur valiti lĂ€htuvalt paljusid erinevaid nĂ”udmisi salvestusele: nĂ”rkade failisĂŒsteemide toetamine, kus ĂŒhes kaustas ei ole soovitatav hoida palju faile, kiire kaustade lĂ€bivaatamine vajadusel jne. Teatud kuldne keskkoht.

VahemÀlu

Failide lisamisel ja ka nende saamisel salvestatakse vahemÀlu faile linke.
Selle tĂ”ttu ei pea sageli ĂŒle kogu vĂ”rgu failide otsimise nimel ringi liikuma. See kiirendab linkide saamist ja vĂ€hendab vĂ”rgu koormust. Samuti toimub vahemĂ€lestus lĂ€bi http pealkirjade.

Isomorfism

Klienditarkvara on kirjutatud Javascriptis ja on isomorfne, seda saab kasutada otse brauserist. 
Faili saab ĂŒles laadida https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js nagu skripti ja pÀÀseda juurde window.ClientStoracle vĂ”i importida lĂ€bi koostesĂŒsteemi jne.

Edasi lĂŒkatud lingid

Huvitav omadus on ka 'edasi lĂŒkatud link'. See on link failile, mida saab saada sĂŒnkroonselt, siin ja praegu, ja fail tĂ”mmatakse, kui see juba salvestusest leitud. See on vĂ€ga mugav, kui nĂ€iteks tuleb nĂ€idata mingisuguseid pilte veebilehel. Lihtsalt mÀÀrame src jaoks edasi lĂŒkatud lingi ja kĂ”ik. Juhtumeid vĂ”ib vĂ€lja mĂ”elda palju.

Kliendi API

  • async Client.prototype.storeFile() — faili salvestamine
  • async Client.prototype.getFileLink() — faili otsese lingi saamine
  • async Client.prototype.getFileLinks() — saada otseĂŒhenduste loend faili jaoks kĂ”igilt sĂ”lmedelt, kus see olemas on
  • async Client.prototype.getFileToBuffer() — saada fail pĂ€ntesse
  • async Client.prototype.getFileToPath() — saada fail failisĂŒsteemi
  • async Client.prototype.getFileToBlob() — saada fail blob'ina (brauseri versiooni jaoks)
  • async Client.prototype.removeFile() — eemaldada fail
  • Client.prototype.createRequestedFileLink() — luua viivitatud link

Failide eksportimine teisele serverile

Failide teisaldamiseks teisele sÔlmele saab:

  • Lihtsalt kopeerida kogu salvestusse mĂ”eldud kaust koos seadistustega. (tulevikus see ei pruugi töötada)
  • Kopeerida ainult failide kaust. Kuid sel juhul tuleb ĂŒhe korra kĂ€ivitada funktsioon node.normalizeFilesInfo(), et ĂŒmber arvutada kĂ”ik andmed ja sisestada need andmebaasi.
  • Kasutage funktsiooni node.exportFiles(), mis alustab failide kopeerimist.

SÔlme pÔhiseaded
SalvestussÔlme kÀivitamisel saab mÀÀrata kÔik vajalikud seaded.
Kirjeldan kĂ”ige olulisemaid, ĂŒlejÀÀnud leiate GitHubist.

  • storage.dataSize — failide kausta suurus
  • storage.tempSize — ajutise kausta suurus
  • storage.autoCleanSize — minimaalne salvestusruumi suurus, mida tuleb hoida. Kui see parameeter on mÀÀratud, siis kui ruum hakkab otsa saama, eemaldatakse kĂ”ige vĂ€hem kasutatavad failid.
  • file.maxSize — faili maksimaalne suurus
  • file.minSize — faili minimaalne suurus
  • file.preferredDuplicates — eelistatud failide koopiaarv vĂ”rgus
  • file.mimeWhitelist — lubatud faili tĂŒĂŒbid
  • file.mimeBlacklist — keelatud faili tĂŒĂŒbid
  • file.extWhitelist — lubatud faili laiendid
  • file.extBlacklist — keelatud faili laiendid
  • file.linkCache — erinevad linkide vahemĂ€lu seaded

Peaaegu kĂ”ik parameetrid, mis on seotud suurustega, vĂ”ivad olla mÀÀratud nii absoluutsetes kui ka suhtelistes mÔÔtĂŒhikutes.

Töö kÀsurealt
Raamatukogu saab kasutada kÀsurealt. Selleks tuleb see globaalset installida: npm i -g storacle. PÀrast seda saab vajalikke tegevusi kÀivitada projektikaustas, kus on sÔlm. NÀiteks, storacle -a storeFile -f ./file.txt -c ./config.js, et lisada fail. KÔiki tegevusi saab leida https://github.com/ortexx/storacle/blob/master/bin/actions.js

Miks see vÔiks sul vaja minna

  • Kui soovid luua mĂ”nda detsentraliseeritud projekti, kus on plaanis salvestada ja töötada failidega mugaval viisil. NĂ€iteks projekt muusika osas, mida on kirjeldatud artikli alguses, kasutab storacle.
  • Kui töötad muude projektide kallal, kus on vajalik failide hajutatud salvestamine, saad hĂ”lpsasti luua oma privaatvĂ”rgu, paindlikult konfigureerida sĂ”lmi ja lisada uusi, kui see on vajalik.
  • Kui vajad lihtsalt kohta, kus salvestada oma saidi faile ja ei viitsi kĂ”ike ise kirjutada, sobib see teek vĂ”ib-olla paremini kui teised sinu jaoks.
  • Kui sul on projekt, kus töötad failidega, kuid soovid kĂ”ik toimingud teha brauserist, saad vĂ€ltida serverikoodi kirjutamist.

Minu kontaktid:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster