Clone
1
migrate_v5_CN_edge
winlin edited this page 2022-07-31 13:16:33 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

HOME > CN > Edge Cluster

Edge Server

Note: 如果觉得Github的Wiki访问太慢可以访问 Gitee 镜像。

SRS的Edge主要解决几条流有大量播放请求的场景比如一个流有上万人观看。SRS的Edge能对接所有的标准RTMP源站服务器。

备注Edge一般负载高SRS支持的并发足够跑满千兆网带宽了。

Remark: SRS Edge does not support Transcoding, DVR and HLS, which is supported by SRS Origin Server.

Edge的主要应用场景

  • CDN/VDN大规模集群客户众多流众多需要按需回源。
  • 小规模集群,但是流比较多,需要按需回源。
  • 骨干带宽低边缘服务器强悍可以使用多层edge降低上层BGP带宽。

注意edge可以从源站拉流也可以将流转发给源站。也就是说播放edge上的流时edge会 回源拉流推流到edge上时edge会直接将流转发给源站。

注意若只需要中转流给源站不必用forward直接使用edge模式即可。可以直接支持推流 和拉流的中转简单快捷。Forward应用于目标服务器是多个譬如将一路流主动送给多路服务 器edge虽然配置了多台服务器但是只用了一台有故障时才切换。

注意优先使用edge除非知道必须用forward才使用forward。

概念

所谓边缘edge服务器就是边缘直播缓存服务器配置时指定为remote模式和origin指定一 个或多个源站IP这个边缘edge服务器就是源站的缓存了。

当用户推流到边缘服务器时边缘直接将流转发给源站。譬如源站在北京BGP机房湖南有个 电信ADSL用户要推流发布自己的直播流要是直接推流到北京BGP可能效果不是很好可以在 湖南电信机房部署一个边缘用户推流到湖南边缘边缘转发给北京源站BGP。

当用户播放边缘服务器的流时,边缘服务器看有没有缓存,若缓存了就直接将流发给客户端。 若没有缓存,则发起一路回源链接,从源站取数据源源不断放到自己的缓存队列。也就是说, 多个客户端连接到边缘时只有一路回源。这种结构在CDN是最典型的部署结构。譬如北京源站 在全国32个省每个省都部署了10台服务器一共就有320台边缘假设每个省1台边缘服务器都有 2000用户观看那么就有64万用户每秒钟集群发送640Gbps数据而回源链接只有320个 实现了大规模分发。

边缘edge服务器实际上是解决大并发问题产生的分布式集群结构。SRS的边缘可以指定多个源站 在源站出现故障时会自动切换到下一个源站,不影响用户观看,具有最佳的容错性,用户完全不会觉察。

Config

edge属于vhost的配置将某个vhost配置为edge后该vhost会回源取流播放时或者将流转发 给源站(发布时)。

vhost __defaultVhost__ {
    # The config for cluster.
    cluster {
        # The cluster mode, local or remote.
        #       local: It's an origin server, serve streams itself.
        #       remote: It's an edge server, fetch or push stream to origin server.
        # default: local
        mode            remote;

        # For edge(mode remote), user must specifies the origin server
        # format as: <server_name|ip>[:port]
        # @remark user can specifies multiple origin for error backup, by space,
        # for example, 192.168.1.100:1935 192.168.1.101:1935 192.168.1.102:1935
        origin          127.0.0.1:1935 localhost:1935;

        # For edge(mode remote), whether open the token traverse mode,
        # if token traverse on, all connections of edge will forward to origin to check(auth),
        # it's very important for the edge to do the token auth.
        # the better way is use http callback to do the token auth by the edge,
        # but if user prefer origin check(auth), the token_traverse if better solution.
        # default: off
        token_traverse  off;

        # For edge(mode remote), the vhost to transform for edge,
        # to fetch from the specified vhost at origin,
        # if not specified, use the current vhost of edge in origin, the variable [vhost].
        # default: [vhost]
        vhost           same.edge.srs.com;

        # For edge(mode remote), when upnode(forward to, edge push to, edge pull from) is srs,
        # it's strongly recommend to open the debug_srs_upnode,
        # when connect to upnode, it will take the debug info,
        # for example, the id, source id, pid.
        # please see: https://github.com/ossrs/srs/wiki/v5_CN_SrsLog
        # default: on
        debug_srs_upnode    on;
    }
}

可配置多个源站,在故障时会切换到下一个源站。

集群配置

下面举例说明如何配置一个源站和集群。

源站配置,参考origin.conf

listen              19350;
pid                 objs/origin.pid;
srs_log_file        ./objs/origin.log;
vhost __defaultVhost__ {
}

边缘配置,参考edge.conf

listen              1935;
pid                 objs/edge.pid;
srs_log_file        ./objs/edge.log;
vhost __defaultVhost__ {
    cluster {
        mode            remote;
        origin          127.0.0.1:19350;
    }
}

HLS边缘

Edge指的是RTMP边缘也就是说配置为Edge后流推送到源站OriginEdge不会切片生成HLS。

HLS切片配置在源站只有源站会在推流上来就产生HLS切片。边缘只有在访问时才会回源这个时候 也会生成HLS但单独访问边缘的HLS是不行的

也就是说HLS的边缘需要使用WEB服务器缓存譬如nginx反向代理squid或者traffic server等。

下行边缘结构设计

下行边缘指的是下行加速边缘,即客户端播放边缘服务器的流,边缘服务器从上层或源站取流。

SRS下行边缘是非常重要的功能需要考虑以下因素

  • 以后支持多进程时结构变动最小。
  • 和目前所有功能的对接良好。
  • 支持平滑切换,源站和边缘两种角色。

权衡后SRS下行边缘的结构设计如下

  • 客户端连接到SRS
  • 开始播放SRS的流
  • 若流存在则直接播放。
  • 若流不存在,则从源站开始取流。
  • 其他其他流的功能,譬如转码/转发/采集等等。

核心原则是:

  • 边缘服务器在没有流时,向源站拉取流。
  • 当流建立起来后,边缘完全变成源站服务器,对流的处理逻辑保持一致。
  • 支持回多个源站,错误时切换。这样可以支持上层服务器热备。

备注RTMP多进程计划中的核心原则是用多进程作为完全镜像代理连接到本地的服务器 源站或边缘完全不考虑其他业务因素透明代理。这样可以简单而且利用多CPU能力。 HTTP多进程是不考虑支持的用NGINX是最好选择SRS的HTTP服务器只是用在嵌入式设备中 没有性能要求的场合。

上行边缘结构设计

上行边缘指的是上行推流加速,客户端推流到边缘服务器,边缘将流转发给源站服务器。

考虑到下行和上行可能同时发生在一台边缘服务器,所以上行边缘只能用最简单的代理方式, 完全将流代理到上层或源站服务器。也就是说,只有在下行边缘时,边缘服务器才会启用其他 的功能譬如HLS转发等等。

上行边缘主要流程是:

  • 客户端连接到SRS
  • 开始推流到SRS。
  • 开始转发到源站服务器。

EdgeState

边缘的状态图分析如下:

RTMP-HLS-latency

注意:这种细节的文档很难保持不变,以代码为准。

边缘的难点

RTMP边缘对于SRS来讲问题不大主要是混合了reload和HLS功能的边缘服务器会是一个难点。

譬如用户在访问边缘上的HLS流时是使用nginx反向代理回源还是使用RTMP回源后在边缘切片 对于前者需要部署srs作为RTMP边缘nginx作为HLS边缘管理两个服务器自然是比一个要费劲。 若使用后者即RTMP回源后边缘切片能节省骨干带宽只有一路回源难点在于访问HLS时要发起 RTMP回源连接。

正因为业务逻辑会是边缘服务器的难点所以SRS对于上行边缘采取直接代理方式并没有采取 边缘缓存方式。所谓边缘缓存方式,即推流到边缘时边缘也会当作源站直接缓存(作为源站), 然后转发给源站。边缘缓存方式看起来先进,这个边缘节点不必回源,实际上加大了集群的逻辑难度, 不如直接作为代理方式简单。

Transform Vhost

一般CDN都支持上行和下行边缘加速上行和下行的域名是分开的譬如上行使用up.srs.com,下行使用down.srs.com,这样可以使用不同的设备组,避免下行影响下行之类。

用户在推流到up.srs.com边缘使用edge模式回源时也是用的up.srs.com,到源站还是up.srs.com,所以播放down.srs.com这个vhost的流时就播放不了用户推的那个流。因此需要edge在回源时transform vhost也就是转换vhost。

解决方案在最上层edge可以配置回源的vhost默认使用当前的vhost。譬如上行up.srs.com,可以指定回源down.srs.com;配置时指定vhost down.srs.com;就可以了。

具体配置参考上面的Config。

Winlin 2015.4