Storacle - stocare descentralizată a fișierelor

Storacle - stocare descentralizată a fișierelor

Înainte de a începe, trebuie să plec link la articolul anteriorastfel încât să fie clar despre ce vorbim mai exact.

În acest articol, aș dori să mă uit la stratul care este responsabil pentru stocarea fișierelor și cum poate fi folosit de oricine. Storacle este o bibliotecă de sine stătătoare, nu există nicio legătură directă cu muzica. Puteți organiza stocarea oricăror fișiere.

În articolul precedent, am „rulat butoiul” puțin ipfs, dar asta s-a întâmplat tocmai în contextul problemei pe care o rezolvam. Per total, cred că acest proiect este grozav. Prefer doar posibilitatea de a crea rețele diferite pentru sarcini diferite. Acest lucru vă permite să organizați mai bine structura și să reduceți sarcina asupra nodurilor individuale și a rețelei în ansamblu. Chiar și în cadrul unui proiect, dacă este necesar, puteți împărți rețeaua în bucăți în funcție de anumite criterii, reducând sarcina totală.

Deci storacle folosește mecanismul răspândibil pentru organizarea unei rețele. Caracteristici cheie:

  • Fișierele pot fi adăugate în depozit prin orice nod.
  • Fișierele sunt salvate în întregime, nu în blocuri.
  • Fiecare fișier are propriul său hash de conținut unic pentru a lucra în continuare cu el.
  • Fișierele pot fi duplicate pentru o mai mare fiabilitate
  • Numărul de fișiere de pe un nod este limitat doar de sistemul de fișiere (există o excepție, mai multe despre aceasta mai jos)
  • Numărul de fișiere din rețea este limitat de capacitățile răspândibile în funcție de numărul de noduri valide din rețea, care în a doua versiune va permite lucrul cu un număr infinit de noduri (mai multe despre asta într-un alt articol)

Un exemplu simplu despre cum funcționează, în general, din program:

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

Client:

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

Aspect interior

Nu e nimic elegant sub capotă. Informațiile despre numărul de fișiere, dimensiunea lor totală și alte puncte sunt stocate într-o bază de date în memorie și sunt actualizate atunci când fișierele sunt șterse și adăugate, astfel încât nu este nevoie să accesați frecvent sistemul de fișiere. O excepție este activarea colectorului de gunoi atunci când trebuie să circulați fișiere când este atinsă o anumită dimensiune de stocare și nu interziceți adăugarea altora noi. În acest caz, trebuie să ocoliți stocarea, iar lucrul cu un număr mare de fișiere (> să zicem un milion) poate duce la încărcări semnificative. Și este mai bine să stocați mai puține fișiere și să rulați mai multe noduri. Dacă „curățătorul” este dezactivat, atunci nu există o astfel de problemă.

Stocarea de fișiere constă din 256 de foldere și 2 niveluri de imbricare. Fișierele sunt stocate în foldere de nivel al doilea. Adică dacă sunt 1 milion. Vor fi aproximativ 62500 de fișiere în fiecare astfel de folder (1000000 / sqrt(256)).

Numele folderelor sunt formate din hash-ul fișierului, astfel încât să îl puteți accesa rapid dacă cunoașteți hash-ul.

Această structură a fost aleasă pe baza unui număr mare de cerințe de stocare diferite: suport pentru sisteme de fișiere slabe, unde nu este de dorit să aveți multe fișiere într-un singur folder, parcurgerea rapidă a tuturor folderelor dacă este necesar etc. Un fel de mijloc de aur.

stocarea în cache

Când adăugați fișiere, precum și când le primiți, linkurile către fișiere sunt scrise în cache.
Datorită acestui fapt, de foarte multe ori nu este nevoie să traversați întreaga rețea în căutarea unui fișier. Acest lucru accelerează primirea legăturilor și reduce sarcina în rețea. Memorarea în cache are loc și prin antetele http.

Izomorfie

Clientul este scris in javascript si este izomorf, poate fi folosit direct din browser. 
Puteți încărca fișierul https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js ca script și acces fereastra.ClientStoracle sau import prin sistemul de compilare etc.

Linkuri amânate

