Storacle — децентрализирано хранилище на файлове

Storacle — децентрализирано хранилище на файлове

Преди да започна, трябва да оставя линк към предишната статия, за да е понятно за какво точно става въпрос.

В тази статия бих искал да разгледам слоя, който отговаря за съхранението на файлове и как това може да бъде използвано от всеки. Storacle — самостоятелна библиотека, няма пряка връзка с музиката. Може да се организира съхранение на всякакви файлове.

В предишната статия малко "написах негативно" за ipfs, но това се случи именно в контекста на задачата, която решавах. Като цяло, смятам, че проектът е страхотен. Просто предпочитам възможността да създавам различни мрежи за различни задачи. Това позволява по-добра организация на структурата и намалява натоварването на отделни възли и мрежата като цяло. Може дори в рамките на един проект, при необходимост, да се раздели мрежата на части по определени критерии, което намалява общото натоварване.

И така, storacle използва механизма spreadable за организиране на мрежата. Основни характеристики:

  • Файловете могат да бъдат добавяни в хранилището през всякакъв възел.
  • Файловете се запазват изцяло, не на блокове.
  • Всеки файл има свой уникален хеш по съдържание за по-нататъшна работа с него.
  • Файловете могат да се дублират за повишаване на надеждността
  • Броят на файловете на един възел е ограничен само от файловата система (има изключение, за него ще говорим по-долу)
  • Броят на файловете в мрежата е ограничен от възможностите на spreadable относно броя допустими възли в мрежата, които във втората версия ще могат да позволят работа с безкраен брой възли (за това в друга статия)

Прост пример как това всъщност работи от програмата:

Сървър:

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

Клиент:

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

Взгляд отвътре

Под капота няма нищо извънземно. Информацията за количеството файлове, общия им размер и други детайли се съхраняват в in-memory база и се обновяват при изтриване и добавяне на файлове, поради което няма нужда често да се обръщаме към файловата система. Изключение прави активирането на боклукосъбирача, когато е необходима циркулация на файловете при достигане на определен размер на хранилището, а не забрана за добавяне на нови. В този случай се налага да обходите хранилището, и работата с голямо количество файлове (> милион да кажем) може да доведе до значителни натоварвания. По-добре е да се съхраняват по-малко файлове и да се стартират повече възли. Ако "почистващият" е изключен, такава проблема няма.

Хранилището на файлове се състои от 256 папки и 2 нива вложеност. Файловете се съхраняват в папките от второ ниво. Тоест, при наличие на 1 млн. файлове, в такава папка ще има около 62500 файла (1000000 / sqrt(256)).

Имената на папките се генерират от хеша на файла, за да може бързо да се получи достъп, знаейки хеша.

Тази структура беше избрана, имайки предвид многото различни изисквания към хранилището: поддръжка на слаби файлови системи, където в една папка не е желателно да има много файлове, бързо обхождане на всички папки при необходимост и т.н. Някаква златна среда.

Кеширане

При добавяне на файлове, а също и при тяхното получаване, в кеша се записват линкове към файловете.
Благодарение на това, много често няма необходимост да се обхожда цялата мрежа в търсене на файл. Това ускорява получаването на линкове и намалява натоварването на мрежата. Кеширането също така става чрез http заглавия.

Изоморфност

Клиентът е написан на javascript и е изоморфен, може да се използва директно от браузера. 
Може да се зареди файл https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js като скрипт и да получите достъп до window.ClientStoracle или да се импортира чрез системата за изграждане и т.н.

Отложени линкове

Интересна функция е "отложен линк". Това е линк към файл, който може да бъде получен синхронно, тук и сега, а файлът ще бъде извлечен, когато бъде намерен в хранилището. Това е много удобно, когато, например, е нужно да покажете на сайта някои снимки. Просто поставяме в src отложения линк и всичко. Могат да се измислят много казуси.

API на клиента

  • async Client.prototype.storeFile() — запазване на файл
  • async Client.prototype.getFileLink() — получаване на директен линк към файл
  • async Client.prototype.getFileLinks() — получаване на списък с директни линкове към файла от всички възли, където той съществува
  • async Client.prototype.getFileToBuffer() — получаване на файла в буфер
  • async Client.prototype.getFileToPath() — получаване на файла в файловата система
  • async Client.prototype.getFileToBlob() — получаване на файла в blob (за браузърната версия)
  • async Client.prototype.removeFile() — изтриване на файла
  • Client.prototype.createRequestedFileLink() — създаване на отложен линк

Експорт на файлове на друг сървър

За да прехвърлите файлове на друг възел, можете:

  • Просто да копирате цялата папка за съхранение заедно с настройките. (в бъдеще това може да не сработи)
  • Да копирате само папката с файловете. Но в този случай, ще трябва да стартирате веднъж функцията node.normalizeFilesInfo(), за да преизчислите всички данни и да ги запишете в базата.
  • Да използвате функцията node.exportFiles(), която ще започне копирането на файловете.

Основни настройки на възела
При стартиране на възела за съхранение, можете да зададете всички необходими настройки.
Ще опиша най-основните, а останалото можете да намерите на GitHub.

  • storage.dataSize — размер на папката с файловете
  • storage.tempSize — размер на временната папка
  • storage.autoCleanSize — минимален размер на хранилището, който трябва да се поддържа. Ако зададете този параметър, когато пространството започне да свършва, най-малко използваните файлове ще се изтриват.
  • file.maxSize — максимален размер на файла
  • file.minSize — минимален размер на файла
  • file.preferredDuplicates — предпочитано количество дубликати на файла в мрежата
  • file.mimeWhitelist — допустими типове файлове
  • file.mimeBlacklist — недопустими типове файлове
  • file.extWhitelist — допустими разширения на файловете
  • file.extBlacklist — недопустими разширения на файловете
  • file.linkCache — различни настройки за кеширане на линкове

Почти всички параметри, свързани с размерите, могат да бъдат задавани както в абсолютни, така и в относителни величини.

Работа чрез команден ред
Библиотеката може да се използва чрез команден ред. За целта трябва да я инсталирате глобално: npm i -g storacle. След това можете да стартирате необходимите действия от директорията с проекта, където е възелът. Например, storacle -a storeFile -f ./file.txt -c ./config.js, за да добавите файл. Всички действия можете да намерите в https://github.com/ortexx/storacle/blob/master/bin/actions.js

Защо може да ви е необходимо това

  • Ако искате да създадете някакъв децентрализован проект, в който се предвижда съхранение и работа с файлове по удобни методи. Например, проект с музика, описан по линка в началото на статията, използва storacle.
  • Ако работиш по всякакви други проекти, където е нужно да се съхраняват файлове разпределено. Можеш лесно да изградиш своя собствена затворена мрежа, да настройваш гъвкаво възлите и да добавяш нови, когато е необходимо.
  • Ако просто ти трябва място за съхранение на файловете на твоя сайт и ти е неудобно да пишеш всичко сам. Вероятно тази библиотека ще е по-добра от другите в твоя случай.
  • Ако имаш проект, в който работиш с файлове, но искаш да извършваш всички манипулации от браузъра. Можеш да избегнеш писането на сървърен код.

Моите контакти:

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster