单台服务器做直播,总归有单点风险,利用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服务器。
https://www.cnblogs.com/yjmyzz/p/srs_study_4_cluster.html
最新评论: