专栏首页菩提树下的杨过开源流媒体服务器SRS学习笔记(4) - Cluster集群方案

开源流媒体服务器SRS学习笔记(4) - Cluster集群方案

单台服务器做直播,总归有单点风险,利用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服务器。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • netty-socketio 示例代码

    socket.io是一个不错的websocket项目,github上有它的java实现:netty-socketio 及 示例项目 netty-socketio...

    菩提树下的杨过
  • ZooKeeper 笔记(1) 安装部署及hello world

    先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.org/doc/r3.4.6/zo...

    菩提树下的杨过
  • jboss eap 6.3 集群(cluster)-Session 复制(Replication)

    本文算是前一篇的后续,java web application中,难免会用到session,集群环境中apache会将http请求智能转发到其中某台jboss ...

    菩提树下的杨过
  • 基于windows的ngnix基础使用

      今天组长一大早心血来潮的跟我说,我希望我们小组电脑做web站点的服务器集群,你搞一搞,就用ngnix吧。

    陈珙
  • 把你的shiny网页工具部署在云服务器

    我们课题组有一份油菜的核心种质资源,前几年经重测序之后已经发表了。但是课题组后面很多的项目都基于这份核心种质资源,实验室成员常常需要检索分析某些基因的特定SNP...

    生信技能树
  • 随机采样方法——蒙特卡罗方法

    地址:http://www.cnblogs.com/pinard/p/6625739.html

    机器学习算法工程师
  • LinearAlgebra_1

    方程组的几何解释 linear equation row picture column picture 矩阵计算的两种方法 some questions 需要思...

    用户1147754
  • 使用libssh链接远程ssh服务器并执行command

    用户3765803
  • 有效实现多云成本管理的8个步骤

    众所周知,企业采用多云可以节省成本,并提高生产力。但是多云基础设施很复杂,具有多家云计算供应商提供的不同服务和条款。企业在采用多个云平台时,很容易在自己没有意识...

    静一
  • 玩了一下websocket 原

    domain0

扫码关注云+社区

领取腾讯云代金券