Storacle — децентрализованное хранилище файлов
- суббота, 2 мая 2020 г. в 00:28:36
Прежде чем начну, должен оставить ссылку на предыдущую статью, чтобы было понятно о чем именно речь.
В этой статье хотел бы разобрать слой, который отвечает за хранение файлов, и как это может быть использовано любым человеком. Storacle — самостоятельная библиотека, никакой связи с музыкой напрямую нет. Можно организовать хранение любых файлов.
В предыдущей статье я немного "накатил бочку" на ipfs, но это произошло именно в контексте решаемой мной задачи. В целом, я считаю этот проект крутым. Просто мне больше нравится возможность создавать разные сети под разные задачи. Это позволяет лучше организовывать структуру и снижать нагрузку на отдельные узлы и сеть в целом. Можно даже в рамках одного какого-то проекта, при необходимости, дробить сеть на куски по каким-то критериям, снижая общую нагрузку.
Итак, storacle использует механизм 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 клиента
Экспорт файлов на другой сервер
Для того, чтобы перенести файлы на другой узел можно:
Основные настройки узла
Запуская узел хранилища, можно указать все необходимые настройки.
Опишу самые основные, остальное можно найти на гитхабе.
Почти все параметры, связанные с размерами могут проставляться и в абсолютных и в относительных величинах.
Работа через командную строку
Библиотеку можно использовать через командную строку. Для этого нужно установить ее глобально: npm i -g storacle. После этого можно запускать нужные экшены из директории с проектом, где узел. Например, storacle -a storeFile -f ./file.txt -c ./config.js, чтобы добавить файл. Все экшены можно найти в https://github.com/ortexx/storacle/blob/master/bin/actions.js
Зачем тебе это может быть нужно
Мои контакты: