webrtc  doc:  https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc

官网部署文档:https://github.com/ossrs/srs/wiki/v4_CN_SampleOriginCluster

参考:https://blog.csdn.net/sundehui01/article/details/106234778

WebRTC一对一通话环境搭建与逻辑分析  : 请参考: https://blog.csdn.net/m0_60259116/article/details/124691647

单台服务器做直播风险太高,可以利用SRS的集群模式,示意图如下

 

 

 

 

 

源站服务器集群:origin server cluster,

边缘服务器集群:edge server cluster,可以用N台机器,从源站拉流,用于较大规模的实时播放。

源站前置负载均衡(硬件或软件负载均衡都行),上图中用haproxy来实现tcp的软负载均衡。

边缘服务器前置反向代理(比如:nginx),用于提供统一的播放地址,同时解决跨域问题,给客户端拉流播放。

这样架构的好处有以下:

1、不管是源站集群,还是连缘服务器集群,均可水平扩展,理论上没有上限。

2、源站可以仅用较少的机器,比如2主2从,就能实现一个高可用且性能尚可的集群(如果业务量不大,连slave server都可以省掉)

3、边缘服务器集群,可以根据实际用户量随时调整规模,另外hls切片,可以放在edge server上切片,减轻源站服务器压力。

 

部署规划:

ip                 rtmp port    http api port             role
192.168.25.131     19350        9090                   originA
192.168.25.132     19350        9090                   originB
192.168.25.133     19350        9090                   originC
                                    
192.168.25.131     1935          8080 80                 edgeA
192.168.25.132     1935          8080 80                  edgeB
192.168.25.133     1935          8080 80                   edgeC

 

git  下载代码,编译: 

git clone -b 4.0release https://gitee.com/ossrs/srs.git &&
cd srs/trunk && ./configure && make

 

启动: 

srs/trunk>  ./objs/srs -c conf/srs.conf   指定配置文件
此处主要docker 版本

 

 

 docker  images:

sudo docker  pull  registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4

or

sudo docker  pull  ossrs/srs:4
originA
 
vim /opt/srs/cluster/originA.conf (3台都一样)
# conf/origin.cluster.serverA.conf
listen              19350;
max_connections     1000;
daemon              off;
srs_log_tank        console;
pid                 ./objs/origin.cluster.serverA.pid;
http_api {
    enabled         on;
    listen          9090;
}
vhost __defaultVhost__ {
    cluster {
        mode            local;
        origin_cluster  on;
        coworkers       192.168.25.131:9090 192.168.25.132:9090 192.168.25.133:9090;
    }
}
run:
docker run -itd  --restart=always  --net=host  \
  -v /opt/srs/cluster/originA.config:/opt/srs/cluster/originA.config \ 
registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 \ 
objs/srs -c /opt/srs/cluster/originA.conf

 


edgeA (三台都一样)

编写SRS边缘配置文件,从多个源站拉流,实现热备和负载均衡

 

vim  /opt/srs/cluster/edgeA.conf

 

# conf/origin.cluster.edge.conf
listen              1935;
max_connections     1000;
pid                 objs/edge.pid;
daemon              off;
srs_log_tank        console;
vhost __defaultVhost__ {
    cluster {
        mode            remote;
        origin          192.168.25.131:19350 192.168.25.132:19350 192.168.25.133:19350;
    }
}

 run:

docker run -itd  --restart=always  --net=host  \
  -v /opt/srs/cluster/originA.config:/opt/srs/cluster/originA.config \ 
registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 \ 
objs/srs -c /opt/srs/cluster/edge.conf

 

 

都启动后 test:

推流分别测试

 rtmp://192.168.25.131:19350/live/test
 rtmp://192.168.25.131:19350/live/test
rtmp://192.168.25.131:19350/live/test


拉流:
http://192.168.25.131:8080/live/test.flv
    webrtc://192.168.25.131:/live/test
是否播放正常

配置haproxy

 配置  

vim  /opt/docker/haproxy/srs/haproxy.cfg
global
        daemon
        # nbproc 1
        # pidfile /var/run/haproxy.pid
        # 工作目录
        chroot /usr/local/etc/haproxy

defaults
        log 127.0.0.1 local0 err #[err warning info debug]
        mode http                #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
        retries 2                #两次连接失败就认为是服务器不可用,也可以通过后面设置
        option redispatch        #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
        option abortonclose      #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
        option dontlognull       #日志中不记录负载均衡的心跳检测记录
        maxconn 4096             #默认的最大连接数
        timeout connect 5000ms   #连接超时
        timeout client 30000ms   #客户端超时
        timeout server 30000ms   #服务器超时
        #timeout check 2000      #=心跳检测超时

######## 监控界面配置 #################
listen admin_status
        # 监控界面访问信息
        bind 0.0.0.0:8888
        mode http
        # URI相对地址
        stats uri /dbs
        # 统计报告格式
        stats realm Global\ statistics
        # 登录账户信息
        stats auth admin:123456
########frontend配置##############

######## srs cluster 负载均衡配置 ###############
listen proxy-srs
        bind 0.0.0.0:19350
        mode tcp
        # 负载均衡算法
        # static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
        balance roundrobin
        # 日志格式
        option tcplog
        # 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
        # create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
        #option mysql-check user haproxy
         # 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
        server  SRS_ORG_1 192.168.25.131:19350 check weight 1 maxconn 2000
        server  SRS_ORG_2 192.168.25.132:19350 check weight 1 maxconn 2000
        server  SRS_ORG_3 192.168.25.133:19350 check weight 1 maxconn 2000
        # 使用keepalive检测死链
        # option tcpka
#########################################

配置解释:

    1. option mysql-check user haproxy | 用于心跳的mysql用户,请在mysql集群数据库进行创建该用户haproxy,读者可自己配置该用户名。在此处我们按照约定俗成定为haproxy。
    2. server SRS_ORG_1 192.168.25.131:19350 check weight 1 maxconn 2000 中
      check(心跳检测),weight 1(权重,只有当算法为static-rr才生效),maxconn 2000(最大连接数)

 参数可以参考:https://blog.csdn.net/inthat/article/details/88928749

使用Docker run启动容器:   新版本   docker pull haproxy:2.7.4

sudo docker run -d -p 19350:19350 -p 8888:8888 --name haproxy -v /opt/docker/haproxy/srs/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:1.9.11

 

重启haproxy成功后,可以用obs推流到 rtmp://haproxy_server_ip:1935/live/test 试下推流是否正常,如果ok,可以尝试把其中一台master停掉,看看是否有影响。

 

nginx:

关键是配置:

vim  /opt/docker/ngnix/srs/nginx.cfg
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    upstream srs{
        server 192.168.25.131:8080;
        server 192.168.25.132:8080;
server 192.168.25.133:8080; } server { listen
80; server_name localhost; location ~ /* { proxy_pass http://srs; add_header Cache-Control no-cache; add_header Access-Control-Allow-Origin *; } location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } include servers/*; }

 

run: 

docker run -itd --restart unless-stopped -p 7996:80 --name srs-nginx-container \
-v  /opt/docker/ngnix/srs/nginx.cfg :/etc/nginx/nginx.conf:ro  nginx:1.21.1

 

 

注:新增一个upstream用于指定要转发的edge服务器节点,然后在location ~ /* 这里proxy_pass 指定upstream的名字即可(location ~ /* 切记要写在 location / 前面)。这样配置后,访问 http://nginx_server_ip/live/test.flv 理论上就能转到后端的edge服务器。

 

posted on 2021-08-29 19:31  lshan  阅读(2049)  评论(1编辑  收藏  举报