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

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

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

V tomto článku bych rád analyzoval vrstvu, která je zodpovědná za ukládání souborů, a jak ji může kdokoli používat. Storacle je samostatná knihovnaNeexistuje žádné přímé spojení s hudbou. Můžete si uspořádat úložiště libovolných souborů.

V předchozím článku jsem to trochu přehnal ipfs, ale stalo se to konkrétně 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 umožňuje lepší organizaci a snižuje zátěž jednotlivých uzlů a sítě jako celku. V případě potřeby můžete dokonce rozdělit síť do sekcí v rámci jednoho projektu na základě specifických kritérií, čímž se sníží celkové zatížení.

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

  • Soubory lze do repozitáře přidat prostřednictvím libovolného uzlu.
  • Soubory se ukládají jako celky, nikoli v blocích.
  • Každý soubor má svůj vlastní unikátní hash svého obsahu pro další práci s ním.
  • Soubory lze pro větší spolehlivost duplikovat.
  • Počet souborů na jednom uzlu je omezen pouze souborovým systémem (existuje výjimka, o té níže)
  • Počet souborů v síti je omezen rozložitelnými možnostmi počtu povolených uzlů v síti, které ve druhé verzi budou schopny pracovat s nekonečným počtem uzlů (více o tom v dalším článku).

Jednoduchý příklad fungování 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 složitého. Informace o počtu souborů, jejich celkové velikosti a dalších podrobnostech jsou uloženy v databázi v paměti a aktualizují se při mazání a přidávání souborů, takže není nutné často přistupovat k souborovému systému. Výjimkou je povolení garbage collectoru, který vyžaduje rotaci souborů při dosažení určité velikosti úložiště, spíše než aby se zabránilo novým přidáním. V tomto případě je nutné úložiště procházet a zpracování velkého počtu souborů (například přes milion) může vést k významnému zatížení. Je lepší ukládat méně souborů a spouštět více uzlů. Pokud je garbage collector zakázán, tento problém nenastává.

Úložiště souborů se skládá z 256 složek a dvou úrovní vnoření. Soubory jsou uloženy ve složkách druhé úrovně. To znamená, že pokud existuje 1 milion souborů, každá složka bude obsahovat přibližně 62 500 (1 000 000 / sqrt(256)).

Názvy složek se tvoří z hashe souboru, aby k nim bylo možné rychle přistupovat, i když znají hash.

Tato struktura byla zvolena na základě velkého množství různých požadavků na úložiště: podpora slabých souborových systémů, kde je nežádoucí mít v jedné složce mnoho souborů, rychlé procházení všemi složkami v případě potřeby atd. Jakýsi zlatý střed.

ukládání do mezipaměti

Při přidávání souborů i při jejich přijímání se odkazy na soubory zapisují do mezipaměti.
Díky tomu se často eliminuje nutnost procházet celou síť, aby se našel soubor. To urychluje načítání odkazů a snižuje zatížení sítě. Ukládání do mezipaměti probíhá také prostřednictvím HTTP hlaviček.

Izomorfismus

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

Odložené odkazy

Další zajímavou funkcí je „odložený odkaz“. Jedná se o odkaz na soubor, který lze načíst synchronně, tady a teď, a soubor bude načten, jakmile bude nalezen v úložišti. To je velmi praktické, když například potřebujete zobrazit nějaké obrázky na webových stránkách. Jednoduše přidejte odložený odkaz do src a je to. Existuje mnoho případů použití, které můžete vymyslet.

Klientské API

  • async Klient.prototyp.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 se nachází
  • async Client.prototype.getFileToBuffer() — dostat soubor do vyrovnávací paměti
  • async Client.prototype.getFileToPath() — dostat soubor do souborového systému
  • async Client.prototype.getFileToBlob() — získat soubor v blobu (pro verzi prohlížeče)
  • async Klient.prototyp.odstranitSoubor() - smazat soubor
  • Client.prototype.createRequestedFileLink() - vytvořit odložený odkaz

Export souborů na jiný server

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

  • Zkopírujte celou složku úložiště spolu s nastavením. (Toto nemusí v budoucnu 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(), čímž se spustí kopírování souborů.

Základní nastavení uzlu
Při spuštění úložného uzlu můžete zadat všechna potřebná nastavení.
Popíšu ty nejzákladnější, zbytek najdete na GitHubu.

  • úložiště.dataSize — velikost složky se soubory
  • úložiště.dočasná velikost — velikost dočasné složky
  • storage.autoCleanSize — minimální velikost úložiště, která se má udržovat. Pokud zadáte tento parametr, nejméně používané soubory budou smazány, jakmile nebude dostatek místa.
  • file.maxSize — maximální velikost souboru
  • file.minSize — minimální velikost souboru
  • file.preferredDuplicates — preferovaný počet duplikátů souborů v síti
  • soubor.mimeWhitelist — přijatelné typy souborů
  • file.mimeBlacklist - neplatné typy souborů
  • soubor.extWhitelist — přijatelné přípony souborů
  • soubor.extČerná listina - neplatné přípony souborů
  • soubor.linkCache - různá nastavení ukládání odkazů do mezipaměti

Téměř všechny parametry související s rozměry lze zadat v absolutních i relativních hodnotách.

Práce přes příkazový řádek
Knihovnu lze použít přes příkazový řádek. Chcete-li to provést, nainstalujte ji globálně: npm i-g úložištěPoté můžete spustit potřebné akce z adresáře projektu, kde se uzel nachází. Například úložiště -a úložný_soubor -f ./soubor.txt -c ./config.jspřidat soubor. Všechny akce naleznete v https://github.com/ortexx/storacle/blob/master/bin/actions.js

Proč byste tohle mohli potřebovat?

  • Pokud chcete vytvořit decentralizovaný projekt, který vám umožní ukládat a spravovat 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, které vyžadují distribuované úložiště souborů, můžete si snadno vytvořit vlastní privátní síť, flexibilně konfigurovat uzly a podle potřeby přidávat nové.
  • Pokud potřebujete jen místo pro ukládání souborů vašeho webu a nechcete se obtěžovat psát vše sami, tato knihovna by pro vaše potřeby mohla být vhodnější.
  • Pokud máte projekt, kde pracujete se soubory, ale chcete provádět veškeré manipulace z prohlížeče, můžete se vyhnout psaní kódu na straně serveru.

Moje kontakty:

Zdroj: www.habr.com

Kupte si spolehlivý hosting pro stránky s DDoS ochranou, VPS VDS servery 🔥 Kupte si spolehlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster