Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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

Он обеспечивает масштабируемость и изначально поддерживает другие протоколы (например, 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, не включая какую-либо другую библиотеку / плагин)

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

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