Re: Увеличивается RPS и CPS при недоступности бэкэнда
Maxim Dounin
mdounin на mdounin.ru
Ср Авг 24 12:37:53 UTC 2016
Hello!
On Wed, Aug 24, 2016 at 02:39:45AM +0300, Иван wrote:
> Здравствуйте!
>
> У нас цепочка проксей для стриминга видео (плейлисты - m3u8+чанки - ts): эджи
> от пользователей проксируют на ориджины,ориджины на источники видео (source).
>
> Почему-то при выпадании (connection timeout) одного из source взлетает rps и
> cps на соотвествующие ориджины. При высокой нагрузке настолько, что все вообще
> встает колом.
>
> nginx 1.10.1 под debian 8 из репов на nginx.org.
>
> Конфигурация upstream на эджах:
> upstream o-place {
> server ip4_1:443 fail_timeout=60 max_fails=3 weight=3;
> server ip6_1:443 fail_timeout=60 max_fails=3 weight=3;
> server ip4_2:443 fail_timeout=60 max_fails=3 weight=1;
> server ip6_2:443 fail_timeout=60 max_fails=3 weight=1;
> server ip4_3:443 fail_timeout=60 max_fails=3 backup;
> server ip6_3:443 fail_timeout=60 max_fails=3 backup;
> keepalive 500;
> }
> Каждый ориджин тут задублирован по ИП4 и ИП6 (ip4_1 и ip6_1 - это один и тот
> же сервер, так же как и ip?_2, так же как и ip?_3), так как иногда между
> серверами отваливается по отдельности либо IP6, либо IP4.
>
> У ориджинов в апстримах по одному source:
> upstream source_place {
> server ip4:443;
> keepalive 200;
> }
>
> На эджах
> proxy_next_upstream error timeout invalid_header http_500 http_502 http_504;
А что конкретно вас удивляет? Ваша конфигурация именно это и
предполгает, e.g.:
- выпал source для ресурса, при обращении к соответствующему
ресурсу origin не может достучаться до source-сервера и
возвращает 502 (или 504, если случился таймаут);
- edge-сервер видит 502 и идёт к следующему серверу в блоке
upstream;
- картина повторяется, пока не будут опрошены все сервера по
списку, т.е. суммарное количество запросов к origin-серверам для
конфигурации выше - вырастет в 4 раза.
Если это не то, что хочется получить - пересмотрите конфигурацию.
В частности, я бы рекомендовал:
- Проредить proxy_next_upstream. Если сервера, фактически,
одинаковые, то ходить на все при получении 502/504 - имеет очень
мало смысла.
- Посмотреть внимательно на proxy_next_upstream_tries (и
proxy_next_upstream_timeout),
http://nginx.org/r/proxy_next_upstream_tries/ru. По
умолчанию nginx пытается обойти все доступные сервера, однако в
сложных конфигурациях это редко является оптимальным поведением.
Директива proxy_next_upstream_tries повзволяет сделать
ограниченное количество попыток, не отключая proxy_next_upstream
совсем.
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru