Storacle - malcentralizita dosierstokado

Storacle - malcentralizita dosierstokado

Antaŭ ol mi komenci, mi devas foriri ligo al antaŭa artikolopor ke estu klare, pri kio precize ni parolas.

En ĉi tiu artikolo mi ŝatus rigardi la tavolon, kiu respondecas pri stokado de dosieroj, kaj kiel ĝi povas esti uzata de iu ajn. Storacle estas memstara biblioteko, ne ekzistas rekta ligo kun muziko. Vi povas organizi la stokadon de ajna dosiero.

En la antaŭa artikolo, mi iomete "rulis la barelon". ipfs, sed tio okazis ĝuste en la kunteksto de la problemo, kiun mi solvis. Ĝenerale, mi pensas, ke ĉi tiu projekto estas bonega. Mi nur preferas la kapablon krei malsamajn retojn por malsamaj taskoj. Ĉi tio permesas vin pli bone organizi la strukturon kaj redukti la ŝarĝon sur individuaj nodoj kaj la reto entute. Eĉ en la kadro de unu projekto, se necese, vi povas dividi la reton en pecojn laŭ iuj kriterioj, reduktante la ĝeneralan ŝarĝon.

Do storacle uzas la mekanismon disvastigebla por organizi reton. Ĉefaj Trajtoj:

  • Dosieroj povas esti aldonitaj al la deponejo per iu ajn nodo.
  • Dosieroj estas konservitaj tute, ne en blokoj.
  • Ĉiu dosiero havas sian propran unikan enhavon por plua laboro kun ĝi.
  • Dosieroj povas esti duobligitaj por pli granda fidindeco
  • La nombro da dosieroj sur unu nodo estas limigita nur de la dosiersistemo (estas escepto, pli pri tio sube)
  • La nombro da dosieroj en la reto estas limigita de la disvastigeblaj kapabloj laŭ la nombro da validaj nodoj en la reto, kiuj en la dua versio povos labori kun senfina nombro da nodoj (pli pri tio en alia artikolo)

Simpla ekzemplo de kiel tio ĝenerale funkcias de la programo:

Servilo:

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

Kliento:

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

Interna vido

Estas nenio fantazia sub la kapuĉo. Informoj pri la nombro da dosieroj, ilia totala grandeco kaj aliaj punktoj estas konservitaj en en-memora datumbazo kaj estas ĝisdatigitaj kiam dosieroj estas forigitaj kaj aldonitaj, do ne necesas ofte aliri la dosiersistemon. Escepto estas ebligi la rubkolektilon kiam vi bezonas cirkuli dosierojn kiam certa konserva grandeco estas atingita, kaj ne malpermesi aldoni novajn. En ĉi tiu kazo, vi devas preteriri la stokadon, kaj labori kun granda nombro da dosieroj (> diru miliono) povas konduki al gravaj ŝarĝoj. Kaj estas pli bone stoki malpli da dosieroj kaj ruli pli da nodoj. Se la "purigilo" estas malŝaltita, tiam ne ekzistas tia problemo.

La dosierstokado konsistas el 256 dosierujoj kaj 2 niveloj de nestado. Dosieroj estas konservitaj en duanivelaj dosierujoj. Tio estas, se estas 1 miliono. Estos ĉirkaŭ 62500 dosieroj en ĉiu tia dosierujo (1000000 / sqrt(256)).

La dosierujo-nomoj estas formitaj el la dosierhaŝiŝo, por ke vi povas rapide aliri ĝin se vi konas la haŝiŝon.

Ĉi tiu strukturo estis elektita surbaze de granda nombro da malsamaj konservaj postuloj: subteno por malfortaj dosiersistemoj, kie ne estas dezirinde havi multajn dosierojn en unu dosierujo, rapida traveturado de ĉiuj dosierujoj se necese, ktp. Ia ora meznombro.

kaŝmemoro

Aldonante dosierojn, same kiel ricevante ilin, ligiloj al dosieroj estas skribitaj al la kaŝmemoro.
Dank' al tio, tre ofte ne necesas trairi la tutan reton serĉante dosieron. Ĉi tio akcelas la ricevon de ligiloj kaj reduktas la ŝarĝon en la reto. Kaŝmemoro ankaŭ okazas per http-kapoj.

Izomorfio

La kliento estas skribita en Javaskripto kaj estas izomorfa, ĝi povas esti uzata rekte de la retumilo. 
Vi povas alŝuti la dosieron https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js kiel skripto kaj aliro fenestro.ClientStoracle aŭ importi per la konstrusistemo, ktp.

Prokrastaj ligiloj

