Diseyo de una infraestructura de streaming escalable

Diseño de una Infraestructura de Streaming Escalable

Cuando empezamos a montar los servidores de La MIX Radio, cometimos el error de poner todo en una sola máquina virtual. El diseño de una infraestructura de streaming escalable no es algo que necesites cuando tienes diez oyentes, pero se vuelve crítico cuando el tráfico sube o cuando un proceso consume toda la CPU. En nuestra experiencia, si el servidor de sonido y el servidor de gestión comparten los mismos recursos sin control, el audio empezará a saltar y la conexión se caerá para todos.

El problema de centralizar todo en un solo proceso

El mayor riesgo al no planificar la escalabilidad es el efecto dominó. Imaginen que tenemos un script de Python procesando metadatos pesados o que el bot de Telegram se queda colgado intentando enviar una alerta. Si ese proceso corre en el mismo núcleo que Icecast, el flujo de audio sufre microcortes inmediatos. Para el oyente, esto se traduce en un silencio repentino o en un buffering infinito.

Esto nos lleva a un punto crítico: la gestión de la memoria y la CPU en entornos virtualizados. Si no aislamos los servicios, un pico de consumo en la página web de la radio puede tirar abajo la emisión. No es una cuestión de potencia bruta, sino de cómo distribuimos la carga para que el streaming sea la prioridad absoluta del hardware.

Requerimientos previos para montar el entorno

Antes de tocar el servidor, necesitamos tener una base sólida para que el diseño de una infraestructura de streaming escalable funcione sin sorpresas. En nuestro homelab, esto implica lo siguiente:

  • Un servidor con Proxmox VE instalado y actualizado.
  • Al menos una VM con Debian o Ubuntu (nosotros usamos la VM 111 para el core de audio).
  • Un contenedor LXC (CT 101) para servicios auxiliares y proxy.
  • Acceso SSH con llaves configuradas para evitar entrar por consola web constantemente.
  • Una dirección IP fija o un DNS dinámico correctamente apuntado.

Cómo implementamos la arquitectura paso a paso

Para resolver los problemas de estabilidad, decidimos separar el servidor de streaming del servidor de borde. Lo que hacemos es usar Nginx como proxy inverso en un contenedor ligero, mientras que Icecast corre en una máquina virtual dedicada con recursos reservados.

Primero, configuramos la VM 111 para que solo se encargue del flujo de audio. Instalamos Icecast y ajustamos el archivo de configuración para que escuche solo en la red interna, evitando que el tráfico externo golpee directamente al proceso de streaming.

Para gestionar el tráfico externo, usamos Nginx en el CT 101. El siguiente bloque de código muestra cómo configuramos el archivo de sitio para que el tráfico de la radio llegue al servidor de audio sin interrupciones.

server {

listen 80;

server_name lamixradio.com;

location / {

proxy_pass http://192.168.1.111:8000;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_buffering off;

proxy_read_timeout 3600;
}
}

Una vez que el tráfico fluye correctamente, el siguiente paso es automatizar la gestión de los metadatos. No queremos que el servidor de audio se encargue de buscar nombres de canciones o artistas en APIs externas, ya que eso genera latencia. Para eso, creamos un script en Python que corre en un contenedor separado.

Este script procesa la información y la envía a Icecast mediante el protocolo de administración. Así, el diseño de una infraestructura de streaming escalable se mantiene limpio, delegando las tareas pesadas a procesos que no afectan el flujo de bits.

Para conectar todo esto con nuestras notificaciones, usamos n8n en otro contenedor. Cuando el script de Python detecta un cambio de canción, envía un webhook a n8n, y este dispara la alerta a Telegram. De esta forma, si el bot de Telegram falla, el audio sigue sonando porque están en entornos totalmente aislados.

La clave de un diseño de una infraestructura de streaming escalable no es comprar más hardware, sino aislar los procesos para que el fallo de un componente no silencie la radio.

Errores que nos costaron noches sin dormir

En este camino hemos cometido fallos que nos llevaron a resolver problemas a las 3 de la mañana. Aquí detallamos los tres más recurrentes para que no los repitan.

El primero fue dejar el proxy_buffering activado en Nginx. El síntoma era un retraso enorme en el flujo de audio y cortes aleatorios. La causa era que Nginx intentaba almacenar la respuesta del streaming antes de enviarla al oyente. Lo solucionamos poniendo la directiva en off.

El segundo error ocurrió al asignar memoria dinámica en Proxmox. Notamos que Icecast se reiniciaba esporádicamente cuando la VM 111 intentaba liberar RAM. La solución fue asignar memoria fija (Fixed RAM) para evitar que el kernel de Linux matara el proceso de streaming por falta de recursos.

El tercero fue el uso de DNS internos mal configurados. Tuvimos un tiempo donde el script de Python perdía la conexión con el servidor de audio porque el contenedor CT 101 no resolvía la IP de la VM 111. Lo arreglamos configurando un archivo /etc/hosts estático en cada contenedor para evitar dependencias del servidor DNS.

Verificación del sistema

Para saber si este diseño de una infraestructura de streaming escalable es realmente efectivo, realizamos una prueba de estrés básica. Abrimos el monitor de Proxmox y saturamos el contenedor de n8n con peticiones basura. Si el audio de La MIX Radio sigue sonando fluido y sin saltos en el reproductor externo, sabemos que el aislamiento de la VM 111 está funcionando correctamente.

Además, revisamos los logs de Nginx con el comando tail -f /var/log/nginx/error.log. Si no vemos errores de upstream timed out mientras el bot de Python trabaja, la arquitectura es estable.

El siguiente paso lógico

Ahora que tenemos la base aislada y el tráfico controlado, lo que sigue es implementar la redundancia. El paso natural es montar un segundo nodo de Icecast en otra VM y configurar un balanceador de carga. Así, si la VM 111 llega a fallar por completo, el tráfico se redirige automáticamente a un respaldo, asegurando que la radio nunca se quede en silencio.

Compartir

“Post relacionados”