Я использую Nginx-rtmp-модуль для прямой трансляции. Он отлично работает с 40-50 камерами на одной машине (AWS EC2 C3-large). Но если у меня более 100 потоков, как я могу масштабировать свои серверы в соответствии с требованиями?
Я пробовал использовать ELB, но он прерывает соединения после запуска новой машины, а после запуска новой машины он отправляет входящие запросы циклическим способом. Я хочу следующее.
Как я могу этого добиться? Спасибо за уделенное время.
Если вы хотите перейти на 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, не включая какую-либо другую библиотеку / плагин)
Вы можете связаться с нами на форуме, если вам понадобится помощь.
Надеюсь, это вам поможет!