開源流媒體服務器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服務器。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM