Storacle - dreifð skráageymsla

Storacle - dreifð skráageymsla

Áður en ég byrja verð ég að fara tengill á fyrri greinþannig að það sé alveg ljóst hvað við erum að tala um.

Í þessari grein langar mig að skoða lagið sem ber ábyrgð á að geyma skrár og hvernig það er hægt að nota af hverjum sem er. Storacle er sjálfstætt bókasafn, það eru engin bein tengsl við tónlist. Þú getur skipulagt geymslu á hvaða skrá sem er.

Í fyrri greininni „velti ég tunnunni“ aðeins áfram ipfs, en þetta gerðist einmitt í samhengi við vandamálið sem ég var að leysa. Á heildina litið finnst mér þetta verkefni vera flott. Ég kýs bara getu til að búa til mismunandi net fyrir mismunandi verkefni. Þetta gerir þér kleift að skipuleggja uppbygginguna betur og draga úr álagi á einstaka hnúta og netið í heild. Jafnvel innan ramma eins verkefnis, ef nauðsyn krefur, geturðu skipt netinu í sundur samkvæmt sumum forsendum, sem minnkar heildarálagið.

Þannig að geymsla notar vélbúnaðinn dreifanlegt til að skipuleggja net. Lykil atriði:

  • Hægt er að bæta skrám við geymsluna í gegnum hvaða hnút sem er.
  • Skrár eru vistaðar að öllu leyti, ekki í blokkum.
  • Hver skrá er með sitt einstaka innihaldskjallborð til frekari vinnu með hana.
  • Hægt er að afrita skrár fyrir meiri áreiðanleika
  • Fjöldi skráa á einum hnút er aðeins takmarkaður af skráarkerfinu (það er undantekning, meira um það hér að neðan)
  • Fjöldi skráa á netinu er takmarkaður af útbreiðslumöguleikum í samræmi við fjölda gilda hnúta á netinu, sem í annarri útgáfu mun geta unnið með óendanlega fjölda hnúta (meira um þetta í annarri grein)

Einfalt dæmi um hvernig þetta virkar almennt úr forritinu:

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

Viðskiptavinur:

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

Að innan

Það er ekkert fínt undir húddinu. Upplýsingar um fjölda skráa, heildarstærð þeirra og aðra punkta eru geymdar í gagnagrunni í minni og uppfærast þegar skrám er eytt og þeim bætt við, þannig að það er óþarfi að hafa oft aðgang að skráarkerfinu. Undantekning er að virkja sorphirðu þegar þú þarft að dreifa skrám þegar ákveðinni geymslustærð er náð, og ekki banna að bæta við nýjum. Í þessu tilviki þarftu að fara framhjá geymslunni og vinna með mikinn fjölda skráa (> segjum milljón) getur leitt til verulegs álags. Og það er betra að geyma færri skrár og keyra fleiri hnúta. Ef "hreinsirinn" er óvirkur, þá er ekkert slíkt vandamál.

Skráageymslan samanstendur af 256 möppum og 2 stigum hreiður. Skrár eru geymdar í möppum á öðru stigi. Það er að segja ef það eru 1 millj. Það verða um 62500 skrár í hverri slíkri möppu (1000000 / sqrt(256)).

Möppunöfnin eru mynduð úr skráarhassinu þannig að þú getur fljótt nálgast það ef þú þekkir kjötkássa.

Þessi uppbygging var valin með hliðsjón af miklum fjölda mismunandi geymslukröfum: Stuðningur við veik skráarkerfi, þar sem ekki er æskilegt að hafa margar skrár í einni möppu, fljótur að fara yfir allar möppur ef þörf krefur o.s.frv. Einhvers konar gullinn meðalvegur.

skyndiminni

Þegar skrám er bætt við, sem og við móttöku þeirra, eru tenglar á skrár skrifaðir í skyndiminni.
Þökk sé þessu er mjög oft engin þörf á að fara yfir allt netið í leit að skrá. Þetta flýtir fyrir móttöku tenglum og dregur úr álagi á netið. Skyndiminni fer einnig fram með http hausum.

Myndbrigði

Viðskiptavinurinn er skrifaður í javascript og er ísómorfi, það er hægt að nota það beint úr vafranum. 
Þú getur hlaðið upp skránni https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js sem handrit og aðgangur window.ClientStoracle eða flytja inn í gegnum byggingarkerfið o.s.frv.

Frestað tenglar

Áhugaverður eiginleiki er einnig „frestað tilvísun“. Þetta er hlekkur á skrá sem hægt er að nálgast samstillt, hér og nú, og skráin verður dregin upp þegar hún er þegar að finna í geymslunni. Þetta er mjög þægilegt þegar þú þarft til dæmis að sýna nokkrar myndir á síðunni. Við settum bara frestað hlekk í src og það er það. Þú getur komið með mörg mál.

Viðskiptavinur API

  • async Client.prototype.storeFile() - vista skrána
  • async Client.prototype.getFileLink() - að fá beinan hlekk á skrána
  • async Client.prototype.getFileLinks() — að fá lista yfir bein tengla á skrá frá öllum hnútum þar sem hún er til
  • async Client.prototype.getFileToBuffer() — fáðu skrána í biðminni
  • async Client.prototype.getFileToPath() — fáðu skrá inn í skráarkerfið
  • async Client.prototype.getFileToBlob() - fáðu skrána í blob (fyrir vafraútgáfu)
  • async Client.prototype.removeFile() - eyða skrá
  • Client.prototype.createRequestedFileLink() - búa til frestað tengil

Flytja út skrár á annan netþjón

Til að flytja skrár í annan hnút geturðu:

  • Afritaðu bara alla geymslumöppuna ásamt stillingunum. (þetta virkar kannski ekki í framtíðinni)
  • Afritaðu aðeins möppuna með skrám. En í þessu tilfelli þarftu að keyra aðgerðina einu sinni node.normalizeFilesInfo()að endurreikna öll gögnin og færa þau inn í gagnagrunninn.
  • nota aðgerð node.exportFiles()sem mun byrja að afrita skrár.

Grunnstillingar fyrir hnút
Þegar þú ræsir geymsluhnútinn geturðu tilgreint allar nauðsynlegar stillingar.
Ég mun lýsa þeim einföldustu, restina er að finna á Github.

  • storage.dataSize — stærð möppunnar með skrám
  • geymslu.tempStærð — tímabundin möppustærð
  • storage.autoCleanSize — lágmarksgeymslustærð sem þarf að geyma. Ef þú tilgreinir þessa færibreytu, þá verður minnst notuðu skránum eytt um leið og plássið byrjar að klárast.
  • file.maxSize - hámarks skráarstærð
  • skrá.mínStærð — lágmarksskráarstærð
  • file.preferredDuplicates — æskilegur fjöldi afrita skráa á netinu
  • file.mimeWhitelist - gildar skráargerðir
  • file.mimeSvartur listi - ógildar skráargerðir
  • file.extWhitelist - gildar skráarendingar
  • file.extBlacklist - ógildar skráarendingar
  • file.linkCache - ýmsar stillingar fyrir skyndiminni hlekkja

Næstum allar færibreytur sem tengjast víddum er hægt að slá inn í bæði algildum og hlutfallslegum gildum.

Að vinna í gegnum skipanalínuna
Hægt er að nota bókasafnið í gegnum skipanalínuna. Til að gera þetta þarftu að setja það upp á heimsvísu: npm i -g geymsla. Eftir þetta geturðu ræst nauðsynlegar aðgerðir úr verkefnaskránni þar sem hnúturinn er. Til dæmis, storacle -a storeFile -f ./file.txt -c ./config.jstil að bæta við skránni. Allar aðgerðir má finna í https://github.com/ortexx/storacle/blob/master/bin/actions.js

Af hverju gætir þú þurft þetta?

  • Ef þú vilt búa til einhvers konar dreifð verkefni þar sem þú ætlar að geyma og vinna með skrár með þægilegum aðferðum. Til dæmis notar tónlistarverkefnið sem lýst er í tenglinum í upphafi greinarinnar geymsla.
  • Ef þú vinnur við önnur verkefni þar sem þú þarft að geyma skrár á dreifðan hátt. Þú getur auðveldlega byggt upp lokaða netið þitt, stillt hnúta á sveigjanlegan hátt og bætt við nýjum þegar þörf krefur.
  • Ef þú þarft bara að geyma vefsíðuskrárnar þínar einhvers staðar og það er of mikið fyrir þig að skrifa allt sjálfur. Kannski hentar þetta bókasafn betur en önnur í þínu tilviki.
  • Ef þú ert með verkefni þar sem þú vinnur með skrár, en vilt framkvæma allar meðhöndlun úr vafranum. Þú getur forðast að skrifa netþjónskóða.

Tengiliðir mínir:

Heimild: www.habr.com

Bæta við athugasemd