.png)
ich benutzeNginx-rtmp-modulfür Live-Streaming. Es funktioniert perfekt für 40-50 Kameras auf einer einzigen Maschine (AWS EC2 C3-groß). Aber wenn ich mehr als 100 Streams habe, wie kann ich meine Server skalieren, um die Anforderungen zu erfüllen?
Ich habe versucht, ELB zu verwenden, aber es beendet die Verbindungen, sobald eine neue Maschine gestartet wird, und sendet nach dem Start der neuen Maschine eingehende Anfragen im Round-Robin-Verfahren. Was ich möchte, ist Folgendes.
- Wenn die CPU-Auslastung des Systems 80 % erreicht, starten Sie einen neuen Server, aber halten Sie die bestehenden Verbindungen aufrecht.
- Senden Sie neue Anfragen nur dann an den neu erstellten Server, wenn die CPU-Auslastung des ersten Servers > 80 % ist. (Kein Round Robin)
Wie kann ich das erreichen? Vielen Dank für Ihre Zeit.
Antwort1
Wenn Sie bereit sind, auf HLS umzusteigen (nginx-rtmp unterstützt hls) es würde Ihnen das Leben – meiner Erfahrung nach – leichter machen, als zu versuchen, die Last von RTMP selbst auszugleichen. Sobald Sie die HLS-Transkodierung eingerichtet haben, müssen Sie nur noch ein CDN vor Ihren Webserver schalten und dieses das Caching übernehmen lassen oder selbst eins mit Varnish, Squid oder sogar Nginx erstellen (natürlich gibt es noch mehr Möglichkeiten) – HTTP-Caching ist so weit verbreitet, dass Sie sicher eine einfache Lösung finden werden.
Wenn Sie jedoch bei RTMP bleiben möchten, können Sie eine ähnliche Infrastruktur einrichten.
Verfügen Sie über einen Master-Ingest-Server und mehrere Edge-Knoten, die jeweilsziehenvom Ingest-Server. Dieses Setup wäre ziemlich skalierbar und sollte für Ihre aktuelle Auslastung gut funktionieren.
Bearbeiten: Offenbar habe ich Ihre Frage missverstanden: Am einfachsten wäre es wahrscheinlich, einen API-Endpunkt zu haben, den Sie fragen können, zu welchem RTMP-Server Ihre Webcam streamen soll, anstatt zu versuchen, die Last auszugleichen.
Sobald Ihr RTMP-Server X-Streams erreicht hat (siehe nginx-rtmp-Stat-Modul), starten Sie eine neue Instanz und leiten neue Streams dorthin um.
nginx-rtmp verfügt auch über eine Umleitungsfunktion in on_connect (es können noch nicht mehr als zwei Links eingefügt werden, suchen Sie einfach auf der Wiki-Seite mit den Anweisungen nach on_connect), indem ein 3xx-Header mit einem Standort zurückgegeben wird. Ich bin nicht sicher, ob dies die Umleitung zu einem anderen Knoten unterstützt, aber es wäre auch einen Versuch wert – dann kann man vermeiden, vor der Auswahl eines Servers manuell abfragen zu müssen.
Antwort2
Ich weiß nicht, ob Nginx Skalierbarkeit mit dem RTMP-Modul unterstützt, aber wenn Sie die Serverlösung ändern möchten, können Sie unseren Server ausprobieren:Monaserver.
Es ermöglicht Skalierbarkeit und unterstützt nativ andere Protokolle (wie RTMFP).
Hier sehen Sie ein Konfigurationsbeispiel für Skalierbarkeit mit 3 Servern:http://www.monaserver.ovh/scalability.html#exchange-data-and-resources Dieses Beispiel leitet neue Abonnements um, wenn der Server mehr als 400 Abonnenten hat. Wenn Sie wirklich die CPU-Auslastung nutzen möchten, können Sie die folgende Zeile ändern:
if _nextServer and _subscribers>=400 then error(_nextServer.host) end
mit :
if _nextServer and cpu>80 then error(_nextServer.host) end
Dann können Sie den besten Weg finden, um die CPU-Auslastung zu erhöhen (ParameterCPU). Wenn Sie C++-Code aufrufen müssen, sehen Sie sich die FFI-Bibliothek an (Sie können C++-Code in Lua-Skripte einbetten, ohne eine andere Bibliothek/ein anderes Plug-In einzubinden).
Sie können uns im Forum kontaktieren, wenn Sie Hilfe benötigen.
Ich hoffe es hilft dir!