cdn

CDN

Diese Doku beschreibt unser Live-Streaming CDN, wie es seit dem 34C3 gilt.

Die CDN-Kaskade hat 5 Stufen: Master-Encoder, Transcoder, Fanout, Transport-/Master-Nodes und schließlich Edge-Nodes.

Das Master-Encoding entsteht auf dem encoder-cube im Saal aus dem Ausgabesignal des Voctomix. Das Master-Encoding enthält den Mix als 1080p25 in h264 sowie die Slides als 1080p5 in h264 sowie aac von bis zu drei Audiospuren (Native, Translated, Translated-2). Wahlweise können die Übersetzerspuren sowie die Slide-Spur weggelassen werden. Alle Spuren werden in einem Matroska-Container verpackt.

Das Master-Encoding wird von einem Script erzeugt, welches vom ansible aus folgendem Template erzeugt wird: https://github.com/voc/cm/blob/master/ansible/roles/encoder/templates/voctomix-scripts/streaming-sink-mkvonly.sh.j2

Das Master-Encoding wird auf den lokalen (= auf dem encoder-cube laufenden) Icedist (= Icecast zur internen Distribution) auf Port 7999 gepusht (http://encoderX.lan.c3voc.de:7999/sX). Der Icedist auf live.ber.c3voc.de pullt diesen und bietet ihn seinerseits auf http://live.ber.c3voc.de:7999/sX an.

Debugging

http://195.54.164.164:7999 (oder http://live.ber.c3voc.de:7999 im Inkognito-Modus damit einen der Browser nicht zu HTTPS zwingen will)

voc@live.ber:/etc/icecast2$ systemctl status icedist                                           2019-08-20 21:52:20
● icedist.service - distribution Icecast
   Loaded: loaded (/etc/systemd/system/icedist.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-07-30 19:50:07 CEST; 3 weeks 0 days ago
 Main PID: 794 (icecast2)
    Tasks: 25 (limit: 4915)
   CGroup: /system.slice/icedist.service
           └─794 /usr/bin/icecast2 -c /etc/icecast2/icedist.xml

sudo tail -f /var/log/icedist/error.log

Das Transcoding läuft auf Speedy & Tweety im RZ “alb”. Dabei sind die Räume wie folgt verteilt:

  • speedy: s1, s2, s3, q1 (Freie Push-Quelle), sX (Teststream)
  • tweety: s4, s5, s6, q2 (Freie Push-Quelle), s23 (Encoder CCCB), s80 (Encoder MUC)

Important: Es ist unwarscheinlich dass speedy & tweety all diese Streams gleichzeitig mit allen Features (HD, SD und Slides) transcoden können.

Diese Verteilung wird über Host-Attribute im cm geregelt: https://github.com/voc/cm/blob/master/ansible/event#L48-L49.

Die Transcoding-Scripte holen sich die Master-Streams von http://live.ber.c3voc.de:7999 und erzeugen die fehlenden Formate: vpx-hd/sd/slides, vorbis-audio (für webm), h264-sd sowie mp3/opus-audio.

Die Scripte dazu werden vom ansible aus folgenden Templates erzeugt: https://github.com/voc/cm/tree/master/ansible/roles/transcoder/templates/transcoder

Die drei Scripte (h264, vpx, audio) erzeugen aus dem Master-Stream drei Format-Streams: (sXh264, sXwebm, sX_audio), welche wieder gegen live.ber.c3voc.de:7999 gepusht werden. Diese Format-Streams sind dann unter folgenden URLs verfügbar:

Da jeder Format-Stream aus einem einzelnen ffmpeg-Prozess stammt und in einem Container landet sind die darin enthaltenen Videoströme Zeitsynchron zueinander. Die Trennung nach Formaten soll ermöglichem einzelne Format-Transport-Chains bei Problemen neustarten zu können, ohne die andere zu stören.

Die Pull-Quelle und das Push-Ziel ist über Group-Vars konfigurierbar: https://github.com/voc/cm/blob/master/ansible/group_vars/transcoders

Verwaltung

Je nach Event und Situation möchte man ggf. die Verteilugn der Streams zwischen Speedy und Tweety anders einstellen. Dazu existieren auf beiden Rechnern systemd-Targets für jeden Raum. Um einen Überblick über die derzeit aktivierten Transcodings zu erhalten kann folgender Befehl verwendet werden:

voc@tweety.int:~$ systemctl list-units 'trans*'                                                                                                                                                 2018-01-23 0:22:42
UNIT                        LOAD   ACTIVE     SUB          DESCRIPTION                  
transcode_s1_audio.service  loaded active     running      Transcoder audio Stream s1   
transcode_s1_h264.service   loaded active     running      Transcoder h264 Stream s1    
transcode_s1_vpx.service    loaded active     running      Transcoder vpx Stream s1     
transcode_s2_audio.service  loaded active     running      Transcoder audio Stream s2   
…
transcode_s1.target         loaded active     active       All Transcoders of Stream s1 
transcode_s2.target         loaded active     active       All Transcoders of Stream s2 
…

Zum auflisten aller verfügbaren Transcoder kann folgender Befehl benutzt werden:

voc@tweety.int:~$ systemctl list-unit-files 'trans*'                                                                                                                                            2018-01-23 0:35:36
UNIT FILE                   STATE   
transcode_s1_audio.service  enabled 
transcode_s1_h264.service   enabled 
transcode_s1_vpx.service    enabled 
transcode_s2_audio.service  enabled 
…
transcode_s1.target         disabled
transcode_s2.target         disabled
transcode_s3.target         disabled
transcode_s4.target         enabled 
transcode_s5.target         enabled 
transcode_s6.target         enabled 

Einzelne Räume können über die Targets aktiviert bzw. Deaktiviert werden:

sudo systemctl start transcode_s5.target
sudo systemctl stop transcode_s1.target

Important: Unbedingt darauf achten, dass Streams nicht auf beiden Hosts transcodet werden, da dies zu Stream-Abbrüchen führen kann.

Diese 3 Format-Streams je Raum werden von der nächsten Stufe auf live.ber.c3voc.de in die finalen Streams in allen für Endnutzer angebotenen Kombinationen auseinander gemuxt (=“fanout”).

Dabei entstehen alle Kombinationen aus sX[hd|sd|slides][native|translated|translated-2] in webm, hls und dash sowie sX_[native|translated|translated-2].[mp3|opus] erzeugt. Die WebM- und die Audio-Streams werden gegen den Icecast auf http://live.ber.c3voc.de:8000/ gepusht, die HLS- und DASH-Streams werden vom nginx unter http://live.ber.c3voc.de/hls/ bzw. http://live.ber.c3voc.de/dash/ angeboten.

Die Scripte dazu werden vom ansible aus folgenden Templates erzeugt werden: https://github.com/voc/cm/tree/master/ansible/roles/relay/files/fanout.

Um einen Überblick über die deployten Fanout Skripte zu erhalten kann folgender Befehl verwendet werden:

voc@live.ber:~$ systemctl list-units 'fanout*'  

Die Pull-Quelle und das Push-Ziel sowie der Pfad unter dem die HLS/DASH-Schnipsel und Playlisten abgelegt werden ist über Group-Vars konfigurierbar: https://github.com/voc/cm/blob/master/ansible/group_vars/relays#L5

Zu den Aufgaben der fanout-Scripte gehört auch das übermitteln des h264-Videostroms zu Youtube. Die Stream-Keys dazu kommen aus dem KeePass, die Scripte aus dem oben verlinkten Git-Repo.

  • Youtube ist derzeit deaktiviert und wird üblicherweise nur für den Congress aktiviert.

Das Transcoding und Fanout reagiert dynamisch auf die Konfiguration des Streams der vom encoder-cube gesendet wird. Fehlt die Slides-Spur oder die Translation-Spuren wird diese nicht in den Master-Playlists und Dash-Manifestd für Adaptives streaming angeboten. Dadurch kann von Event zu Event entschieden werden, ob der Einsatz der Slide-Spur bzw. von Translations sinn ergibt. Siehe dazu Audiomapping in Voctomix zu Details wie Translations de/aktiviert werden können.

Im Non-Congress Setup ist live.ber.c3voc.de die einzige (Non-Public) Transport-Node. Die (Public) Edge-Nodes ziehen ihre Daten von dort.

Die ganzjährigen Edge-Nodes lauten:

  • live.bn.c3voc.de
  • live.alb.c3voc.de
  • live.dus.c3voc.de
  • live.self.c3voc.de
  • live.fem.c3voc.de

Diese pullen alle Icecast-Streams (Port :8000) – nicht die Icedist-Streams – von live.ber.c3voc.de. Für die schlussendliche Auslieferung kommt ein nginx zum Einsatz, der abhängig von der URL Daten von einem der unterschiedlichen Backend proxied:

  • Für Anfragen zu einem WebM, MP3 oder Opus-Stream (z.B: http://live.x.c3voc.de/sX_native_hd.webm) agiert der nginx als Proxy zu seinem eigenen Icecast. Er übernimmt in dieser Rolle das Aggregieren auf die Ports 80/443 sowie das SSL-Handling (für 443).
  • Für Anfragen nach HLS oder DASH-Schnipseln, -Playlisten und -Manifests (z.B. http://live.x.c3voc.de/hls/sX_native_hd.m3u8) agiert der nginx als Proxy zur Master-Node live.ber.c3voc.de, von welcher er die angefragten Datein abholt und für einen genau festgelegten Zeitraum zwischenspeichert. Dieser Zeitraum muss dabei mit der Segmentlänge der Playlists abgestimmt sein, um eine Fehlerfreie Wiedergabe zu ermöglichen.

Für den Teststream vornach dem Congress (Codename sXnativehd & co.) wurde speedy.lan.c3voc.de als Transcoder für den Stream sX konfiguriert; live.ber.c3voc.de übernimmt das fanout. Der Teststream wird von einem script in einem screen des voc-Benutzers auf live.ber.c3voc.de zugeliefert.

Alle bereitgestellten Test-URLs lauten

VPx-HD:

VPx-SD:

VPx-Slides:

h264-HD:

h264-SD:

h264-Slides:

WebM Multi-Qualität + Multi-Lang

Audio-MP3:

Audio-Opus:

auf speedy.lan.c3voc.de:

sudo systemctl stop transcode_sX.target 
sudo systemctl disable transcode_sX.target 

auf live.ber.c3voc.de:

sudo systemctl stop fanout_sX.target
sudo systemctl disable fanout_sX.target

screen -rd source-for-teststream
:quit

Neben den Transport- und Edge-Relays gibt es noch zwei Loadbalancer:

  • lb.dus.c3voc.de
  • lb.alb.c3voc.de

Diese sind sowohl für die Domains streaming.media.ccc.de als auch für cdn.c3voc.de zuständig. Im DNS sind für beide Domains beide Server angegeben, so dass Clients per statistischem Round-Robin auf einen der beiden Server verteilt werden.

Unter dieser Domain liefern beide LBs unabhängig von einander die Streaming-Webseite aus. Die LBs sind dabei komplett unabhängig voneinander und haben auch je eine eigene Konfiguration. Es ist aufgabe des Website-Deployments die Konfiguration synchron zu halten. Durch dieses Setup kann bei Bedarf der jeweilige LB einfach aus der DNS-Rotation herausgenommen werden.

Die Domain cdn.c3voc.de wird auf beiden LBs von einem HAProxy bedient. Dieser sortiert eventuell zwischen DTAG und Lokalen Klienten und wählt auf dieser Basis einen des obenstehenden Relays aus. Im unterjährigen Betrieb gibt es keine Unterscheidung: Alle Anfragen werden unter den genannten Relays verteilt.

Der HAProxy verteilt dabei ausschließlich per Redirect, er proxied (entgegen seines Namens) nicht.

Für Spezialanwendungen (z.B. Cam-Only Streaming im Fritz-Studio) existieren die RTMP-Endpunkte q1 und q2 auf live.ber.c3voc.de. Die Push-Targets lauten rtmp://live.ber.c3voc.de/stream/q1 bzw. q2. Eine Systemd-Unit setzt diese dann auf Icedist-Ströme gleichen Namens um, von wo Transcoding und Fanout wie oben beschrieben seinen Weg nehmen.

Achtung: Aufgrund der langen rtmp-Timeouts in ffmpeg kann es bis zu 40 Sekunden dauern, bis die Streams auftauchen und weitere 30 Sekunden, bis alle Formate zur Verfügung stehen. Keine Ungeduld.

  • cdn.1580772340.txt.gz
  • Last modified: 2020/02/04 00:25
  • by ischluff