digital-garden/knowledge/dev/devops/EWMA балансировка.md
2024-06-13 21:01:37 +03:00

3.9 KiB
Raw Blame History

zero-link tags
00 DevOps
зрелость/🌿

Изначальная проблема заключается в том, что разом выкатывается новвые сервисы, которые являются не прогретыми. И время ответа пользователям возрастает.

В примере есть 3 сервера и балансировщик, который работает как Robin балансировка. Эта балансировка просто распределяет запросы от пользователей на серверы по порядку. Схематично это можно представить вот так.

Во время одновременного деплоя реплик сервиса видно, что что 1 процент пользователь получает ответы от сервера спустя 22 секунды. Это происходит из-за того, что JVM нужно какое-то время чтобы прогреться. Так же некоторые фреймворки используют ленивую инициализацию некоторых бинов, что также сказывается.

Решением этой провблемы в Спортмастере выбрали EWMA балансировку. Она позволяет распределять нагрузку учитывая время ответа сервера. То есть при выборе реплики предпочтение отдается сервису, который отвечает быстрее. EWMA балансировку можно реализовать с помощью плагина для nginx.

Они провели синтетический тест. Создали 2 сервера. Один отвечал за 100 миллисекунд (здоровый), воторй за 200 (больной).

Красная пунктирная линия показывает включение EWMA балансировки вместо Robin. Можно видеть, что в течение нескольких минут балансировщик стал выбирать чаще здоровый сервис. Из-за этого среднее время ответа упало с 150 миллисекунд до 100. При этом запросы продолжают поступать на больной сервис, просто в меньшем количестве. Если больной сервис начнет выздоравливать, то на него будет направляться больше запросов.

После введения EWMA на прод график трафика во время деплоя стал выглядеть так. Видно, что теперь 1 процент пользователь получает ответ не за 22 секунды, а за 5 секунд.

Однако можно улучшить и этот результат, если выкатывать реплики не разом. Сначала выкатить 1 новую реплику, подождать минуту, потом вторую. Это позволит временно принимать основной поток запросов старыми репликами, при этом часть направить на новую, чтобы прогреть ее. Потом через минуту заменить вторую реплику на новую. Таким образом график будет выглядить следующим образом:

Технические детали для настройки кубера есть в презентации.

Презентация: