Storacle – decentralizované úložiště souborů

Storacle – decentralizované úložiště souborů

Než začnu, musím odejít odkaz na předchozí článekaby bylo jasné, o čem přesně mluvíme.

V tomto článku bych se rád podíval na vrstvu, která je zodpovědná za ukládání souborů, a na to, jak ji může kdokoli používat. Storacle je samostatná knihovna, neexistuje přímá souvislost s hudbou. Úložiště libovolných souborů můžete organizovat.

V předchozím článku jsem trochu „převalil sud“. ipfs, ale to se stalo právě v kontextu problému, který jsem řešil. Celkově si myslím, že tento projekt je skvělý. Jen preferuji možnost vytvářet různé sítě pro různé úkoly. To vám umožní lépe organizovat strukturu a snížit zatížení jednotlivých uzlů a sítě jako celku. I v rámci jednoho projektu můžete v případě potřeby rozdělit síť na části podle určitých kritérií, čímž se sníží celkové zatížení.

Storacle tedy používá mechanismus roztažitelný pro organizaci sítě. Klíčové vlastnosti:

  • Soubory lze přidávat do úložiště prostřednictvím libovolného uzlu.
  • Soubory se ukládají celé, nikoli v blocích.
  • Každý soubor má svůj unikátní hash obsahu pro další práci s ním.
  • Pro větší spolehlivost lze soubory duplikovat
  • Počet souborů na jednom uzlu je omezen pouze souborovým systémem (existuje výjimka, více níže)
  • Počet souborů v síti je omezen rozšiřitelnými možnostmi podle počtu platných uzlů v síti, které ve druhé verzi budou umět pracovat s nekonečným počtem uzlů (více v jiném článku)

Jednoduchý příklad toho, jak to obecně funguje z programu:

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

Klient:

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

Pohled dovnitř

Pod kapotou není nic luxusního. Informace o počtu souborů, jejich celkové velikosti a dalších bodech jsou uloženy v databázi v paměti a jsou aktualizovány při mazání a přidávání souborů, takže není potřeba často přistupovat k systému souborů. Výjimkou je povolení garbage collectoru, když potřebujete cirkulovat soubory, když je dosaženo určité velikosti úložiště, a nezakazuje přidávání nových. V tomto případě musíte obejít úložiště a práce s velkým počtem souborů (> řekněme milion) může vést k značnému zatížení. A je lepší ukládat méně souborů a provozovat více uzlů. Pokud je "čistič" vypnutý, pak takový problém neexistuje.

Úložiště souborů se skládá z 256 složek a 2 úrovní vnoření. Soubory jsou uloženy ve složkách druhé úrovně. Tedy pokud jich bude 1 milion. V každé takové složce bude asi 62500 1000000 souborů (256 XNUMX XNUMX / sqrt(XNUMX)).

Názvy složek jsou tvořeny z hash souboru, abyste k nim měli rychlý přístup, pokud znáte hash.

Tato struktura byla zvolena na základě velkého množství různých požadavků na úložiště: podpora pro slabé systémy souborů, kde není žádoucí mít mnoho souborů v jedné složce, rychlé procházení všech složek v případě potřeby atd. Nějaká zlatá střední cesta.

ukládání do mezipaměti

Při přidávání souborů i při jejich přijímání se do mezipaměti zapisují odkazy na soubory.
Díky tomu velmi často není potřeba při hledání souboru procházet celou síť. To zrychluje příjem odkazů a snižuje zatížení sítě. Ukládání do mezipaměti také probíhá prostřednictvím hlaviček http.

Izomorfie

Klient je napsán v javascriptu a je izomorfní, lze jej používat přímo z prohlížeče. 
Soubor můžete nahrát https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js jako skript a přístup okno.ClientStoracle nebo importovat přes systém sestavení atd.

Odložené odkazy

Zajímavou funkcí je také „odložená reference“. Toto je odkaz na soubor, který lze získat synchronně, tady a teď, a soubor bude vytažen, až bude v úložišti již nalezen. To je velmi výhodné, když například potřebujete na stránce zobrazit nějaké obrázky. Prostě jsme vložili odložený odkaz do src a je to. Můžete přijít s mnoha případy.

Klientské rozhraní API

  • async Client.prototype.storeFile() - uložení souboru
  • async Client.prototype.getFileLink() — získání přímého odkazu na soubor
  • async Client.prototype.getFileLinks() — získání seznamu přímých odkazů na soubor ze všech uzlů, kde existuje
  • async Client.prototype.getFileToBuffer() — dostat soubor do vyrovnávací paměti
  • async Client.prototype.getFileToPath() — získat soubor do systému souborů
  • async Client.prototype.getFileToBlob() — získat soubor v blobu (pro verzi prohlížeče)
  • async Client.prototype.removeFile() - smazat soubor
  • Client.prototype.createRequestedFileLink() — vytvořit odložený odkaz

Exportujte soubory na jiný server

Chcete-li přenést soubory do jiného uzlu, můžete:

  • Stačí zkopírovat celou složku úložiště spolu s nastavením. (v budoucnu to nemusí fungovat)
  • Zkopírujte pouze složku se soubory. V tomto případě však budete muset funkci spustit jednou node.normalizeFilesInfo()přepočítat všechna data a zadat je do databáze.
  • použít funkci node.exportFiles()který začne kopírovat soubory.

Základní nastavení uzlu
Při spouštění storage nodu můžete zadat všechna potřebná nastavení.
Popíšu ty nejzákladnější, zbytek najdete na Githubu.

  • storage.dataSize — velikost složky se soubory
  • storage.tempSize — velikost dočasné složky
  • storage.autoCleanSize — minimální velikost úložiště, kterou je třeba uchovávat. Pokud zadáte tento parametr, pak jakmile začne docházet místo, budou smazány nejméně používané soubory.
  • file.maxSize — maximální velikost souboru
  • soubor.minVelikost — minimální velikost souboru
  • file.preferredDuplicates — preferovaný počet duplicitních souborů v síti
  • soubor.mimeWhitelist - platné typy souborů
  • file.mimeBlacklist - neplatné typy souborů
  • soubor.extWhitelist - platné přípony souborů
  • file.extBlacklist - neplatné přípony souborů
  • file.linkCache - různá nastavení mezipaměti odkazů

Téměř všechny parametry týkající se rozměrů lze zadávat v absolutních i relativních hodnotách.

Práce přes příkazový řádek
Knihovnu lze používat přes příkazový řádek. Chcete-li to provést, musíte jej nainstalovat globálně: npm i -g úložiště. Poté můžete spustit potřebné akce z adresáře projektu, kde je uzel. Například, storacle -a storeFile -f ./file.txt -c ./config.jspro přidání souboru. Všechny akce najdete v https://github.com/ortexx/storacle/blob/master/bin/actions.js

Proč byste to mohli potřebovat?

  • Pokud chcete vytvořit nějaký druh decentralizovaného projektu, ve kterém plánujete ukládat a pracovat se soubory pomocí pohodlných metod. Například hudební projekt popsaný v odkazu na začátku článku používá skladiště.
  • Pokud pracujete na jiných projektech, kde potřebujete ukládat soubory distribuovaným způsobem. Můžete snadno budovat svou uzavřenou síť, flexibilně konfigurovat uzly a v případě potřeby přidávat nové.
  • Pokud jen potřebujete někam uložit soubory webu a je pro vás příliš mnoho psát si vše sami. Možná je tato knihovna ve vašem případě vhodnější než ostatní.
  • Pokud máte projekt, ve kterém pracujete se soubory, ale chcete všechny manipulace provádět z prohlížeče. Můžete se vyhnout psaní kódu serveru.

Moje kontakty:

Zdroj: www.habr.com

Přidat komentář