Pavel_Osipov
@Pavel_Osipov
Программист, в основном web

Раздача статического контента при большой нагрузке

На одном проекте начальство придумало отдавать партнёрским сайтам баннер + небольшой JS файл (при нажатии на баннер скрипт получает текущие координаты юзера и перекидывает на наш сайт с ними в параметрах). Баннер + JS — это BN пакет. Для каждого партнёра могут быть разные или только свои пакеты.
И проблема в том, что первый же партнёр имеет 2.5 миллиона уников в неделю. А в планах ещё несколько таких партнёров найти, т.е. нагрузка будет расти сразу и по многу.

И вот задача, как организовать такую раздачу лучшим образом?
Сам проект написан на РНР.
Как вариант мы рассматривали CDN, но у нас всё же логика присутствует, показывать только определённое количество раз, возможность приостановить показ и т.п.
Поискав в сети, нашёл вот хорошую презентацию www.highload.ru/papers2009/12189.html

В итоге придумал следующую систему. И хотелось-бы услышать мнение опытных хабравчан, насколько это корректное решение, и возможно есть что-то более элегантное.



SS – Сервер статики, хранит и раздаёт статику
LB – Балансировщик нагрузки для начала видимо программный.
MS – (Main server) Сервер основного проекта
CM – (Content manager server). Сервер управления SS`ами, получает команды от MS и отправляет команды к SS.

Типы сообщений


SHOW, HIDE, DELETE

Задачи


SS
  1. Хранить, удалять и отдавать контент BN
  2. На каждом установлен Nginx, PHP, база MemcacheDB. У всех одинаковая конфигурация софта
  3. Также имеет доступ к базе MemcacheDB на CM
  4. В собственной базе MemcacheDB хранит текущие счётчики и статусы для всех BN и периодически синхронизирует их с CM
  5. Имеет набор скриптов для обработки поступающих сообщений от CM

CM
  1. Также хранит мастер-копии всех текущих BN`ов
  2. Установлен Nginx, PHP, база MemcacheDB.
  3. Может получать сообщения от MS и слать на SS
  4. Может синхронизировать SS со своим внутренним набором BN`ов
  5. Ведёт общую таблицу для всех BN`ов, со счётчиками, текущими статусами и пр.
  6. Также ведёт таблицу доступных (IP ?) адресов всех SS`ов. И в случае добавления/удаления SS`а в принципе должно быть достаточно прописать/удалить его адрес в этой таблице.

Такой расклад. Опыта к сожалению мало в такого рода задачах, очень интересует мнение хабранарода.
Может не парится и перейти на облачный хостинг? Или на таких нагрузках там дюже цена растёт?

Заранее спасибо!
  • Вопрос задан
  • 2991 просмотр
Пригласить эксперта
Ответы на вопрос 3
@pwlnw
Чего-то ты загнался.
Если партнеры, в отличите о ваc, легко выдерживают такую нагрузку — отдай им на хранение баннеры и js-файл.
Ответ написан
@equand
Можно сэкономить на LB переносом нагрузки на ДНС или Роутеры.
Отдавать со статов.
Вообще не вижу проблемы 2.5 млн. (правда не ясно сколько хитов будет) средний дедик без проблем выдержит — это же мелкие баннеры их с памяти напрямую будет отдавать, проблема будет только в настройках ос и ширине канала.
Если это хиты, то это всего лишь 56 хитов в секунду (на два файла) — даже апач справится, я уж не говорю про nginx.
Упираться Вы будете только в ширину канала и производительность ОС и сетевухи.
Ответ написан
@Mox
Team Lead, RoR, React/React Native
Один двухпроцессорный ( 2 Xeon 2.4Ghz, времен Pentium-4 ) Linux Debian 4.0 + SCSI на Nginx выдерживал 100 миллионов отдач статики в сутки. Сейчас и процессоры сильно быстрее, и SSD появился.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы