Автоматическое масштабирование RTMP-трансляций (NGINX-RTMP)

Автоматическое масштабирование RTMP-трансляций (NGINX-RTMP)

Я используюNginx-rtmp-модульдля прямой трансляции. Он отлично работает для 40-50 камер на одной машине (AWS EC2 C3-large). Но если у меня более 100 потоков, как мне масштабировать свои серверы, чтобы соответствовать требованиям?

Я пробовал использовать ELB, но он прерывает соединения после запуска новой машины, а после запуска новой машины отправляет входящие запросы по кругу. Я хочу следующее.

  1. Когда загрузка ЦП системы достигнет 80%, запустите новый сервер, но сохраните существующие соединения.
  2. Отправлять новые запросы на вновь созданный сервер только в том случае, если загрузка ЦП первого сервера > 80%. (Без циклического перебора)

Как мне этого добиться? Спасибо за ваше время.

решение1

Если вы готовы перейти на hls (nginx-rtmp поддерживает hls) это облегчит вам жизнь - по моему опыту - чем пытаться сбалансировать нагрузку самого rtmp. После настройки транскодирования hls единственное, что вам нужно, это либо разместить cdn перед вашим веб-сервером и позволить ему позаботиться о кэшировании, либо самостоятельно накрутить его с помощью Varnish, Squid или даже nginx (конечно, есть и другие возможности) - HTTP-кэширование настолько распространено, что я уверен, что вы найдете простое решение.

Если вы хотите использовать rtmp, вы можете настроить похожую инфраструктуру.

Иметь один главный сервер приема и несколько пограничных узлов, каждый из которыхтянутьс сервера ingest. Эта настройка будет достаточно масштабируемой и должна хорошо работать для вашей текущей нагрузки.

Редактировать: Кажется, я неправильно понял ваш вопрос: вероятно, проще всего было бы иметь конечную точку API, с помощью которой вы могли бы задать, на какой сервер RTMP должна транслироваться ваша веб-камера, вместо того, чтобы пытаться балансировать нагрузку.

Поэтому, как только ваш rtmp-сервер достигнет X потоков (см. модуль nginx-rtmp stat), вы запускаете новый экземпляр и перенаправляете новые потоки на него.

nginx-rtmp также имеет функцию перенаправления в on_connect (пока нельзя разместить больше двух ссылок, просто найдите on_connect на странице wiki директив), возвращая заголовок 3xx с Location. Я не уверен, поддерживает ли это перенаправление на другой узел, но это тоже стоит попробовать — тогда можно избежать необходимости вручную запрашивать перед выбором сервера.

решение2

Я не знаю, поддерживает ли nginx масштабируемость с модулем rtmp, но если вы можете изменить серверное решение, вы можете попробовать наш сервер:Монасервер.

Он обеспечивает масштабируемость и изначально поддерживает другие протоколы (например, RTMFP).

Пример конфигурации масштабируемости с 3 серверами можно посмотреть здесь:http://www.monaserver.ovh/scalability.html#exchange-data-and-resources Этот пример перенаправляет новые подписки, когда на сервере более 400 подписчиков. Если вы действительно предпочитаете использовать загрузку ЦП, вы можете изменить следующую строку:

if _nextServer and _subscribers>=400 then error(_nextServer.host) end

с :

if _nextServer and cpu>80 then error(_nextServer.host) end

Затем вы можете самостоятельно найти наилучший способ получения загрузки ЦП (параметрПроцессор). Если вам нужно вызвать код C++, взгляните на библиотеку FFI (вы можете встраивать код C++ в скрипты Lua, не включая никакие другие библиотеки/плагины)

Если вам нужна помощь, вы можете связаться с нами на форуме.

Надеюсь, это вам поможет!

Связанный контент