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 на клиента

  • асинхронно Client.prototype.storeFile() — запис на файл
  • асинхронно Client.prototype.getFileLink() — получаване на директна връзка към файла
  • асинхронно Client.prototype.getFileLinks() — получаване на списък с директни връзки към файла от всички възли, където той съществува
  • асинхронно Client.prototype.getFileToBuffer() — получаване на файла в буфер
  • асинхронно Client.prototype.getFileToPath() — получаване на файла в файловата система
  • асинхронно Client.prototype.getFileToBlob() — получаване на файла в blob (за браузерната версия)
  • асинхронно 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