Как использовать файловые хранилища в своих проектах?
Где лучше хранить файлы, когда их становится много: в базе данных или файловом хранилище? И как сделать так, чтобы приложение не упало под нагрузками, а важные файлы не потерялись?
Маша, разработчик Naumen, рассказала о файловых хранилищах. Примеры — в статье на Habr.
Когда только пришла в Naumen, я не знала, что такое файловые хранилища и как с ними работать. Однако первые мои задачи были связаны именно с этим, поэтому пришлось разобраться, что это такое, и как файлы хранятся в системе. Благодаря осознанной эволюции хранения файлов, у нас есть решение, где мы не потеряем файлы и не упадем под нагрузками.
Когда дело касается файлов, первое, что раньше приходило мне в голову — это сохранять их в базе данных. При маленьких размерах файлов и небольшом количестве — это хорошее решение. Однако когда файлы начинают расти, а их количество увеличивается, наша БД начинает разбухать. Возникает три основные проблемы:
-
Занимаем много места на сервере, где находится БД;
-
БД долго обрабатывает запросы;
-
Время создания бэкапа уходит в бесконечность.
На помощь приходят файловые хранилища. Это директория на локальном или сетевом диске, где мы храним и получаем файлы.
По расположению файловые хранилища могут находиться:
В локальной файловой системе
Плюсы: легкая реализация, быстрый доступ, независимость от сети.
Минусы: единый критический узел, занимаем дисковое пространство.
В сетевой файловой системе
Плюсы: устранение единого критического узла.
Минусы: сложнее реализация, поддержка уже второго сервера.
Файловые системы могут разделяться и по тому, что лежит в их основе
Использование файловой системы
Плюсы: бесплатный вариант, не грузим базу.
Минусы: реализация с нуля всех методов взаимодействия.
S3 совместимое файловое хранилище (поддержка стандарта Amazon’s S3 API)
Плюсы: легкая реализация, возможность использовать из коробки множество плюшек, наличие бесплатных систем (ceph и MinIO).
Минусы: необходимо первичное изучение библиотеки, поднятие и настройка файлового хранилища.
Хранилище данных поставщика услуг
Плюсы: простая реализация, возможность использовать из коробки множество плюшек, не требуется самостоятельного поднятия и настройки ФХ.
Минусы: необходимо первичное изучение библиотеки, системы платные.
Как обойти пиковые нагрузки и не потерять файлы?
Пользователь скачивает файл → мы размещаем его в БД → переносим в ФХ отдельной задачей, но с уточнением, что перенесется не каждый файл. Мы сначала проверим, можно его перенести или нет.
Бонусы работы с файловыми хранилищами
Обработка тайм-аута
Если нашему ФХ плохо, можно взять перерыв и потом продолжить обращаться к нему.
Поддержка нескольких ФХ
Если ФХ хранит очень много файлов, мы переключаемся на дополнительное и продолжаем работать. А из первого получаем файлы, которые уже сохранены. Либо если одному ФХ стало плохо, мы переключаемся на резервное ФХ и работаем с ним, пока разбираемся с основным.