Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Как распределить нагрузку между серверами с nginx-rtmp-module?

#nginx #rtmp


Подскажите как правильно распределять зрителей между серверами с nginx-rtmp-module?
К примеру есть 3 сервера на каждом установлен nginx-rtmp-module, rtmp поток создается
на первом сервере, как отправить зрителей на 2 сервер если их больше чем может держать
первый и так же со второго на третий.
    


Ответы

Ответ 1



RTMP протокол поддерживает редирект. Т.е. при подключении к серверу, если он не сможет обслужить клиента, он может его перенаправить дальше. Плюс балансировщик на входе. Схематически это должно выглядеть так: в настройках application (терминология RTMP) добавляется http-колбек (терминология nginx-rtmp) on_connect. в обработчике этих сообщений нужно принять решение о редиректе и ответить согласно документации: If HTTP 2xx code is returned then RTMP session continues. The code of 3xx makes RTMP redirect to another application whose name is taken from Location HTTP response header. Otherwise connection is dropped. Ещё интересные колбеки: on_publish - вызывается при начале публикации стрима на сервер on_play - вызывается при начале проигрывания стрима с сервера. Он позволяет делать редирект только внутри тещкущего сервера или создавать remove-proxy к другому серверу, оставаясь сам на обслуживании данного клиента. Т.е. копать детально нужно в сторону on_connect. Как реализовать планирование... Тут вопрос сложный. Как минимум планировщик должен знать о нагрузке всех серверов и динамически принимать решение о перенаправлении. Можно, к примеру, мониторить нагрузку каждого сервера: CPU Память Число подключений Утилизация канала строить рейтинг. Если для текущего сервера какой-то параметр вышел за пределы нормы, то брать сервер с максимальным рейтингом и отправлять подключение туда. В качестве дополнительной, но более сложной меры, можно, со временем научить создавать дополнительные инстансы серверов, причём с учётом скорости роста (например при лавинном подключении при трансляции какого-то эвента) и гасить их по мере спада нагрузки. Ещё нюансом может стать то, что документация на on_connect не говорит явно, что будет, если в Location вернуть полный путь с rtmp://.... Нужно изучать исходники или спрашивать в рассылке или у автора в почте. Если такой редирект не поддерживается, то можно попытаться решить вопрос при помощи балансировщиков типа Balance NG или HAProxy. Подобный пример даже рассмотрет в официальном блоге: http://blog.haproxy.com/2012/09/21/high-available-rtmp-platform-with-haproxy-and-crtmpserver/. Единственно, нужно как-то привязать ваш супер-визор. Если мне не изменяет память, то HAProxy можно попросить использовать какой-то скрипт для принятия решения. Кстати, при живом стриминге, вам нужно будет обеспечить, что бы на тот сервер, на который вы перенаправляете клиента, этот поток тоже присутствовал, т.е. реализовывать релей: публицирует-то один человек и на один сервер.

Ответ 2



Модуль ngx_http_upstream_module позволяет описывать группы серверов, которые могут использоваться в директивах proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass

Комментариев нет:

Отправить комментарий