单台服务器做直播,总归有单点风险,利用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:194/cnblogs/yjmyzz 或 rtmp://10.*.72.62:194/cnblogs/yjmyzz,如果推流不报错,说明master/slave工作正常

2、然后用vlc播放器,验证从slave/edge这些服务器上拉流(比如 rtmp://10.*.72.62:194/cnblogs/yjmyzz 或 rtmp://10.*.72.62:194/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:/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服务器。

开源流媒体服务器SRS学习笔记(4) - Cluster集群方案的更多相关文章

  1. 开源流媒体服务器SRS学习笔记(1) - 安装、推流、拉流

    SRS(Simple RTMP Server)  是国人写的一款非常优秀的开源流媒体服务器软件,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群. 一.安装 官网提供了3种安 ...

  2. 开源流媒体服务器SRS学习笔记(2) - rtmp / http-flv / hls 协议配置 及跨域问题

    对rtmp/http-flv/hls这三种协议不熟悉的同学,强烈建议先看看网友写的这篇文章科普下:理解RTMP.HttpFlv和HLS的正确姿势 .   srs可以同时支持这3种协议,只要修改conf ...

  3. 开源流媒体服务器SRS学习笔记(3) - HTTPCallback实现安全认证

    按上回继续,安全论证是绝大多数应用的基本要求,如果任何人都能无限制的发布/播放视频,显然不适合.SRS中可以通过HTTPCallback机制来实现,参考下面的配置: ... vhost __defau ...

  4. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  5. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  6. ZooKeeper学习笔记一:集群搭建

    作者:Grey 原文地址:ZooKeeper学习笔记一:集群搭建 说明 单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.6.3/zookeeperS ...

  7. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...

  8. Redis学习笔记~conf自主集群模式

    回到目录 Redis自主提供了集群模式,当然也只是比较简单的读写分离模式,或者叫主从模式,它在各个redis服务端自己做数据同步机制,当然就是将主服务端的信息同步到各个slave服务器上,在客户端集成 ...

  9. K8S学习笔记之CentOS7集群使用Chrony实现时间同步

    0x00 概述 容器集群对时间同步要求高,实际使用环境中必须确保集群中所有系统时间保持一致,openstack官方也推荐使用chrony代替ntp做时间同步. Chrony是一个开源的自由软件,像Ce ...

随机推荐

  1. day43 mysql 基本管理,[破解密码以及用户权限设置]以及慢日志查询配置

    配置文件:详细步骤, 1,找到mysql的安装包,然后打开后会看到一个my.ini命名的程序,把它拖拽到notepad++里面来打开,(应该是其他文本形式也可以打开,可以试一下),直接拖拽即可打开该文 ...

  2. ajax 的一些参数

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  3. vim 初识

    1. vim + 文件名.py  :可以创建并打开vim命令模式 2. 命令模式中:shift + z + z :退出vim 3. 命令模式中(h : 左 , l : 右 , j : 下 , k : ...

  4. Java代码混淆工具ProGuard

    目录 Java代码混淆工具ProGuard 简介 描述 作用的环境 功能 工作原理 下载 使用时注意事项 版本问题 JDK位数问题 Java的字节码验证问题 关于使用类似于Hibernate的对象关系 ...

  5. 在netcore中实现字段和属性注入

    简单来说,使用Ioc模式需要两个步骤,第一是把服务注册到容器中,第二是从容器中获取服务,我们一个一个讨论并演化.这里不会考虑使用如Autofac等第三方的容器来代替默认容器,只是提供一些简单实用的小方 ...

  6. Intellij IDEA更改项目优先编译顺序

    今天启动公司项目突然发现了一个问题,类里面明明有这个方法,但是无论怎样都不编译.(由于公司项目是二次开发,代码都是第三方写的,代码请勿仔细看,怕伤了你的眼睛.) 如图,找不到setJGMC方法. 但是 ...

  7. PTA 5-3 解题报告

    GitHub 问题描述 解题思路 代码 问题描述 5-3 计算平均值 (50分) 现在为若干组整数分别计算平均值. 已知这些整数的绝对值都小于100,每组整数的数量不少于1个,不大于20个. 输入格式 ...

  8. wget用法汇总

    wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能和特点: (1)支持断点下传功能:这一点,也是网络蚂蚁和F ...

  9. 潭州课堂25班:Ph201805201 django 项目 第二十五课 文章多级评论前后台实现 (课堂笔记)

    添加新闻评论功能 1.分析 业务处理流程: 判断前端传的新闻id是否为空,是否为整数.是否不存在 判断评论的内容是否为空 判断是否有父评论,父评论的id是否与新闻id匹配 判断用户是否登录 保存新闻评 ...

  10. 潭州课堂25班:Ph201805201 django 项目 第三课 码云注册,django项目 (课堂笔记)

    d码云注册,登录, 创建项目: 生成秘钥 想看秘钥: 添加公钥 复制 ssh 连接 通过  git clone <ssh> 连接 在服务器上创建 python3 虚拟环境, 创建项目  p ...