如何确保在原始集群模式下访问正确的后端M3U8文件



从SRS如何转换HLS wiki,我们知道SRS在HLS_path中生成了相应的M3U8播放列表,这是我的配置文件:

http_server {
enabled         on;
listen          8080;
dir             ./objs/nginx/html;
}
vhost __defaultVhost__ {
hls {
enabled         on;
hls_path        /data/hls-records;
hls_fragment    10;
hls_window      60;
}
}

在一个SRS服务器的情况下,每个播放HLS流的客户端都访问同一个推送SRS服务器,这没关系。但在原始集群模式下,有很多SRS服务器,每个流都在其中一个服务器中。当客户端播放这个HLS流时,我们无法保护它可以访问正确的源SRS服务器(如果不存在,则导致404 http状态代码(。与RTMP和HTTP-FLV流不同,SRS使用HTTP-API功能的同事来重定向右原点SRS。

为了解决这个问题,我认为以下两种解决方案:

  • 使用专门的后端HLS段SRS服务器:
    不要在原始SRS服务器中生成M3U8,每个流都转发到该SRS服务器,所有M3U8都在该服务器中生成,所有HLS请求都代理到该服务器(使用nginx(。缺点。该解决方案仅限于一个实例,没有扩展能力和单节点风险

原始srs.conf转发配置如下:

vhost same.vhost.forward.srs.com {
# forward stream to other servers.
forward {
enabled on;
destination 192.168.1.120:1935;
}
}

其中192.168.1.120是后端hls段SRS服务器。

  • 使用NFS/K8S PV/分布式文件系统等云存储:
    将云存储作为本地文件夹安装在每个SRS服务器中,无论SRS服务器、M3U8文件和ts段在哪个流中传输到同一个大存储,因此在HLS请求后,http服务器将它们作为静态文件提供。根据我的测试,如果云存储的写入速度可靠,这是一个很好的解决方案。但是,如果网络抖动或写入速度不如接收速度,它会阻塞其他协程,从而导致SRS异常

hls_path配置如下:

vhost __defaultVhost__ {
hls {
enabled         on;
hls_path        /shared_storage/hls-records;
hls_fragment    10;
hls_window      60;
}
}

这里的"shared_stoarge"表示nfs/cephfs/pv装载点。

从我的角度来看,上述解决方案并不能从根本上解决访问问题,我期待着为这种情况找到更可靠的产品解决方案?

当你使用OriginCluster时,你必须有很多流来服务,有很多编码器可以将流发布到你的媒体服务器。解决问题的关键:

  1. 永远不要使用单个服务器,使用集群来获得弹性能力,因为将来可能会获得更多的流。所以转发是不好的,因为你必须配置一组特殊的流来转发,类似于手动哈希算法
  2. 除了带宽,磁盘IO也是瓶颈。您肯定需要一个高性能的网络存储群集。但要小心,永远不要让SRS直接写入存储器,它会阻塞SRS协程

所以,据我所知,最好的解决方案是:

  1. 使用SRS Origin Cluster,在本地磁盘上写入HLS,或者RAM磁盘更好,以确保磁盘IO永远不会阻止SRS协程(由状态线程网络IO驱动(
  2. 使用网络存储集群来存储HLS文件,例如AWS S3或NFS/K8S PV/分布式文件系统之类的云存储。使用nginx或CDN来交付HLS

现在的问题是:如何将数据从内存/磁盘移动到网络存储集群

您必须通过Python或Go构建服务:

  • 使用on_hls回调,通知您的服务移动HLS文件
  • 使用on_publish回调,通知您的服务启动FFmpeg以将RTMP转换为HLS

注意,FFmpeg应该从SRS边缘提取流,而不是直接从原始服务器提取流。

最新更新