Storacle — detsentraliseeritud failide salvestus

Storacle — detsentraliseeritud failide salvestus

Enne alustan, pean jagama linki eelnevale artiklile, et oleks selge, millest täpselt jutt käib.

Selles artiklis soovin käsitleda kihti, mis vastutab failide salvestamise eest, ja kuidas seda saab kasutada iga inimene. Storacle on iseseisev raamatukogu, ei ole otsest seost muusika toetamisega. Failide salvestamist saab korraldada vabalt.

Eelnevas artiklis kritiseeris siin-seal midagi ipfs, kuid see juhtus just seoses käsitletava probleemiga. Üldiselt pean ma seda projekti väga heaks. Lihtsalt mulle meeldib rohkem võimalus luua erinevaid võrke erinevate ülesannete jaoks. See võimaldab paremini korraldada struktuuri ja vähendada eraldi sõlmede ning kogu võrgu koormust. Isegi ühe projekti raames saab vajadusel võrku jagada tükkideks teatud kriteeriumide alusel, vähendades üldkoormust.

Nii et storacle kasutab mehhanismi spreadable võrgu korraldamiseks. Peamised omadused:

  • Faile saab salvestusse lisada läbi mis tahes sõlme.
  • Failid salvestatakse tervikuna, mitte plokkidena.
  • Igal failil on oma ainulaadne hash sisu põhjal edasiseks töötlemiseks.
  • Failid võivad olla dubleeritud suurema usaldusväärsuse saavutamiseks
  • Failide arv ühel sõlmel on piiratud ainult failisüsteemiga (on erand, millest räägin allpool)
  • Failide arv võrgus on piiratud spreadable'i võimalustega nagu lubatud sõlmede arv võrgus, mis teises versioonis võimaldavad töötada piiramatu arvuga sõlmi (sellest räägitakse teises artiklis)

Lihtne näide, kuidas see kõik programmist 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 seestpoolt

Allikate all pole midagi ülemäära erakordset. Teave failide arvu, nende kogusuuruse ja muude aspektide kohta salvestatakse in-memory andmebaasi ning uuendatakse failide kustutamisel ja lisamisel, seega pole tihti vaja failisüsteemi juurde pöörduda. Erandiks on prügi kogumise aktiveerimine, kui failide ringlus on vajalik, kui salvestuse teatud suurustele jõutakse, mitte uute lisandmiste keelamine. Sellisel juhul tuleb salvestust ringi liikuda, ja suure hulga failidega (üle miljoni näiteks) võib kaasneda märkimisväärne koormus. Seetõttu on parem hoida vähem faile ja käivitada rohkem sõlmi. Kui "puhastaja" on välja lülitatud, siis sellist probleemi ei esine.

Failide salvestus koosneb 256 kaustast ja 2 tasemest sügavusest. Failid asuvad teise taseme kaustades. Näiteks, kui igas sellises kaustas on 1 miljon faili, on seal umbes 62500 tükki (1000000 / sqrt(256)).

Kaustade nimed moodustatakse faili hulgast, et saaks kiiresti juurde pääseda, teades hääletust.

Selline struktuur valiti arvesse võttes mitmeid erinevaid nõudeid salvestusse, sealhulgas nõrkade failisüsteemide toetamine, kus ei tohiks ühes kaustas olla palju faile, kiire kaustade läbivaatamine vajadusel jne. Teatud kuldne kesktee.

Vahemälu

Failide lisamisel ja nende hankimisel salvestatakse vahemällu viidatud failide lingid.
Selle tõttu ei ole sageli vaja otsida kogu võrku failide leidmiseks. See kiirendab linkide hankimist ja vähendab võrgu koormust. Vahemällu salvestamine toimub ka http-päistes.

Isomorfism

Kliendiprogramm on kirjutatud javascriptis ja on isomorfne, seda saab kasutada otse brauserist. 
Faili on võimalik üles laadida https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js kui skript ning pääseda juurde window.ClientStoracle või importida läbi ehitussüsteemi jne.

Viivitusega lingid

