• 开源流媒体服务器SRS学习笔记(4)


     单台服务器做直播,总归有单点风险,利用SRS的Forward机制 + Edge Server设计,可以很容易搭建一个大规模的高可用集群,示意图如下

    源站服务器集群:origin server cluster,可以借助forward机制,仅用少量的服务器,专用于处理推流请求。 

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

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

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

    这样架构的好处有以下:

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

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

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

    下面实战一把,因笔者手头资源有限,仅有2台虚拟机(cent os 7.x),只能在每个虚拟机上用不同的端口启动多个srs实例,模拟master/slave/edge server (注:大家根据实际情况,将下面的ip换成自己真实的ip地址)

    ip  rtmp port http api port http server port role
    10.*.72.62 1945 1995 8180 master
      1946 1996 8181 slave
      1947 1997 8182 edge
    10.*.62.116 1945 1995 8180 master
      1946 1996 8181 slave  
      1947 1997 8182 edge  

     master配置:/usr/local/srs/conf/master.conf

    listen              1945;
    max_connections     1000;
    pid                 ./objs/srs.master.pid
    srs_log_tank        file;
    srs_log_file        ./objs/srs.master.log;
    
    http_api {
        enabled         on;
        listen          1995;
    }
    
    http_server {
        enabled         on;
        listen          8180;
        dir             ./objs/nginx/html;
    }
    
    stats {
        network         0;
        disk            sda sdb xvda xvdb;
    }
    
    vhost __defaultVhost__ {
            forward        10.*.72.62:1946 10.*.62.116:1946;
    }
    

    注:最后一段的forward,表示将视频流转发到2台slave服务器

    slave配置:/usr/local/srs/conf/slave.conf

    listen              1946;
    max_connections     1000;
    pid                 ./objs/srs.slave.pid
    srs_log_tank        file;
    srs_log_file        ./objs/srs.slave.log;
    
    http_api {
        enabled         on;
        listen          1996;
    }
    
    http_server {
        enabled         on;
        listen          8181;
        dir             ./objs/nginx/html;
    }
    
    stats {
        network         0;
        disk            sda sdb xvda xvdb;
    }
    
    vhost __defaultVhost__ {
    }
    

    edge配置:/usr/local/srs/conf/edge.conf

    listen              1947;
    max_connections     1000;
    pid                 ./objs/srs.edge.pid
    srs_log_tank        file;
    srs_log_file        ./objs/srs.edge.log;
    
    http_api {
        enabled         on;
        listen          1997;
    }
    
    http_server {
        enabled         on;
        listen          8182;
        dir             ./objs/nginx/html;
    }
    
    stats {
        network         0;
        disk            sda sdb xvda xvdb;
    }
    
    vhost __defaultVhost__ {
    
        http_remux{
            enabled     on;
            mount       [vhost]/[app]/[stream].flv;
            hstrs       on;
        }
    
        hls{
            enabled         on;
            hls_path        ./objs/nginx/html;
            hls_fragment    10;
            hls_window      60;
        }
    
        mode            remote;
        origin          10.*.72.62:1945 10.*.62.116:1945 10.*.72.62:1946 10.*.62.116:1946;
    }
    

    注:最后一段的origin 将所有master、slave均做为视频源(origin server),如果播放时,edge发现自己机器上没有数据,会从origin配置的这些源站上去拉视频流。

      

    每台虚拟机上,依次启动:slave、master、edge(注:如果之前srs已在运行,先停掉原来的srs实例)

    cd /usr/local/srs
    sudo ./objs/srs -c ./conf/slave.conf
    sudo ./objs/srs -c ./conf/master.conf
    sudo ./objs/srs -c ./conf/edge.conf
    

    启动成功后,建议先验证下是否工作正常:

    1、可以用obs向每个master或slave推流试试,比如 rtmp://10.*.72.62:1945/cnblogs/yjmyzz 或 rtmp://10.*.72.62:1946/cnblogs/yjmyzz,如果推流不报错,说明master/slave工作正常

    2、然后用vlc播放器,验证从slave/edge这些服务器上拉流(比如 rtmp://10.*.72.62:1946/cnblogs/yjmyzz 或 rtmp://10.*.72.62:1947/cnblogs/yjmyzz,是否播放正常

    如果上述2个步骤均验证ok,接下来就是如何配置haproxy

    为了演示,可以在其中一台机器上安装haproxy

    1、yum install haproxy (非常简单)

    2、vim /etc/haproxy/haproxy.cfg (修改配置文件)

    global
        log         127.0.0.1 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
    
        stats socket /var/lib/haproxy/stats
    
    defaults
        mode                    tcp
        log                     global
        option                  tcplog
        option                  dontlognull
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000
    
    listen srs-cluster
        bind *:1935
        mode tcp
        balance roundrobin
        server master1 10.*.72.62:1945
        server master2 10.*.62.116:1945
    

    注:关键是最后一段,把本机1935端口,转发到后端2台master服务器的1945端口。

    3、sudo systemctl restart haproxy (重启haproxy) 

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

    最后是nginx出场了,ngnix的安装类似haproxy,yum install nginx 即可,关键是配置:

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        upstream srs{
    	    server 10.*.72.62:8182;
                server 10.*.62.116:8182;
        }
    
        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 /Users/jimmy/html;
                index index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        }
    
        include servers/*;
    }
    

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

  • 相关阅读:
    个人主页
    本周个人总结
    周个人总结
    排球比赛计分程序的典型用户和场景
    排球比赛计分规则功能说明书
    [黑马程序员]入学面试题!
    [黑马论坛]24期技术活动题目及答案!
    [黑马论坛]23期技术活动题目及答案!
    [黑马程序员]训练营入学考试题!
    [黑马程序员]基础测试题目!
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/srs_study_4_cluster.html
Copyright © 2020-2023  润新知