博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
开源流媒体服务器SRS学习笔记(4) - Cluster集群方案
阅读量:5076 次
发布时间:2019-06-12

本文共 5308 字,大约阅读时间需要 17 分钟。

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

 

源站服务器集群: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.pidsrs_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.pidsrs_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.pidsrs_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/srssudo ./objs/srs -c ./conf/slave.confsudo ./objs/srs -c ./conf/master.confsudo ./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/statsdefaults    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                 3000listen 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服务器。

 

转载于:https://www.cnblogs.com/yjmyzz/p/srs_study_4_cluster.html

你可能感兴趣的文章
添加按钮
查看>>
移动端页面开发适配 rem布局原理
查看>>
Ajax中文乱码问题解决方法(服务器端用servlet)
查看>>
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>