Huvitav funktsioon on ka "viivitusega link". See on link failile, mida saab saada sünkroonselt, siin ja praegu, ja fail tõmmatakse pärast seda, kui see on salvestuses leitud. See on väga mugav, näiteks kui on vaja näidata veebisaidil mingeid pilte. Lihtsalt paneme src-i viivitusega lingi ja kõik. Juhte saab välja mõelda palju.

Kliendi api

  • async Client.prototype.storeFile() — faili salvestamine
  • async Client.prototype.getFileLink() — otseühenduse saamine failile
  • async Client.prototype.getFileLinks() — otseühenduste loendi saamine failile kõikidest sõlmedest, kus see on olemas
  • async Client.prototype.getFileToBuffer() — saada fail puhvri
  • async Client.prototype.getFileToPath() — saada fail failisüsteemi
  • async Client.prototype.getFileToBlob() — saada fail blob-ina (brauseri versiooni jaoks)
  • async Client.prototype.removeFile() — kustutada fail
  • Client.prototype.createRequestedFileLink() — luua edasilükatud link

Failide eksportimine teisele serverile

Failide teisaldamiseks teisele sõlmele on võimalik:

  • Kopeerida kogu salvestuskaust koos seadistustega. (tulevikus see võib mitte toimida)
  • Kopeerida vaid failide kaust. Kuid sel juhul tuleb ühe korra käivitada funktsioon node.normalizeFilesInfo(), et ümber arvutada kõik andmed ja kanda need andmebaasi.
  • Kasutada funktsiooni node.exportFiles(), mis alustab failide kopeerimist.

Peamised sõlme seadistused
Salvestuspunkti käivitamisel saab määrata kõik vajalikud seadistused.
Kirjeldan kõige olulisemaid, ülejäänud info leidub GitHubis.

  • storage.dataSize — failide kausta suurus
  • storage.tempSize — ajutise kausta suurus
  • storage.autoCleanSize — minimaalne salvestusruum, mida tuleb säilitada. Kui see parameeter on määratud, siis eemaldatakse kõige vähem kasutatud failid kohe, kui ruum hakkab lõppema.
  • file.maxSize — faili maksimaalne suurus
  • file.minSize — faili minimaalne suurus
  • file.preferredDuplicates — eelistatud failide dublikaatide arv võrgus
  • file.mimeWhitelist — lubatud faili tüübid
  • file.mimeBlacklist — keelatud faili tüübid
  • file.extWhitelist — lubatud faililaiendite tüüp
  • file.extBlacklist — keelatud faililaiendite tüüp
  • file.linkCache — erinevad linkide vahemälu seaded

Peaaegu kõiki, mis on seotud suurustega, saab määrata nii absoluutsetes kui suhtelistes väärtustes.

Töötamine käsurealt
Raamatukogu on võimalik kasutada käsurealt. Selleks tuleb see globaalselt installida: npm i -g storacle. Pärast seda saab käivitada vajalikud toimingud projekti kaustas, kus on Node. Näiteks, storacle -a storeFile -f ./file.txt -c ./config.js, et faili lisada. Kõiki toiminguid saab leida https://github.com/ortexx/storacle/blob/master/bin/actions.js

Miks sa võid seda vajada

  • Kui soovid luua mingi detsentraliseeritud projekti, kus plaanitakse faile mugavalt hoida ja nende kallal töötada. Näiteks, projekt muusikaga, mida on kirjeldatud artikli alguses, kasutab storacle.
  • Kui töötad teiste projektide kallal, kus on vaja faile jaotatult hoida. Sa saad lihtsalt luua oma privaatvõrgu, paindlikult seadistada sõlmi ja lisada uusi, kui see on vajalik.
  • Kui sul on lihtsalt vaja hoida oma saidi faile ja sul on ebamugav kõike ise kirjutada. Võib-olla sobib see teek paremini kui teised sinu jaoks.
  • Kui sul on projekt, kus töötad faile, kuid soovid kõik toimingud teha brauseri kaudu. Sa saad vältida serverikoodi kirjutamist.

Minu kontaktid:

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster