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