Советы по управлению большим количеством файлов?
Здесь есть очень хорошие вопросы о SO об управлении файлами и хранении в рамках большого проекта.
Сохранение изображений в БД - Да или Нет?
Будете ли вы хранить двоичные данные в базе данных или в файловой системе?
Первый, у которого есть отличные идеи, и в моем проекте я решил пойти по файловому маршруту, а не по маршруту DB.
Основным моментом против использования файловой системы является резервное копирование. Но в нашей системе у нас отличная схема резервного копирования, поэтому я не беспокоюсь об этом.
Следующий путь - хранить фактические файлы. И я думал о постоянном расположении файлов и создании виртуальной системы каталогов в базе данных. Поэтому ссылки на файл не изменяются.
Система, которую я создаю, будет иметь одно глобальное управление файлами, чтобы все файлы были доступны для всех пользователей. Но многие, которые пошли по файловому маршруту, говорят о размере физического каталога (если все файлы находятся в одном каталоге, например)
Итак, мой вопрос: какие советы или методы лучшей практики в создании папок для этих статических файлов или если я вообще не должен идти по пути виртуального каталога.
(проект находится в стеке LAMP (PHP), если это вообще помогает)
Ответы
Ответ 1
Один из способов - назначить уникальный номер каждому файлу и использовать его для поиска фактического местоположения файла. Затем вы используете этот номер для распространения файлов в разных каталогах в файловой системе. Например, вы можете использовать что-то вроде этой схемы:
/images/{0}/{1}/{2}
{0}: file_number % 100
{1}: (file_number / 100) % 100
{2}: file_number
Ответ 2
Я столкнулся с этой проблемой некоторое время назад для веб-сайта, на котором было много файлов. Мы сделали GUID (который также является полем первичного ключа файла) (например, BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) и сохраните файл следующим образом:/B/C/C/BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301/filename.ext
Это имеет определенные преимущества:
- Вы можете масштабировать файловые серверы на нескольких серверах (и назначать определенные каталоги для каждого)
- Вам не нужно переименовывать файл
- Ваши каталоги гарантированно будут уникальными
Надеюсь, это поможет!
Ответ 3
Чтобы избежать создания избыточного количества записей в одном каталоге, вы можете захотеть основать создание каталогов на фрагменты имени файла. Например, если у вас есть файл с именем d7f5ae9b7c5a.png, вы можете сохранить его в формате media/d7/f5/d7f5ae9b7c5a.png. Если ваши имена файлов шестнадцатеричные, это ограничивает количество записей в одном каталоге до 256 до конечного уровня.
Ответ 4
-
Один пользовательский образ ~ 100 кб, поэтому пусть в базе данных будет 10 000 пользователей, каждый пользователь будет иметь в среднем 5 изображений, поэтому у нас будет 5 терабайт БД, и каждый вывод изображения будет выполнен через БД, и это дополнительный трафик DB уменьшит общую производительность сервера БД.... вы можете использовать кластер DB, чтобы избежать этого, но предположите, что это дорого
-
Отчет пользователя об ошибке в живой базе данных (в тесте - все работает правильно), как бы вы создали дамп, чтобы распаковать его на машине разработчиков? Сколько времени это займет?
-
В какой-то момент вы можете решить разместить изображения на каком-то CDN, каковы будут изменения в исходном коде?
Ответ 5
Обычно я использую такой подход:
У вас есть глобальная переменная параметров для вашего приложения, которая указывает на папку, в которой хранятся загруженные файлы. В вашей базе данных хранятся относительные пути к файлам (относительно того, что указывает переменная параметров).
Таким образом, если файл находится по адресу /www/uploads/image.jpg, ваши настройки, отображаемые в /www/uploads, в вашей строке базы данных есть image.jpg. Это гибкий способ, который отделяет структуру вашего системного каталога от вашего приложения.
Далее вы можете фрагментировать файловое хранилище в каталогах на основе того, с какими таблицами базы данных они связаны. Скажем, у вас есть таблица user_reports и таблица user_photos. Вы храните файлы, относящиеся к user_reports в /www/uploads/user _reports. Если у вас есть большое количество пользовательских загрузок, вы можете реализовать фрагментацию еще больше. Скажем, пользователь загружает файл 20.03.2009, файл называется report.pdf, поэтому вы храните его в/www/uploads/user_reports/2009/03/20/report.pdf.
Ответ 6
Я не могу сказать много о том, как apache и PHP управляют файлами, но я могу сказать что-то о файловой системе ext3. ext3, похоже, не имеет проблем с большим количеством файлов в одном каталоге. Я протестировал его до миллиона файлов. Перед созданием каталогов убедитесь, что параметр dir_index включен в файловой системе. Вы можете проверить, запустив dump2fs и изменив эту опцию, запустив tune2fs. Хеширование файлов в дерево подкаталогов может быть полезно, потому что средства командной строки все еще могут иметь проблемы с отображением содержимого каталога.