Storacle – decentralizált fájl tároló

Storacle – decentralizált fájl tároló

Mielőtt elkezdeném, meg kell osztanom a korábbi cikkre mutató hivatkozást, hogy érthető legyen, miről is van szó.

Ebben a cikkben egy olyan réteget szeretnék megvitatni, amely a fájlok tárolásáért felelős, és hogy ezt bárki hogyan használhatja. A Storacle egy önálló könyvtár, amelynek nincs közvetlen kapcsolata a zenével. Bármilyen fájl tárolására alkalmas.

A korábbi cikkben kicsit "kielégítettem" a ipfs, de ez pontosan a megoldott feladat kontextusában történt. Összességében jónak tartom ezt a projektet. Egyszerűen jobban szeretem a lehetőséget, hogy különböző hálózatokat hozhatok létre különböző feladatokhoz. Ez lehetővé teszi a struktúra jobb szervezését, és csökkenti az egyes csomópontok és az egész hálózat terhelését. Még egy adott projekt keretein belül is szükség szerint fel lehet osztani a hálózatot részekre valamilyen kritérium alapján, csökkentve ezzel az összterhelést.

Tehát a Storacle a spreadable mechanizmusát használja a hálózat szervezéséhez. Főbb jellemzők:

  • A fájlok bármely csomóponton keresztül hozzáadhatók a tároláshoz.
  • A fájlok teljes egészében, nem blokkokban kerülnek mentésre.
  • Minden fájlnak van egyedi hash kódja a tartalma alapján a további munkához.
  • A fájlok megduplázhatók a megbízhatóság növelése érdekében.
  • A fájlok száma egy csomóponton csak a fájlrendszer korlátaitól függ (a kivételeket később érintem).
  • A fájlok száma a hálózatban a spreadable által kezelt csomópontok maximális számához van korlátozva, amelyek a második verzióban lehetővé teszik a végtelen számú csomóponttal való munkát (erről egy másik cikkben lesz szó).

Egyszerű példa, hogyan működik ez a programból:

Szerver:

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

Kliens:

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

Belső nézet

A háttérben nincs semmi különös. A fájlok számáról, a fájlok összesített méretéről és egyéb tényezőkről in-memory adatbázisban tárolódik, és frissülnek fájlok törlésekor és hozzáadásakor, így nem szükséges gyakran a fájlrendszerhez fordulni. Kivételt jelent a szemétgyűjtő bekapcsolása, amikor fájlok cirkulálására van szükség valamilyen tárolási méret elérésekor, és nem új fájlok hozzáadásának tilalmára. Ilyen esetben körbe kell nézni a tárolón, és a nagy mennyiségű fájl kezelése (> egy millió, mondjuk) jelentős terhelést okozhat. Jobb, ha kevesebb fájlt tárolunk, és több csomópontot indítunk. Ha a "tisztító" ki van kapcsolva, akkor ilyen probléma nem merül fel.

A fájltároló 256 mappából és 2 szint mélységből áll. A fájlok a második szintű mappákban tárolódnak. Tehát ha 1 millió fájl van, akkor minden ilyen mappában körülbelül 62500 fájl lesz (1000000 / sqrt(256)).

A mappák neve a fájl hash-jéből képződik, így gyorsan hozzáférhetünk, ha tudjuk a hash-t.

Ez a struktúra a tárolóval szembeni különböző követelmények alapján lett kiválasztva: gyenge fájlrendszerek támogatása, ahol egy mappában nem lenne kívánatos sok fájlt tárolni, a mappák gyors átvizsgálása szükség esetén, stb. Ez egyfajta arany középút.

Gyorsítótárazás

Fájlok hozzáadása és lekérésekor a fájlok hivatkozásai a gyorsítótárba kerülnek.
Ennek köszönhetően gyakran nem szükséges az egész hálózatot átkutatni a fájl kereséséhez. Ez felgyorsítja a hivatkozások elérését és csökkenti a hálózati terhelést. A gyorsítótárazás http fejlécen keresztül is történik.

Izomorfizmus

A kliens JavaScript nyelven íródott és izomorf, közvetlenül a böngészőből is használható. 
Fájl feltöltése lehetséges https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js mint szkript, és hozzáférést nyerhetünk a window.ClientStoracle vagy importálhatjuk a build rendszerén keresztül, stb.

Halasztott hivatkozások

Érdekes funkció a "halasztott hivatkozás". Ez egy hivatkozás egy fájlra, amelyet szinkron módon, itt és most lehet megszerezni, míg a fájl a tárolóból csak később kerül elő, amikor már megtalálható. Ez nagyon praktikus, például amikor a weboldalon bizonyos képeket kell megjeleníteni. Egyszerűen a src attribútumban megadjuk a halasztott hivatkozást, és kész. Számos esettanulmányt ki lehet találni.

Kliens API

  • async Client.prototype.storeFile() — fájl mentése
  • async Client.prototype.getFileLink() — közvetlen hivatkozás a fájlhoz
  • async Client.prototype.getFileLinks() — a fájl közvetlen hivatkozásainak listájának megszerzése az összes csomóponton, ahol elérhető
  • async Client.prototype.getFileToBuffer() — fájl megszerzése a puffertárba
  • async Client.prototype.getFileToPath() — fájl megszerzése a fájlrendszerbe
  • async Client.prototype.getFileToBlob() — fájl megszerzése blob-ba (böngésző verzióhoz)
  • async Client.prototype.removeFile() — fájl törlése
  • Client.prototype.createRequestedFileLink() — késleltetett hivatkozás létrehozása

Fájlok exportálása egy másik szerverre

Fájlok áthelyezéséhez egy másik csomópontra:

  • Egyszerűen másolja át a tároló mappát a beállításokkal együtt. (a jövőben ez nem biztos, hogy működni fog)
  • Csak a fájlokat tartalmazó mappát másolja át. De ebben az esetben egyszer indítania kell a funkciót node.normalizeFilesInfo(), hogy újraszámolja az összes adatot és bejegyezze az adatbázisba.
  • Használja a funkciót node.exportFiles(), amely megkezdi a fájlok másolását.

A csomópont fő beállításai
A tároló csomópont indításakor megadhatja az összes szükséges beállítást.
A legfontosabbakat bemutatom, a többi a GitHubon található.

  • storage.dataSize — a fájlok mappa mérete
  • storage.tempSize — a temporális mappa mérete
  • storage.autoCleanSize — a tárolónak megtartandó minimális mérete. Ha ezt a paramétert megadja, akkor amint a hely kezd hiányozni, a legkevésbé használt fájlok törlésre kerülnek.
  • file.maxSize — a fájl maximális mérete
  • file.minSize — a fájl minimális mérete
  • file.preferredDuplicates — a fájl preferált másolatainak száma a hálózatban
  • file.mimeWhitelist — megengedett fájltípusok
  • file.mimeBlacklist — tiltottnak számító fájltípusok
  • file.extWhitelist — megengedett fájl kiterjesztések
  • file.extBlacklist — tiltottnak számító fájl kiterjesztések
  • file.linkCache — hivatkozási gyorsítótárazási beállítások

Szinte az összes, mérettel kapcsolatos paramétert meg lehet adni abszolút és relatív mértékegységekben is.

Parancssoron keresztüli használat
A könyvtár a parancssoron keresztül is használható. Ehhez globálisan kell telepíteni: npm i -g storacle. Ezután a szükséges akciókat a projekttel rendelkező könyvtárból indíthatja. Például storacle -a storeFile -f ./file.txt -c ./config.js, hogy fájlt adjunk hozzá. Minden akció megtalálható a https://github.com/ortexx/storacle/blob/master/bin/actions.js

Miért lehet szükséged erre

  • Ha olyan decentralizált projektet szeretnél létrehozni, amelyben fájlokat tervezel tárolni és kezelni kényelmes módszerekkel. Például a cikk elején található zenei projekt storacle.
  • Ha bármilyen más projekten dolgozol, ahol fájlokat kell elosztva tárolni. Könnyedén létrehozhatod a saját zárt hálózatodat, rugalmasan beállíthatod a csomópontokat, és újakat adhatsz hozzá, amikor szükséges.
  • Ha csak annyira van szükséged, hogy valahol tárold a weboldalad fájljait, és nem akarsz mindent magad megírni. Lehetséges, hogy ez a könyvtár jobban illik a te esetedhez, mint mások.
  • Ha van egy projekted, amelyben fájlokkal dolgozol, de szeretnéd az összes műveletet a böngészőből végezni. Elkerülheted a szerveroldali kód írását.

Az elérhetőségeim:

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster