Хотите маленький кейс из боли админа high-load проекта?
Я никогда ранее не админил тяжело нагруженные сервисы. Понятия "масштабирование" для меня было чем-то далёким. И вот я столкнулся лицом-к-лицу с проектом, который обслуживает огромное кол-во пользователей. Для понимания, php-fpm работает в режиме 250 активных процессов и простаивают из них одновременно не больше 40. Nginx проксирует на php по 150-200 запросов в секунду, а заказы в админке появляются по 2-3 штуки в минуту.
И вот я встрял на проблеме сессий. Где их хранить?
В базе? Так с таким кол-вом обращений база тупо ляжет, т.к. каждый запрос к php - это операция update для базы. Плюс, сессий, в среднем, на 6-10 ГБ выходит
На файлах? Тоже отпадает, т.к. диски ложатся от постоянного поиска по файловой системе
Остаются не реляционные базы ключ—значение. В web'е принято использовать для этого memcached или redis (любая уважающая себя CMS имеет эти 2 драйвера в своей коробке)
Что сказать про memcached? Он классный, быстрый, но не стабильный. Он хранит все данные в оперативной памяти и никуда их не бэкапит. Упала служба? Перезапустили сервис? Прощайте все пользовательские сессии! (прощайте корзины анонимных пользователей). Ещё и memcached не умеет в распределение на ноды, срепликацией (с кастылями это можно сделать, но будет крайне не стабильно)
Остаётся redis! Он точно так же хранит все оперативные данные в RAM, но, в отличии от memcached, данные можно реплицировать, а так же он имеет инструменты восстановления данных после падения. Redis представляет 2 варианта: дамп в файл или ведение журнала. Дамп в файл позволяет быстро перезагружаться, но, в случае падения, это приводит к потери части данных. Файлы журналов позволяют сохранять оперативные данные каждую секунду, но приводят к очень медленному перезапуску. Я настроил комбинированный вариант, когда раз в час база дампится в файл, а промежуток между дампами логгируется в журнал. Таким образом, максимальный промежуток потерянных данных может составлять ~1сек
Жил проект так долго и здорово. Но сейчас клиент решил запустить новую маркетинговую кампанию, от чего всплески набегов покупателей стали колоссальными. От этого кол-во сессий выросло, пришлось докинуть редису ещё 2гб ОЗУ, но теперь столкнулся с тем, что раз в час на системный диск (мой косяк) дампится база в 10гигов и просто укладывает диск и процессор. А в моменты маркетинговых рассылокпики посещаимости иду такие, что журнал redis начинает дёргать диск и опять вешается процессор на iowait. Вернулись опять к тормозам 😢
Какой вывод? Не нужно упарываться в монолиты! Распределяйте сервера. Думайте о горизонтальном масштабированиии проекта, т.к. бесконечное подкидываение ресурсов в сервера перестают оказывать хоть какой-то эффект в геометрической прогрессии.
нахрен тебе апач?
Vladimir
Igor
Дмитрий
Vladislav
Artem
Sergey
Vio