自动缩放 RTMP 直播流 (NGINX-RTMP)

自动缩放 RTMP 直播流 (NGINX-RTMP)

我在用Nginx-rtmp-模块用于直播。它非常适合单台机器(AWS EC2 C3-large)上的 40-50 个摄像头。但如果我有超过 100 个流,我该如何扩展我的服务器以满足要求?

我尝试过使用 ELB,但一旦启动新机器,它就会终止连接,并且在启动新机器后,它会以循环方式发送传入请求。我想要的是以下内容。

  1. 当系统的 CPU 利用率达到 80% 时,启动新服务器但保持现有连接处于活动状态。
  2. 仅当第一台服务器的 CPU 利用率 > 80% 时才将新请求发送到新创建的服务器。(无循环)

我该如何实现这一点?谢谢您的时间。

答案1

如果你愿意转换到 hls (nginx-rtmp 支持 hls) 从我的经验来看,它会让你的生活比尝试负载平衡 rtmp 本身更轻松。设置好 hls 转码后,你唯一需要做的就是将 cdn 放在你的 web 服务器前面,让它负责缓存,或者自己使用 varnish、squid 甚至 nginx 来做缓存(当然还有更多可能性)——HTTP 缓存如此普遍,我相信你会找到一个简单的解决方案。

但是如果您想坚持使用 rtmp,您可以建立类似的基础设施。

拥有一个主摄取服务器和多个边缘节点,每个来自采集服务器。此设置具有相当好的可扩展性,应该可以很好地满足您当前的负载。

编辑:似乎我误解了你的问题:最简单的可能是有一个 api 端点,你可以询问你的网络摄像头应该流式传输到哪个 rtmp 服务器,而不是尝试负载平衡。

因此,一旦您的 rtmp 服务器达到 X 流(参见 nginx-rtmp 统计模块),您就启动一个新实例并将新流重定向到该实例。

nginx-rtmp 在 on_connect 中还具有重定向功能(目前无法放置两个以上的链接,只需在指令 wiki 页面上搜索 on_connect 即可),方法是返回带有 Location 的 3xx 标头。我不确定这是否支持重定向到其他节点,但这也值得一试 - 这样可以避免在选择服务器之前必须手动查询。

答案2

我不知道 nginx 是否支持 rtmp 模块的可扩展性,但如果您可以自由更改服务器解决方案,您可以尝试我们的服务器:摩纳哥服务器

它具有可扩展性并且原生支持其他协议(如 RTMFP)。

这里有一个具有 3 个服务器的可扩展性的配置示例:http://www.monaserver.ovh/scalability.html#exchange-data-and-resources 此示例在服务器拥有超过 400 个订阅者时重定向新订阅。如果您确实更喜欢使用 CPU 利用率,则可以更改以下行:

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 脚本中,而无需包含任何其他库/插件)

如果您需要帮助,您可以在论坛上联系我们。

希望对您有帮助!

相关内容