官網部署文檔:https://github.com/ossrs/srs/wiki/v4_CN_SampleOriginCluster
參考:https://blog.csdn.net/sundehui01/article/details/106234778
單台服務器做直播風險太高,可以利用SRS的集群模式,示意圖如下
源站服務器集群:origin server cluster,
邊緣服務器集群:edge server cluster,可以用N台機器,從源站拉流,用於較大規模的實時播放。
源站前置負載均衡(硬件或軟件負載均衡都行),上圖中用haproxy來實現tcp的軟負載均衡。
邊緣服務器前置反向代理(比如:nginx),用於提供統一的播放地址,同時解決跨域問題,給客戶端拉流播放。
這樣架構的好處有以下:
1、不管是源站集群,還是連緣服務器集群,均可水平擴展,理論上沒有上限。
2、源站可以僅用較少的機器,比如2主2從,就能實現一個高可用且性能尚可的集群(如果業務量不大,連slave server都可以省掉)
3、邊緣服務器集群,可以根據實際用戶量隨時調整規模,另外hls切片,可以放在edge server上切片,減輕源站服務器壓力。
部署規划:
ip rtmp port http api port role 192.168.25.131 19350 9090 originA 192.168.25.132 19350 9090 originB 192.168.25.133 19350 9090 originC 192.168.25.131 1935 8080 80 edgeA 192.168.25.132 1935 8080 80 edgeB 192.168.25.133 1935 8080 80 edgeC
git 下載代碼,編譯:
git clone -b 4.0release https://gitee.com/ossrs/srs.git && cd srs/trunk && ./configure && make
啟動:
srs/trunk> ./objs/srs -c conf/srs.conf 指定配置文件
此處主要docker 版本
docker images:
sudo docker pull registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4
or
sudo docker pull ossrs/srs:4
originA
vim /opt/srs/cluster/originA.conf (3台都一樣)
# conf/origin.cluster.serverA.conf listen 19350; max_connections 1000; daemon off; srs_log_tank console; pid ./objs/origin.cluster.serverA.pid; http_api { enabled on; listen 9090; } vhost __defaultVhost__ { cluster { mode local; origin_cluster on; coworkers 192.168.25.131:9090 192.168.25.132:9090 192.168.25.133:9090; } }
run:
docker run -itd --restart=always --net=host \ -v /opt/srs/cluster/originA.config:/opt/srs/cluster/originA.config \ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 \ objs/srs -c /opt/srs/cluster/originA.conf
edgeA (三台都一樣)
編寫SRS邊緣配置文件,從多個源站拉流,實現熱備和負載均衡
vim /opt/srs/cluster/edgeA.conf
# conf/origin.cluster.edge.conf listen 1935; max_connections 1000; pid objs/edge.pid; daemon off; srs_log_tank console; vhost __defaultVhost__ { cluster { mode remote; origin 192.168.25.131:19350 192.168.25.132:19350 192.168.25.133:19350; } }
run:
docker run -itd --restart=always --net=host \ -v /opt/srs/cluster/originA.config:/opt/srs/cluster/originA.config \ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 \ objs/srs -c /opt/srs/cluster/edge.conf
都啟動后 test:
推流分別測試
rtmp://192.168.25.131:19350/live/test
rtmp://192.168.25.131:19350/live/test
rtmp://192.168.25.131:19350/live/test
拉流:
http://192.168.25.131:8080/live/test.flv
webrtc://192.168.25.131:/live/test
是否播放正常
配置haproxy
配置
vim /opt/docker/haproxy/srs/haproxy.cfg
global daemon # nbproc 1 # pidfile /var/run/haproxy.pid # 工作目錄 chroot /usr/local/etc/haproxy defaults log 127.0.0.1 local0 err #[err warning info debug] mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK retries 2 #兩次連接失敗就認為是服務器不可用,也可以通過后面設置 option redispatch #當serverId對應的服務器掛掉后,強制定向到其他健康的服務器 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接 option dontlognull #日志中不記錄負載均衡的心跳檢測記錄 maxconn 4096 #默認的最大連接數 timeout connect 5000ms #連接超時 timeout client 30000ms #客戶端超時 timeout server 30000ms #服務器超時 #timeout check 2000 #=心跳檢測超時 ######## 監控界面配置 ################# listen admin_status # 監控界面訪問信息 bind 0.0.0.0:8888 mode http # URI相對地址 stats uri /dbs # 統計報告格式 stats realm Global\ statistics # 登錄賬戶信息 stats auth admin:123456 ########frontend配置############## ######## srs cluster 負載均衡配置 ############### listen proxy-srs bind 0.0.0.0:19350 mode tcp # 負載均衡算法 # static-rr 權重, leastconn 最少連接, source 請求IP, 輪詢 roundrobin balance roundrobin # 日志格式 option tcplog # 在 mysql 創建一個沒有權限的haproxy用戶,密碼為空。 haproxy用戶 # create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES; option mysql-check user haproxy # 這里是容器中的IP地址,由於配置的是輪詢roundrobin,weight 權重其實沒有生效 server SRS_ORG_1 192.168.25.131:19350 check weight 1 maxconn 2000 server SRS_ORG_2 192.168.25.132:19350 check weight 1 maxconn 2000 server SRS_ORG_3 192.168.25.133:19350 check weight 1 maxconn 2000 # 使用keepalive檢測死鏈 # option tcpka #########################################
配置解釋:
- option mysql-check user haproxy | 用於心跳的mysql用戶,請在mysql集群數據庫進行創建該用戶haproxy,讀者可自己配置該用戶名。在此處我們按照約定俗成定為haproxy。
- server SRS_ORG_1 192.168.25.131:19350 check weight 1 maxconn 2000 中
check(心跳檢測),weight 1(權重,只有當算法為static-rr才生效),maxconn 2000(最大連接數)
參數可以參考:https://blog.csdn.net/inthat/article/details/88928749
使用Docker run啟動容器:
sudo docker run -d -p 19350:19350 -p 8888:8888 --name haproxy -v /opt/docker/haproxy/srs/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:1.9.11
重啟haproxy成功后,可以用obs推流到 rtmp://haproxy_server_ip:1935/live/test 試下推流是否正常,如果ok,可以嘗試把其中一台master停掉,看看是否有影響。
nginx:
關鍵是配置:
vim /opt/docker/ngnix/srs/nginx.cfg
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream srs{ server 192.168.25.131:8080; server 192.168.25.132:8080;
server 192.168.25.133:8080; } 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 html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } include servers/*; }
run:
docker run -itd --restart unless-stopped -p 7996:80 --name srs-nginx-container \ -v /opt/docker/ngnix/srs/nginx.cfg :/etc/nginx/nginx.conf:ro nginx:1.21.1
注:新增一個upstream用於指定要轉發的edge服務器節點,然后在location ~ /* 這里proxy_pass 指定upstream的名字即可(location ~ /* 切記要寫在 location / 前面)。這樣配置后,訪問 http://nginx_server_ip/live/test.flv 理論上就能轉到后端的edge服務器。