Мы используем FreeBSD (файловая система UFS), а не Linux, поэтому некоторые детали могут отличаться.
Фон
У нас есть несколько миллионов файлов в этой системе, которые необходимо обслужить максимально быстро с веб-сайта для индивидуального доступа. Система, которую мы использовали, очень хорошо работала в течение последних 16 лет.
Сервер 1 (названный: Tom) имеет основной пользовательский веб-сайт с довольно стандартной Apache настройкой и MySQL данными основание. Ничего особенного.
Сервер 2 (имя: Джерри) - это место, где хранятся пользовательские файлы, и он был настроен для быстрой доставки этих небольших файлов.
Жесткий диск Джерри настраивается во время создания чтобы убедиться, что у нас не заканчиваются inodes - это необходимо учитывать при создании миллионов небольших файлов.
Конфигурация Apache Джерри настроена на очень короткое время соединения и доступ к одному файлу для каждого соединения. Без этих настроек у вас будут открытые соединения, которые тратят впустую ресурсы. Эта Apache конфигурация совсем не подходит для основной системы (Tom) и может вызвать ряд проблем.
Поскольку вы обслуживаете «эскизы», а не отдельные запросы, вам может потребоваться немного другая структура. Честно говоря, я не знаю достаточно о ваших потребностях, чтобы действительно посоветовать, что лучше всего подходит для конфигурации вашего веб-сервера.
Исторически мы использовали несколько дисков SCSI на нескольких серверах. На данный момент у нас есть один сервер с дисками 300 МБ / с. Некоторое время бизнес находился в упадке (благодаря Facebook), но мы по-прежнему выполняем более 2 миллионов файловых запросов в день. На нашем пике это было больше похоже на 10 миллионов в день.
Наша структура (возможный ответ)
Все на Джерри настроено для доставки небольших файлов и ничего больше.
Jerry - это веб-сервер, но мы относимся к нему больше как к базе данных. Все, что не нужно, удаляется.
Каждому файлу дается четырехзначный идентификатор. Идентификатор - это буквенно-цифровые символы c (0-9, az, AZ). Это дает вам 61 * 61 * 61 * 61 комбинацию (или 13 845 841 идентификатор).
У нас также есть несколько доменов, поэтому каждый домен имеет максимум 13 845 841 идентификатор. Мы очень близко подошли к популярным «доменам» к этому пределу до того, как появился Facebook, и у нас были готовые планы на go, которые позволили бы использовать 5-символьные идентификаторы, но в конце концов нам это не понадобилось.
Файл поиск в системе выполняется очень быстро, если вы знаете полный путь к файлу. Это только медленно, если вам нужно сканировать файлы совпадений. Мы в полной мере воспользовались этим.
Каждый 4-значный идентификатор представляет собой серию каталогов. например, aBc9
равно /path/to/a/B/c/9
.
Это очень большое количество уникальных идентификаторов всего в 4 каталогах. Каждый каталог имеет максимум 61 подкаталог. Создание быстрого поиска без переполнения индекса файловой системы.
В каталоге ./9
(последний каталог в идентификаторе) находятся необходимые файлы метаданных и файл необработанных данных. Метаданные - это известное имя файла, как и файл данных. У нас также есть другие известные файлы в каждой папке, но вы поняли идею.
Если пользователь обновляет или проверяет метаданные, идентификатор известен, поэтому возвращается запрос метаданных.
Если запрашивается файл данных, опять же, идентификатор известен, поэтому данные возвращаются. Сканирование или комплексная проверка не выполняется.
Если ID недействителен, возвращается неверный результат.
Ничего сложного, все для скорости.
Наши проблемы
Когда вы говорите о миллионах маленьких файлов, возможно, что inodes закончились. Обязательно учитывайте это при создании диска для сервера с самого начала. Планируйте заранее.
Мы отключили и / или отредактировали ряд проверок системы FreeBSD. Cronjobs обслуживания не предназначены для систем с таким большим количеством файлов.
Настройка Apache была немного пробной и ошибочной, чтобы получить ее правильно. Когда вы его получите, облегчение будет огромным. Очень помогает mod_status
Apache.
Самое первое, что нужно сделать, это отключить все файлы журналов. Затем отключите все и повторно добавьте только то, что вам нужно.
Код для доставки (и сохранения) метаданных и необработанных данных также очень оптимизирован. Забудьте о библиотеках кода. Каждая строка кода проверялась и перепроверялась годами на скорость.
Заключение
Если у вас действительно много эскизов, разделите систему. Обслуживайте небольшие файлы с выделенного сервера, оптимизированного для этой цели. Настройте основную систему для более стандартного использования.
Система идентификации на основе каталогов (будь то 4 случайных символа или части MD5) может быть быстрой, если вам не нужно сканировать файлы.
Ваша базовая операционная система должна быть настроена так, чтобы системные проверки не поглощали ваши системные ресурсы.
Отключите создание файла журнала веб-сервера. Он вам почти никогда не понадобится, и это создаст узкое место в файловой системе. Если вам нужна статистика, вы можете получить общий обзор из mod_status
.
Честно говоря, о вашем конкретном случае и потребностях известно недостаточно информации. Я не уверен, что мой личный опыт поможет.
Удачи!