Как только мы получили информацию о том, что ивент состоится, мы начали подготовку.
Мы знали, что текущее узкое горлышко - это запросы к БД со стороны фронтенда, при подгрузке ленты.
Работы решили проводить следующим образом:
- Проанализировать текущие запросы к БД, найти наиболее тяжелые.
- Поправить эти запросы силами разработки.
- Провести нагрузочное тестирование.
- Проанализировать полученные данные, зафиксировать и поправить узкие места и точки, не поддающихся масштабированию.
- Так как у нас было достаточно жесткое ограничение по времени - исправление только критичных мест.
Анализ текущих запросов к БД показал, что при переходе на главную страницу генерируется очень долгий и тяжелый запрос к БД. Даже при заходе 100 одновременных пользователей этот запрос мог привести к отказу сервиса.
Этот запрос с высоким приоритетом был передан разработчикам для рефакторинга и ускорения.
Команда же DevOps инженеров начала готовить инфраструктуру.
Мы обновили пул нод у прод кластера, заменив тип нод на более мощные, что позволило нам выделить больше ресурсов на каждый из подов. На тот момент у нас уже был реализован и работал авто скейлинг (HPA + Node autoscaling), что в итоге позволяло нам поддерживать приложение в рабочем состоянии даже в момент пиковых нагрузок без участия инженеров. Помимо прочего, нами было принято решение подключить проксирование через Cloudflare, которое помогло бы нам быстро отреагировать на DDoS.
Последнее что мы сделали - мы определили предполагаемый пользовательский путь и с помощью сервиса K6 сгенерировали необходимую нагрузку. По результатам повысили доступные ресурсы для k8s кластера и БД.
Мы убедились что:
- Оптимизация, сделанная разработчиками работает корректно.
- Мы можем выдерживать планируемую нагрузку, и есть запас.
- Авто скейлинг отрабатывает корректно.
Во время ивента количество пользователей было немного больше, чем предполагалось, но дополнительные ноды, поднятые авто скейлом штатно отработали все запросы пользователей. Команда разработки и DevOps только осуществляла наблюдение за графиками и алертами, без ручного участия в работе приложения.