Хранение большого количества файлов на сервере

Проблематика

  1. Большое количество файлов в одной директории уменьшает скорость доступа и увеличивает нагрузку на систему
  2. Большое количество поддиректорий занимает большое количество дисковой памяти. К примеру, одна директория в EXT3 стандартно занимает 4КБ на носителе.
  3. Файлы необходимо переименовывать таким образом, чтобы избегать конфликтов имен и сделать невозможным некоторые разновидности атак


Простое, но эффективое решение под катом

  • При загрузке файла на сервер, через интерфейс веб-сервиса, переименовываем его в шестнадцатеричный хеш, добавляя расширение. К примеру PHP md5(rand()).$ext
  • Вынимаем из нового имени первые символы. Проверяем существование, или создаем новую поддиректорию с именем, равным этим символам. Пишем в нее файл.
  • При необходимости — сохраняем оригинальное имя файла, путь и его статистику в БД. Выдаем красивое имя HTTP-заголовком при скачивании.

Что получаем?

  1. Достаточно оптимальное решение для хранения заведомо большого количества файлов. В некотором общем случае имеем не более 256 поддиректорий, которые занимают 1МБ на носителе. В случае достижения некоторой «перегрузки» возможно увеличивать глубину хранения, без внесения изменений в существующую структуру — просто увеличивая глубину «рекурсии».
  2. Современные хеширующие алгоритмы сильны, но микровероятность конфликта все-же присутствует, и она увеличивается с ростом количества хранимых файлов. Один из простых способов перестраховаться — проверять существование файла с аналогичным именем перед сохранением нового. Языки программирования имеют достаточно быструю функцию для этого, например PHP is_file().
  3. Достаточно равномерное распределение файлов по директориям. Это нормализует нагрузку, а также позволяет использовать распределенные хранилища, и легко масштабировать их при эксплуатации.
  4. Удобно программировать в различных ситуациях — возможно абстрагировать систему поддиректорий, как числа в шестнадцатеричной системе счисления.

Данная методика отлично проявляет себя на практике. Именно таким образом реализовано хранение файлов как минимум одного популярного публичного хостинга, работает давно и стабильно.

http://habrahabr.ru/blogs/webdev/115161/

Share