Interesa trajto estas ankaŭ "prokrastita referenco". Ĉi tio estas ligilo al dosiero, kiu povas esti akirita sinkrone, ĉi tie kaj nun, kaj la dosiero estos eltirita kiam ĝi jam troviĝas en la stokado. Ĉi tio estas tre oportuna kiam, ekzemple, vi bezonas montri kelkajn bildojn en la retejo. Ni nur metis prokrastan ligon en src kaj jen ĝi. Vi povas elpensi multajn kazojn.

Kliento API

  • async Client.prototype.storeFile() - konservante la dosieron
  • async Client.prototype.getFileLink() — ricevi rektan ligon al la dosiero
  • async Client.prototype.getFileLinks () — ricevi liston de rektaj ligiloj al dosiero de ĉiuj nodoj, kie ĝi ekzistas
  • async Client.prototype.getFileToBuffer() — enigu la dosieron en la bufron
  • async Client.prototype.getFileToPath() — eniru dosieron en la dosiersistemon
  • async Client.prototype.getFileToBlob() - akiri la dosieron en blob (por retumila versio)
  • async Client.prototype.removeFile() - forigi dosieron
  • Client.prototype.createRequestedFileLink () — krei prokrastita ligo

Eksportu dosierojn al alia servilo

Por translokigi dosierojn al alia nodo, vi povas:

  • Nur kopiu la tutan stokan dosierujon kune kun la agordoj. (ĉi tio eble ne funkcios estonte)
  • Kopiu nur la dosierujon kun dosieroj. Sed, en ĉi tiu kazo, vi devos ruli la funkcion unufoje node.normalizeFilesInfo()por rekalkuli ĉiujn datumojn kaj enigi ĝin en la datumbazon.
  • uzi funkcion node.exportFiles()kiu komencos kopii dosierojn.

Bazaj nodaj agordoj
Komencante la stokan nodon, vi povas specifi ĉiujn necesajn agordojn.
Mi priskribos la plej bazajn, la ceteraj troviĝas ĉe Github.

  • stokado.dataSize - grandeco de la dosierujo kun dosieroj
  • stokado.tempSize - provizora dosierujo grandeco
  • stokado.autoCleanSize — la minimuma stoka grandeco kiu devas esti tenita. Se vi specifas ĉi tiun parametron, tuj kiam la spaco komencas elĉerpi, la malplej uzataj dosieroj estos forigitaj.
  • dosiero.maxSize - maksimuma grandeco de dosiero
  • dosiero.minSize — minimuma grandeco de dosiero
  • dosiero.preferedDuplicates — preferata nombro da duplikatoj de dosieroj en la reto
  • dosiero.mimeWhitelist - validaj dosiertipoj
  • dosiero.mimeNigra listo - nevalidaj dosiertipoj
  • dosiero.extWhitelist - validaj dosieraj etendoj
  • dosiero.extBlacklist - nevalidaj dosieraj etendoj
  • dosiero.linkCache - diversaj ligaj kaŝmemoraj agordoj

Preskaŭ ĉiuj parametroj rilataj al dimensioj povas esti enmetitaj en kaj absolutaj kaj relativaj valoroj.

Laborante per la komandlinio
La biblioteko povas esti uzata per la komandlinio. Por fari tion, vi devas instali ĝin tutmonde: npm i -g storacle. Post ĉi tio, vi povas lanĉi la necesajn agojn de la projekta dosierujo kie estas la nodo. Ekzemple, storacle -a storeFile -f ./file.txt -c ./config.jspor aldoni la dosieron. Ĉiuj agoj troviĝas en https://github.com/ortexx/storacle/blob/master/bin/actions.js

Kial vi eble bezonos ĉi tion?

  • Se vi volas krei ian malcentralizitan projekton, en kiu vi planas stoki kaj labori kun dosieroj uzante oportunajn metodojn. Ekzemple, la muzikprojekto priskribita en la ligilo komence de la artikolo uzas stokejo.
  • Se vi laboras pri iuj aliaj projektoj, kie vi devas konservi dosierojn en distribuita maniero. Vi povas facile konstrui vian fermitan reton, flekseble agordi nodojn kaj aldoni novajn kiam necesas.
  • Se vi nur bezonas stoki viajn retejo-dosierojn ie kaj estas tro multe por vi mem skribi ĉion. Eble ĉi tiu biblioteko estas pli taŭga ol aliaj en via kazo.
  • Se vi havas projekton en kiu vi laboras kun dosieroj, sed volas plenumi ĉiujn manipuladojn de la retumilo. Vi povas eviti skribi servilan kodon.

Miaj kontaktoj:

fonto: www.habr.com

Aldoni komenton