O caracteristică interesantă este și „referința amânată”. Acesta este un link către un fișier care poate fi obținut sincron, aici și acum, iar fișierul va fi extras atunci când este deja găsit în stocare. Acest lucru este foarte convenabil atunci când, de exemplu, trebuie să afișați câteva imagini pe site. Am pus doar un link amânat în src și asta este tot. Poți veni cu multe cazuri.

Client API

  • async Client.prototype.storeFile() - salvarea fișierului
  • async Client.prototype.getFileLink() — obținerea unui link direct către fișier
  • async Client.prototype.getFileLinks() — obținerea unei liste de legături directe către un fișier de la toate nodurile unde acesta există
  • async Client.prototype.getFileToBuffer() — introduceți fișierul în buffer
  • async Client.prototype.getFileToPath() — introduceți un fișier în sistemul de fișiere
  • async Client.prototype.getFileToBlob() - obțineți fișierul în blob (pentru versiunea de browser)
  • async Client.prototype.removeFile() - ștergeți un fișier
  • Client.prototype.createRequestedFileLink() — creați o legătură amânată

Exportați fișiere pe alt server

Pentru a transfera fișiere într-un alt nod, puteți:

  • Doar copiați întregul folder de stocare împreună cu setările. (este posibil să nu funcționeze în viitor)
  • Copiați doar folderul cu fișiere. Dar, în acest caz, va trebui să rulați funcția o dată node.normalizeFilesInfo()pentru a recalcula toate datele și a le introduce în baza de date.
  • utilizați funcția node.exportFiles()care va începe să copieze fișierele.

Setările de bază ale nodurilor
La pornirea nodului de stocare, puteți specifica toate setările necesare.
Le voi descrie pe cele mai de bază, restul le găsiți pe Github.

  • stocare.dataSize — dimensiunea folderului cu fișiere
  • stocare.tempSize — dimensiunea temporară a folderului
  • stocare.autoCleanSize — dimensiunea minimă de stocare care trebuie păstrată. Dacă specificați acest parametru, de îndată ce spațiul începe să se epuizeze, fișierele cele mai puțin utilizate vor fi șterse.
  • file.maxSize - dimensiunea maximă a fișierului
  • file.minSize - dimensiunea minimă a fișierului
  • file.preferredDuplicates — numărul preferat de duplicate de fișiere în rețea
  • file.mimeWhitelist - tipuri de fișiere valide
  • file.mimeBlacklist - tipuri de fișiere nevalide
  • file.extWhitelist - extensii de fișiere valide
  • file.extBlacklist - extensii de fișiere nevalide
  • file.linkCache - diverse setări de cache a linkurilor

Aproape toți parametrii legați de dimensiuni pot fi introduși atât în ​​valori absolute, cât și în valori relative.

Lucrează prin linia de comandă
Biblioteca poate fi utilizată prin linia de comandă. Pentru a face acest lucru, trebuie să îl instalați global: npm i -g storacle. După aceasta, puteți lansa acțiunile necesare din directorul proiectului unde se află nodul. De exemplu, storacle -a storeFile -f ./file.txt -c ./config.jspentru a adăuga fișierul. Toate acțiunile pot fi găsite în https://github.com/ortexx/storacle/blob/master/bin/actions.js

De ce ai putea avea nevoie de asta?

  • Dacă doriți să creați un fel de proiect descentralizat în care intenționați să stocați și să lucrați cu fișiere folosind metode convenabile. De exemplu, proiectul muzical descris în linkul de la începutul articolului folosește stocacul.
  • Dacă lucrați la orice alte proiecte în care trebuie să stocați fișiere într-o manieră distribuită. Vă puteți construi cu ușurință rețeaua închisă, puteți configura în mod flexibil nodurile și puteți adăuga altele noi atunci când este necesar.
  • Dacă trebuie doar să stocați fișierele site-ului dvs. undeva și este prea mult să scrieți totul singur. Poate că această bibliotecă este mai potrivită decât altele în cazul tău.
  • Dacă aveți un proiect în care lucrați cu fișiere, dar doriți să efectuați toate manipulările din browser. Puteți evita scrierea codului serverului.

Contactele mele:

Sursa: www.habr.com

Adauga un comentariu