Привет, хабр!
Задача заключается в создании распределенного хранилища изображений, которые необходимо хранить в различных размерах, исходные картинки могут храниться на любом из серверов.
Мы пришли к следующей схеме: есть физическая машина, являющаяся точкой входа, и N дополнительных хранилищ. На главном сервере установлены nginx, слушающий 80 порт и apache. При обращении к серверу nginx ищет обработанное изображение в файловой системе, если не находит, пытается найти изображение на дополнительных серверах. Если изображения нет и там, через apache nginx обращается к PHP скрипту, который ищет исходник нужного изображения на машинах (загружатся изображение может напрямую на любую из машин), выполняет необходимые обработки и сохраняет обработанные изображения в хранилище. Если же не найден оригинал изображения, php отдает 404-е заголовки, в ответ на которые nginx отдает картинку-заглушку.
Прошу советов по самой схеме работы (возможно, есть альтернативные варианты построения взаимодействия, которые нам подойдут?), а так же помощи с конфигурированием nginx (конкретно — не получается обработать возвращаемые apache заголовки в nginx через error_page).
Идея:
0 опционально — поиск на локальной ФС
1 создаётся хэш-функция от пути к картинке, возвращающая целое число. hashVal
2. выбирается фронт сервер с номером hashVal % serversCount, и если он живой — стягивается картинка с этого сервера. если её нет — то генерится.
3. если сервер не живой — берем следующий.и переходим к пункту 2.
На практике такое решение ущербно по причине того, что после выхода из строя сервера — следующий сервер становится перегружен.
В живом проэкте используется модификация:
Есть 1000 записей в мэмкеше. Инициированых значениями из пункта 2. После падения фронт сервера его индексы меняются на индексы живых серверов случайным образом. После поднятия — восстанавливаются.
(на самом деле чуть сложнее, так как каждая картинка живет всегда на 3х серверах, и доступ к ним балансируется каруселью, но это не важно для этого вопроса)