
Než začnu, musím poskytnout , abych bylo jasné, o čem přesně mluvím.
V tomto článku bych chtěl probrat vrstvu, která je odpovědná za ukládání souborů, a jak to může být použito každým uživatelem. , která nemá přímou vazbu na hudbu. Lze uspořádat uložení jakýchkoli souborů.
V předchozím článku jsem trochu "naložil na ně" ipfs, ale stalo se tak právě v kontextu úkolu, který jsem řešil. Celkově považuji tento projekt za skvělý. Osobně mám raději možnost vytvářet různé sítě podle různých úkolů. To umožňuje lépe organizovat strukturu a snižovat zátěž na jednotlivé uzly a síť jako celek. Lze dokonce v rámci jednoho projektu, pokud je to nutné, rozdělit síť na části podle určitých kritérií, čímž se snižuje celková zátěž.
Takže, storacle používá mechanismus pro organizaci sítě. Hlavní funkce:
- Souborů lze do úložiště přidávat přes kterýkoli uzel.
- Soubory se ukládají celé, ne po blocích.
- Každý soubor má svůj unikátní hash podle obsahu pro další práci s ním.
- Soubory mohou být duplikovány pro větší spolehlivost.
- Počet souborů na jednom uzlu je omezen pouze souborovým systémem (existují výjimky, o kterých budu mluvit níže).
- Počet souborů v síti je omezen možnostmi spreadable podle počtu povolených uzlů v síti, které ve druhé verzi umožní pracovat s nekonečným počtem uzlů (o tom v jiném článku).
Jednoduchý příklad, jak to vůbec 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 z vnitřku
Pod kapotou není nic nadpřirozeného. Informace o počtu souborů, jejich celkové velikosti a další detaily jsou uchovávány v paměťové databázi a aktualizují se při odstraňování a přidávání souborů, proto není potřeba často přistupovat k souborovému systému. Výjimkou je spuštění garbage collectoru, kdy je potřeba cirkulace souborů při dosažení určité velikosti úložiště, nikoli zákaz přidávání nových. V takovém případě je nutné projít úložištěm, a práce s velkým počtem souborů (> milion, řekněme) může způsobit značné zatížení. Je lepší mít méně souborů a spustit více uzlů. Pokud je "čistič" vypnutý, tento problém neexistuje.
Úložiště souborů se skládá ze 256 složek a 2 úrovní zanoření. Soubor se ukládají ve složkách druhé úrovně. Takže při 1 milionu souborů bude v každé takové složce přibližně 62500 kusů (1000000 / sqrt(256)).
Název složek je tvořen z hash souboru, aby bylo možné rychle získat přístup, když znáte hash.
Tato struktura byla zvolena s ohledem na mnohá různá požadavky na úložiště: podpora slabých souborových systémů, kde není žádoucí mít mnoho souborů v jedné složce, rychlé prohledání všech složek při nutnosti atd. Jakýsi zlatý střed.
Cacheování
Při přidávání souborů, stejně jako při jejich získávání, se do cache zapisují odkazy na soubory.
Díky tomu často není potřeba procházet celou síť ve snaze najít soubor. To urychluje získávání odkazů a snižuje zatížení sítě. Také kešování probíhá prostřednictvím http hlaviček.
Izomorfismus
Klient je napsán v JavaScriptu a je izomorfní, může být použit přímo z prohlížeče.
Můžete nahrát soubor jako skript a získat přístup k window.ClientStoracle nebo importovat prostřednictvím systému sestavení apod.
Odkazy s odkladem
Zajímavou funkcí je také "odložený odkaz". Je to odkaz na soubor, který lze získat synchronně, zde a nyní, a soubor se stáhne, až bude nalezen v úložišti. To je velmi pohodlné, když například potřebujete na webu ukázat nějaké obrázky. Jednoduše nastavíte odložený odkaz v src a hotovo. Existuje spousta případů, které si můžete vymyslet.
API klienta
- 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() — získat soubor do vyrovnávací paměti
- async Client.prototype.getFileToPath() — získat soubor do souborového systému
- async Client.prototype.getFileToBlob() — získat soubor do blobu (pro prohlížečovou verzi)
- async Client.prototype.removeFile() — odstranit soubor
- Client.prototype.createRequestedFileLink() — vytvořit odložený odkaz
Export souborů na jiný server
Aby bylo možné přesunout soubory na jiný uzel, lze:
- Jednoduše zkopírovat celou složku úložiště včetně nastavení. (v budoucnu to nemusí fungovat)
- Zkopírovat pouze složku se soubory. Ale v tomto případě bude nutné jednou spustit funkci node.normalizeFilesInfo(), aby se přepočítala všechna data a zanesla do databáze.
- Použít funkci node.exportFiles(), která začne kopírovat soubory.
Hlavní nastavení uzlu
Při spuštění uzlu úložiště můžete určit všechna potřebná nastavení.
Popíšu nejdůležitější, ostatní naleznete 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 udržovat. Pokud nastavíte tento parametr, jakmile začne místo docházet, budou odstrány nejméně používané soubory.
- file.maxSize — maximální velikost souboru
- file.minSize — minimální velikost souboru
- file.preferredDuplicates — preferovaný počet duplicit souboru v síti
- file.mimeWhitelist — povolené typy souborů
- file.mimeBlacklist — zakázané typy souborů
- file.extWhitelist — povolené přípony souborů
- file.extBlacklist — zakázané přípony souborů
- file.linkCache — různé nastavení ukládání odkazů
Téměř všechny parametry související s velikostmi mohou být stanoveny jak v absolutních, tak v relativních hodnotách.
Práce přes příkazový řádek
Knihovnu lze používat přes příkazový řádek. K tomu je třeba ji nainstalovat globálně: npm i -g storacle. Po tom můžete spouštět požadované akce z adresáře s projektem, kde je uzel. Například, storacle -a storeFile -f ./file.txt -c ./config.js, abyste přidali soubor. Všechny akce najdete v
Proč bys to mohl potřebovat
- Pokud chceš vytvořit nějaký decentralizovaný projekt, ve kterém se plánuje ukládat a pracovat se soubory pohodlnými metodami. Například projekt s hudbou, jak je popsáno v odkazu na začátku článku, využívá storacle.
- Pokud pracujete na jiných projektech, kde je potřeba distribuované ukládání souborů. Můžete snadno vytvořit svou uzavřenou síť, flexibilně nastavovat uzly a přidávat nové, když je to potřeba.
- Pokud jen potřebujete někde uložit soubory svého webu a nechce se vám psát všechno sami. Možná bude tato knihovna lepší než ostatní v vašem případě.
- 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í serverového kódu.
Mé kontakty:
Zdroj: habr.com
