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

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

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

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

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

2 ответа

Решение

Если вы захотите переключиться на hls ( nginx-rtmp поддерживает hls), это, по моему опыту, сделает вашу жизнь проще, чем попытка самостоятельно загрузить баланс rtmp. После того, как вы настроили транскодирование hls, единственное, что вам нужно, это поместить cdn перед вашим веб-сервером и позволить этому позаботиться о кешировании или выполнить свой собственный, используя лак, 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 Этот пример перенаправляет новые подписки, когда на сервере более 400 подписчиков. Если вы действительно предпочитаете использовать загрузку процессора, вы можете изменить следующую строку:

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

с:

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

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

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

Я надеюсь, что это поможет вам!

Другие вопросы по тегам