奔走相告(流媒體服務(wù)器怎么配置端口)流媒體服務(wù)器怎么用,SRS:流媒體服務(wù)器如何實現(xiàn)負載均衡,歲末年初,
目錄:
1.流媒體服務(wù)器有什么用
2.流媒體服務(wù)器什么意思
3.流媒體服務(wù)器工作原理
4.流媒體服務(wù)器原理
5.流媒體服務(wù)器是干嘛的
6.流媒體服務(wù)器原理和架構(gòu)解析
7.流媒體服務(wù)器搭建教程
8.流媒體服務(wù)器怎么連接
9.流媒體服務(wù)器是什么東西
10.流媒體服務(wù)器的作用是什么
1.流媒體服務(wù)器有什么用
作者:Winlin、Azusachino、Benjamin編輯:Alex

2.流媒體服務(wù)器什么意思
▲掃描圖中二維碼了解音視頻技術(shù)大會更多信息▲當我們的業(yè)務(wù)超過單臺流媒體服務(wù)器的承受能力,就會遇到負載均衡問題,一般我們會在集群中提供這種能力,但實際上集群并非是唯一的實現(xiàn)方式有時候負載均衡還會和服務(wù)發(fā)現(xiàn)等時髦詞匯聯(lián)系起來,而深圳南油女裝高端貨源app云服務(wù)的 LoadBalancer 無疑不可回避,因此,這個問題其實相當復雜,以至于大家會在多個場合詢問這個問題,我打算系統(tǒng)地闡述這個問題。
3.流媒體服務(wù)器工作原理
如果你已經(jīng)知道了以下問題的所有答案,并且深刻了解背后的原因,那么你可以不用看這篇文章了:SRS 是否需要 Nginx、F5 或 HAProxy 做流代理?不需要,完全不需要,這樣是完全誤解了流媒體的負載均衡。
4.流媒體服務(wù)器原理
而 HTTPS 我們卻建議這么做,同時為了減少對外服務(wù)的 IP 又建議用云 LoadBalancer如何發(fā)現(xiàn) SRS 邊緣節(jié)點?如何發(fā)現(xiàn)源站節(jié)點?對于邊緣,通常 DNS 和 HTTP-DNS 都可以;而源站是深圳南油女裝高端貨源app不應(yīng)該直接暴露給客戶端直接連接的。
5.流媒體服務(wù)器是干嘛的
WebRTC 在服務(wù)發(fā)現(xiàn)上有什么區(qū)別?由于 CPU 性能損耗更大,負載均衡的閾值更低;在單 PeerConnection 時流會動態(tài)變化,導致更難負載均衡;移動端 UDP 的切網(wǎng)和 IP 漂移,會引入更多問題。
6.流媒體服務(wù)器原理和架構(gòu)解析
DNS 和 HTTP-DNS 哪個更合適作為流媒體服務(wù)器的服務(wù)發(fā)現(xiàn)機制?肯定是 HTTP-DNS,因為流媒體服務(wù)器的負載變化,比 Web 服務(wù)器的變化更大,考慮新增 1K 的客戶端對于兩種不同服務(wù)器的負載影響。
7.流媒體服務(wù)器搭建教程
負載均衡是否只需要考慮如何降低系統(tǒng)負載?首要目標是考慮降低系統(tǒng)負載,深圳南油女裝高端貨源app或者防止系統(tǒng)過載導致質(zhì)量問題甚至崩潰;同時在同等負載時,也需要考慮就近服務(wù)和成本因素負載均衡是否只能靠增加一層服務(wù)器?一般大型的 CDN 分發(fā)系統(tǒng),明顯是分層的,無論是靜態(tài)的樹設(shè)計,還是動態(tài)的 MESH 設(shè)計,在流的傳輸上都是靠分層增加負載能力;同時,還能通過端口重用(REUSEPORT)方式,用多進程方式增加節(jié)點的負載而不會增加層。
8.流媒體服務(wù)器怎么連接
負載均衡是否只能使用集群方式實現(xiàn)?集群是基本的增加系統(tǒng)容量的方式,除此之外,也可以通過業(yè)務(wù)分離配合 Vhost 實現(xiàn)系統(tǒng)隔離,或者通過一致性 hash 來分流業(yè)務(wù)和用戶好吧,讓我們詳細聊聊負載和負載均衡。
9.流媒體服務(wù)器是什么東西
What 深圳南油女裝高端貨源appis Load?在解決系統(tǒng)均衡問題時,首先我們看看什么是負載?對于服務(wù)器來說,負載就是因為有客戶端的訪問,而導致的資源消耗上升當資源消耗出現(xiàn)嚴重不均衡,可能會導致服務(wù)不可用,比如 CPU 跑滿了,所有客戶端都會變得不正常。
10.流媒體服務(wù)器的作用是什么
對于流媒體服務(wù)器而言,就是流媒體客戶端導致的服務(wù)器資源消耗一般我們會從服務(wù)器資源消耗角度度量系統(tǒng)負載:CPU: 服務(wù)器消耗的 CPU,一般我們稱 CPU 消耗較多的為計算密集型場景,而把網(wǎng)絡(luò)帶寬消耗較多的稱為 IO 密集型場景。
直播場景一般屬于 IO 密集型場景,CPU 一般不會首先成為瓶頸;而在 RTC 中卻不是,RTC 是 IO 和計算都很密深圳南油女裝高端貨源app集,這是非常大的差異網(wǎng)絡(luò)帶寬: 傳輸流媒體時需要消耗網(wǎng)絡(luò)帶寬,也就是上文介紹的 IO 密集型場景。
流媒體肯定是 IO 密集型場景,所以帶寬一定是重要的瓶頸而有些場景比如 RTC 同時還是計算密集場景磁盤: 如果不需要錄制和支持 HLS,那么磁盤就不是重要的瓶頸,如果一定開啟錄制和 HLS,那么磁盤將變得非常關(guān)鍵,因為磁盤是最慢的。
當然由于現(xiàn)在內(nèi)存較多,所以一般我們采用掛內(nèi)存盤的方式避免這個問題內(nèi)存: 相對而言,內(nèi)存是流媒體服務(wù)器中消耗較少的資源,盡管做了不少 Cache,但是內(nèi)存一般還是不會首先達到瓶頸所以一般內(nèi)存也會在流媒體服務(wù)器中大量用作 Cache,來交換其他的資源負載,比如 SRS 在深圳南油女裝高端貨源app直播 CPU 優(yōu)化時,用 writev 緩存和發(fā)送大量數(shù)據(jù),就是用高內(nèi)存換得 CPU 降低的策略。
當負載過高,會有什么問題?負載過高會導致系統(tǒng)直接出現(xiàn)問題,比如延遲增大,卡頓,甚至不可用而這些負載的過載,一般都會有連鎖反應(yīng)比如:CPU: CPU 過高會引起連鎖反應(yīng),這時候意味著系統(tǒng)無法支持這么多客戶端,那么會導致隊列堆積,從而引起內(nèi)存大量消耗;同時網(wǎng)絡(luò)吞吐也跟不上,因為客戶端無法收到自己需要的數(shù)據(jù),出現(xiàn)延遲增大和卡頓;這些問題反而引起 CPU 更高,直到系統(tǒng)崩潰。
網(wǎng)絡(luò)帶寬: 若超過系統(tǒng)的限定帶寬,比如網(wǎng)卡的限制,或者系統(tǒng)隊列的限制,那么會導致所有用戶都拿不到自己需要的數(shù)據(jù),出現(xiàn)卡頓現(xiàn)象另外也會深圳南油女裝高端貨源app引起隊列增大,而處理堆積隊列,一般需要消耗 CPU,所以也會導致 CPU 上升。
磁盤: 若超過磁盤負載,可能會導致寫入操作掛起而在同步寫入的服務(wù)器,會導致流無法正常傳輸,日志堆積在異步寫入的服務(wù)器,會導致異步隊列堆積注意目前 SRS 是同步寫入,正在進行多線程異步寫入內(nèi)存: 超過內(nèi)存會 OOM,直接干掉服務(wù)器進程。
一般內(nèi)存主要是泄露導致的緩慢上漲,特別是在流很多時,SRS 為了簡化問題,沒有清理和刪除流,所以若流極其多,那么內(nèi)存的持續(xù)上漲是需要關(guān)注的由此可見,系統(tǒng)的負載,首先需要被準確度量,也就是關(guān)注的是過載或超載(Overload)情況,這個問題也需要詳細說明。
What is Overloa深圳南油女裝高端貨源appd?超過系統(tǒng)負載就是超載或過載(Overload),這看起來是個簡單的問題,但實際上卻并不簡單,比如:CPU 是否超過 100% 就是過載?不對,因為一般服務(wù)器會有多個 CPU,也就是 8 個 CPU 的服務(wù)器,實際上能達到 800%。
那 CPU 是否不超過總 CPU 使用率,比如 8CPU 的服務(wù)器不超過 800% 就不會過載?不對,因為流媒體服務(wù)器不一定能用多核,比如 SRS 就是單核,也就是它最多跑 100%那是否 SRS 不超過 100% 使用率,就不會過載?不對,因為其他的進程可能也在消耗,不能只看 SRS 的 CPU 消耗。
因此,對于 CPU 來說,知道流媒體服務(wù)器能消耗多少 CP深圳南油女裝高端貨源appU,獲取流媒體服務(wù)器的 CPU 消耗,才能準確定義過載:系統(tǒng)總 CPU,超過 80% 認為過載,比如 8CPU 的服務(wù)器,總 CPU 超過 640% 就認為過載,一般系統(tǒng)的 load 值也升很高,代表系統(tǒng)很繁忙。
SRS 每個進程的 CPU,超過 80% 認為過載,比如 8CPU 的服務(wù)器總 CPU 只有 120%,但 SRS 的進程占用 80%,其他占用 40%,那么此時也是過載網(wǎng)絡(luò)帶寬,一般是根據(jù)以下幾個指標判斷是否過載,流媒體一般和流的碼率 Kbps 或 Mpbs 有關(guān),代表這個流每秒是多少數(shù)據(jù)傳輸:。
是否超過服務(wù)器出口帶寬,比如云服務(wù)器公網(wǎng)出口是 10Mbps,那么如果平均碼率是 1Mb深圳南油女裝高端貨源appps 的直播流,超過 10 個客戶端就過載了如果 100 個客戶端都來推拉流,那么每個客戶端只能傳輸 100Kbps 的數(shù)據(jù),當然會造成嚴重卡頓。
是否超過內(nèi)核的隊列,在 UDP 中,一般系統(tǒng)默認的隊列大小只有 256KB,而流媒體中的包數(shù)目和字節(jié),在流較多時遠遠超過了隊列長度,會導致沒有超過服務(wù)器帶寬但是出現(xiàn)丟包情況,具體參考《SRS 性能 (CPU)、內(nèi)存優(yōu)化工具用法》(https://www.jianshu.com/p/6d4a89359352)這部分內(nèi)容。
是否超過客戶端的網(wǎng)絡(luò)限制,有時候某些客戶端的網(wǎng)絡(luò)很差,出現(xiàn)客戶端的網(wǎng)絡(luò)過載特別是直播推流時,需要重點關(guān)注主播上行的網(wǎng)絡(luò),沒經(jīng)驗的主播會深圳南油女裝高端貨源app出現(xiàn)弱網(wǎng)等,導致所有人卡頓磁盤,主要涉及的是流的錄制、日志切割以及慢磁盤導致的 STW 問題:。
若需要錄制的流較多,磁盤作為最慢的設(shè)備,會明顯成為瓶頸一般在系統(tǒng)設(shè)計時,就需要避免這種情況,比如 64GB 內(nèi)存的服務(wù)器,可以分 32GB 的內(nèi)存盤,給流媒體服務(wù)器寫臨時文件或者使用較小的內(nèi)存盤,用外部的程序比如 node.js,開啟多線程后,將文件拷貝到存儲或發(fā)送到云存儲,可以參考 srs-cloud(https://github.com/ossrs/srs-cloud)的最佳實踐。
服務(wù)器的日志,在一些異常情況下,可能會造成大量寫入,另外如果持續(xù)累計不切割和清理,會導致日志文件越來越大,最終寫滿磁深圳南油女裝高端貨源app盤SRS 支持 logrotate,另外 docker 一般也可以配置 logrotate,通常會將日志做提取后(日志少可以直接采集原始日志),傳輸?shù)皆频娜罩痉?wù)做分析,本地只需要存儲短時間比如 15 天日志。
STW 問題,寫磁盤是阻塞操作,特別是掛載的網(wǎng)絡(luò)磁盤(比如 NAS),掛載到本地文件系統(tǒng),而服務(wù)器在調(diào)用 write 寫入數(shù)據(jù)時,實際上可能有非常多的網(wǎng)絡(luò)操作,那么這種其實會更消耗時間SRS 目前應(yīng)該完全避免掛載網(wǎng)絡(luò)磁盤,因為每次阻塞都會導致整個服務(wù)器 STW(世界暫停)不能處理其他請求。
內(nèi)存主要是涉及泄露和緩存問題,主要的策略是監(jiān)控系統(tǒng)整體的內(nèi)存,相對比較簡單Special for M深圳南油女裝高端貨源appedia Server除了一般的資源消耗,在流媒體服務(wù)器中,還有一些額外因素會影響到負載或者負載均衡,包括:。
長連接: 直播和 WebRTC 的流都是長時間,最長的直播可能超過 2 天,而會議開幾個小時也不是難事因此,流媒體服務(wù)器的負載是具有長連接特性,這會對負載均衡造成很大的困擾,比如輪詢調(diào)度策略可能不是最有效的。
有狀態(tài): 流媒體服務(wù)器和客戶端的交互比較多,中間保存了一些狀態(tài),這導致負載均衡服務(wù)器無法直接在服務(wù)出現(xiàn)問題時,把請求直接給一臺新的服務(wù)器處理,甚至都不是一個請求,這個問題在 WebRTC 中尤其明顯,DTLS 和 SRTP 加密的這些狀態(tài),使得不能隨意切換服務(wù)器。
相關(guān)性: 兩個 W深圳南油女裝高端貨源appeb 請求之間是沒有關(guān)聯(lián)的,一條失敗并不會影響另外一條而在直播中,推流能影響所有的播放;在 WebRTC 中,只要有一個人拉流失敗或傳輸質(zhì)量太差,盡管其他流都表現(xiàn)良好,但這個會議可能還是開不下去。
這些問題當然不完全是負載和負載均衡問題,比如 WebRTC 支持的 SVC 和 Simulcast 功能,目的就是為了解決某些弱客戶端的問題有些問題是可以通過客戶端的失敗重試解決,比如高負載時的連接遷移,服務(wù)器可以強制關(guān)閉,客戶端重試遷移到下一個服務(wù)器。
還有一種傾向,就是避免流媒體服務(wù),而是用 HLS/DASH/CMAF 等切片,這就變成了一個 Web 服務(wù)器,上面所有的問題就突然沒有了但是,切片協(xié)議深圳南油女裝高端貨源app實際上只能做到 3 秒,或者比較常見的 5 秒以上的延遲場景,而在 1 到 3 秒的直播延遲,或者 500ms 到 1 秒的低延遲直播,以及 200ms 到 500ms 的 RTC 通話,以及 100ms 之內(nèi)的控制類場景,永遠都不能指望切片服務(wù)器,這些場景只能使用流媒體服務(wù)器實現(xiàn),不管里面?zhèn)鬏數(shù)氖?TCP 的流,還是 UDP 的包。
我們在系統(tǒng)設(shè)計時,需要考慮這些問題,例如 WebRTC 應(yīng)該盡量避免流和房間耦合,也就是一個房間的流一定需要分布到多個服務(wù)器上,而不是限制在一臺服務(wù)器這些業(yè)務(wù)上的限制越多,對于負載均衡越不利SRS Overload。
現(xiàn)在特別說明 SRS 的負載和過載情況:SRS 深圳南油女裝高端貨源app的進程: 若 CPU 超過 100%,則過載SRS 是單線程設(shè)計,無法使用多個 CPU 的能力(這個后面我會詳細展開講講)網(wǎng)絡(luò)帶寬: 一般是最快達到過載的資源,比如直播中達到 1Gbps 吞吐帶寬時可能 CPU 還很空閑,RTC 由于同時是計算密集型,稍微有些差異。
磁盤: 除了非常少的路數(shù)的流的錄制,一般需要規(guī)避磁盤問題,掛載內(nèi)存盤,或者降低每個 SRS 處理的流的路數(shù)參考 srs-cloud (https://github.com/ossrs/srs-cloud) 的最佳實踐。
內(nèi)存: 一般是使用較少的資源,在流路數(shù)特別特別多,比如監(jiān)控場景不斷推流和斷開的場景,需要持續(xù)關(guān)注 SRS 的內(nèi)存上漲深圳南油女裝高端貨源app這個問題可以通過 Gracefully Quit (https://github.com/ossrs/srs/issues/413#issuecomment-917771521) 規(guī)避。
特別說明一下 SRS 單線程的問題,這其實是個選擇,沒有免費的性能優(yōu)化,多線程當然能提升處理能力,同時是以犧牲系統(tǒng)的復雜度為代價,同時也很難評估系統(tǒng)的過載,比如 8 核的多線程的流媒體服務(wù)器 CPU 多少算是過載?640%?不對,因為可能每個線程是不均勻的,要實現(xiàn)線程均勻就要做線程的負載調(diào)度,這又是更復雜的問題。
目前 SRS 的單線程,能適應(yīng)絕大多數(shù)場景對于直播來說,Edge 可以使用多進程 REUSEPORT深圳南油女裝高端貨源app 方式,偵聽在同樣端口,實現(xiàn)消耗多核;RTC 可以通過一定數(shù)量的端口;或者在云原生場景,使用 docker 跑 SRS,可以起多個 K8s 的 Pod,這些都是可選的更容易的方案。
Note: 除非是對成本非常敏感的云服務(wù),那么肯定可以自己定制,可以付出這個復雜性的代價了據(jù)我所知,幾個知名的云廠商,基于 SRS 實現(xiàn)了多線程版本我們正在一起把多線程能力開源出來,在可以接受的復雜度范圍提升系統(tǒng)負載能力,詳細請參考 https://github.com/ossrs/srs/issues/2188。
我們了解了流媒體服務(wù)器的這些負載,接下來該考慮如何分擔這些負載了Round Robin:Simple a深圳南油女裝高端貨源appnd RobustRound Robin 是非常簡單的負載均衡策略:每次客戶端請求服務(wù)時,調(diào)度器從服務(wù)器列表中找到下一個服務(wù)器給客戶端,非常簡單:。
server = servers[pos++ % servers.length()]如果每個請求是比較均衡的,比如 Web 請求一般很短時間就完成了,那么這種策略是比較有效的這樣新增和刪除服務(wù)器,上線和下線,升級和隔離,都非常好操作。
流媒體長連接的特點導致輪詢的策略并不好用,因為有些請求可能會比較久,有些比較短,這樣會造成負載不均衡當然,如果就只有少量的請求,這個策略依然非常好用SRS 的 Edge 邊緣集群中,在尋找上游 Edge 服務(wù)器時,使用深圳南油女裝高端貨源app的也是簡單的 Round Robin 方式,這是假設(shè)流的路數(shù)和服務(wù)時間比較均衡,在開源中是比較合適的策略。
本質(zhì)上,這就是上游 Edge 服務(wù)器的負載均衡策略,相當于是解決了總是回源到一臺服務(wù)器的過載問題如下圖所示:

源站集群中,第一次推流時,Edge 也會選擇一臺 Origin 服務(wù)器,使用的也是 Round Robin 策略這本質(zhì)上就是 Origin 服務(wù)器的負載均衡策略,解決的是 Origin 服務(wù)器過載問題如下圖所示:。

在實際業(yè)務(wù)中,一般并不會使用純粹的 Round Robin,而是有個調(diào)度服務(wù),會收集這些服務(wù)器的數(shù)據(jù),評估負載,給出負載比較低或者質(zhì)量高的服務(wù)器。如下圖所示:

如何解決 Ed深圳南油女裝高端貨源appge 的負載均衡問題呢?依靠的是 Frontend Load Balance 策略,也就是前端接入側(cè)的系統(tǒng),我們下面講常用的方式Frontend Load Balancer: DNS or HTTP DNS。
我們在 Round Robin 中重點介紹了服務(wù)內(nèi)部的負載均衡,而直接對客戶端提供服務(wù)的服務(wù)器,一般叫做 Frontend Load Balancer,情況會有點不太一樣:若整個流媒體服務(wù)節(jié)點較少,而且是中心化部署,那么也可以用 Round Robin 的方式。
在 DNS 中設(shè)置多個解析 IP,或者 HTTP DNS 返回時隨機選擇節(jié)點,或者選擇相對較輕的負載的機器,也是可行的方案在較多節(jié)深圳南油女裝高端貨源app點,特別是分布式部署的節(jié)點中,是不可能選擇 Round Robin 的方案,因為除了負載之外,還需要考慮用戶的地理位置,一般來說會選擇分配 “就近” 的節(jié)點。
同樣 DNS 和 HTTP DNS 也能做到這點,一般是根據(jù)用戶的出口 IP,從 IP 庫中獲取地理位置信息其實 DNS 和 HTTP DNS 在調(diào)度能力上沒有區(qū)別,甚至很多 DNS 和 HTTP DNS 系統(tǒng)的決策系統(tǒng)都是同一個,因為它們要解決的問題是一樣的:如何根據(jù)用戶的 IP,或者其他的信息(比如 RTT 或探測的數(shù)據(jù)),分配比較合適的節(jié)點(一般是就近,但也要考慮成本)。
DNS 是互聯(lián)網(wǎng)的基礎(chǔ),可以認為它就是一個名字翻譯器,比如我們深圳南油女裝高端貨源app在 PING SRS 的服務(wù)器時,會將 ossrs.net 解析成 IP 地址 182.92.233.108,這里完全沒有負載均衡的能力,因為就一臺服務(wù)器而已,DNS 在這里只是名字解析:
ping ossrs.net PING ossrs.net (182.92.233.108): 56 data bytes 64 bytes from 182.92.233.108: icmp_seq=0 ttl=64 time=24.350 ms
而 DNS 在流媒體負載均衡時的作用,其實是會根據(jù)客戶端的 IP,返回不同服務(wù)器的 IP,而 DNS 系統(tǒng)本身也是分布式的,在播放器的 /etc/hosts 文件中深圳南油女裝高端貨源app就可以記錄 DNS 的信息,如果沒有就會在 LocalDNS(一般在系統(tǒng)中配置或自動獲?。┎樵冞@個名字的 IP。
這意味著 DNS 能抗住非常大的并發(fā),因為并不是一臺中心化的 DNS 服務(wù)器在提供解析服務(wù),而是分布式的系統(tǒng)這就是為何新建解析時會有個 TTL(過期時間),修改解析記錄后,在這個時間之后才會生效而實際上,這完全取決于各個 DNS 服務(wù)器自己的策略,而且還有 DNS 劫持和篡改等操作,所以有時候也會造成負載不均衡。
因此 HTTP DNS 就出來了,可以認為 DNS 是互聯(lián)網(wǎng)的運營商提供的網(wǎng)絡(luò)基礎(chǔ)服務(wù),而 HTTP DNS 則可以由流媒體平臺也就是各位自己來實現(xiàn),就是一個名字服務(wù),也可以深圳南油女裝高端貨源app調(diào)用一個 HTTP API 來解析,比如:
curl http://your-http-dns-service/resolve?domain=ossrs.net {["182.92.233.108"]}由于這個服務(wù)是自己提供的,可以自己決定什么時候更新該名字代表的含義,當然可以做到更精確的負載,也可以用 HTTPS 防止篡改和劫持。
Note: HTTP-DNS 的這個 your-http-dns-service 接入域名,則可以用一組 IP,或者用 DNS 域名,因為它只有少數(shù)節(jié)點,所以它的負載相對比較好均衡Load Balance by Vhost。
SRS 支持 Vhost,一般是 CDN 平深圳南油女裝高端貨源app臺用來隔離多個客戶,每個客戶可以有自己的 domain 域名,比如:vhost customer.a { } vhost customer.b { }如果用戶推流到同一個 IP 的服務(wù)器,但是用不同的 Vhost,它們也是不同的流,播放時地址不同也是不同的流,例如:
? rtmp://ip/live/livestream?vhost=customer.a? rtmp://ip/live/livestream?vhost=customer.bNote:當然,可以直接用 DNS 系統(tǒng),將 IP 映射到不同的域名,這樣就可以直接在 URL 中用域名代替 IP 了。
其實 Vhost 還可以用作多源站的負深圳南油女裝高端貨源app載均衡,因為在 Edge 中,可以將不同的客戶分流到不同的源站,這樣可以不用源站集群也可以擴展源站的能力:vhost customer.a { cluster { mode remote; origin server.a; } } vhost customer.b { cluster { mode remote; origin server.a; } }
那么不同的 Vhost 實際上共享了 Edge 節(jié)點,但是 Upstream 和 Origin 可以是隔離的當然也可以配合 Origin Cluster 來做,這時候就是多個源站中心,和 Cons深圳南油女裝高端貨源appistent Hash 要實現(xiàn)的目標有點像了。
Consistent Hash在 Vhost 隔離用戶的場景下,會導致配置文件比較復雜,還有一種更簡單的策略,也可以實現(xiàn)類似的能力,那就是一致性 Hash(Consistent Hash)比如,可以根據(jù)用戶請求的 Stream 的 URL 做 Hash,決定回源到哪個 Upstream 或 Origin,這樣就一樣可以實現(xiàn)同樣的隔離和降低負載。
實際應(yīng)用中,已經(jīng)有這種方案在線上提供服務(wù),所以方案上肯定是可行的當然,SRS 沒有實現(xiàn)這個能力,需要自己碼代碼實現(xiàn)其實 Vhost 或者 Consistent Hash,也可以配合 Redirect 來完成更深圳南油女裝高端貨源app復雜的負載均衡。
HTTP 302: Redirect302 是重定向(Redirect),實際上也可以用作負載均衡,比如通過調(diào)度訪問到服務(wù)器,但是服務(wù)器發(fā)現(xiàn)自己的負載過高,那么就給定向到另外一臺服務(wù)器,如下圖所示:

Note: 除了 HTTP 302,實際上 RTMP 也支持 302,SRS 的源站集群就是使用這個方式實現(xiàn)的當然這里 302 主要用于流的服務(wù)發(fā)現(xiàn),而不是用于負載均衡既然 RTMP 也支持 302,那么在服務(wù)內(nèi)部,完全可以使用 302 來實現(xiàn)負載的再均衡。
若某個 Upstream 的負載過高,就將流調(diào)度到其他的節(jié)點,并且可以做多次 302 跳轉(zhuǎn)一般在 Frontend Server深圳南油女裝高端貨源app 中,只有 HTTP 流才支持 302,比如 HTTP-FLV 或者 HLS。
而 RTMP 是需要客戶端支持 302,這個一般支持得很少,所以不能使用另外,基于 UDP 的流媒體協(xié)議,也有支持 302 的,比如 RTMFP,一個 Adobe 設(shè)計的 Flash 的 P2P 的協(xié)議,也支持 302。
當然目前用得很少了WebRTC 目前沒有 302 的機制,一般是依靠 Frontend Server 的代理,實現(xiàn)后續(xù)服務(wù)器的負載均衡而 QUIC 作為未來 HTTP3 的標準,肯定是會支持 302 這種基本能力的。
而 WebRTC 逐漸也會支持 WebTransport(基于 QUIC),因此這個能深圳南油女裝高端貨源app力在未來也會具備SRS: Edge ClusterSRS Edge 本質(zhì)上就是 Frontend Server,它可以解決以下問題:
直播的播放能力擴展問題,比如支持 10 萬人觀看,可以水平擴展 Edge Server解決就近服務(wù)的問題,和 CDN 起到的作用是一樣的,一般會選擇和用戶所在的城市部署Edge 使用 Round Robin 方式連接到 Upstream Edge,實現(xiàn) Upstream 的負載均衡。
Edge 本身的負載均衡,是依靠調(diào)度系統(tǒng),比如 DNS 或 HTTP-DNS。如下圖所示:

特別說明:Edge 是直播流的邊緣集群,支持 RTMP 和 HTTP-FLV 協(xié)議Edge 不深圳南油女裝高端貨源app支持切片比如 HLS 或 DASH,切片協(xié)議使用 Nginx 或 ATS 分發(fā)不支持 WebRTC,WebRTC 有自己的集群機制。
由于 Edge 本身就是 Frontend Server,因此一般不需要為了增加系統(tǒng)容量,再在前面掛 Nginx 或 LB,因為 Edge 本身就是為了解決容量問題,而且只有 Edge 能解決合并回源的問題。
Note:合并回源,指的是同一個流只會回源一次,比如有 1000 個播放器連接到了 Edge,Edge 只會從 Upstream 獲取一路流,而不會獲取 1000 路流,這和透明 Proxy 是不同的當然,有時候還是需要前面掛 Nginx 或 LB,比如:
為了深圳南油女裝高端貨源app支持 HTTPS-FLV 或 HTTPS-API,Nginx 支持得更好,而且 HTTP/2 也支持減少對外的 IP,比如多個服務(wù)器對外使用一個 IP,這時候就需要有一臺專門的 LB 代理到后端多臺 Edge。
在云上部署,只能通過 LB 提供服務(wù),這是云產(chǎn)品的設(shè)計導致的,比如 K8s 的 Service除此之外,不應(yīng)該在 Edge 前面再掛其他的服務(wù)器,應(yīng)該直接由 Edge 提供服務(wù)SRS: Origin Cluster。
和 Edge 邊緣集群不同,SRS 源站集群主要是為了解決源站擴展能力:如果有海量的流,比如 1 萬路流,那么單個源站是扛不住的,需要多個源站形成集群解決源站的單點問題,比如深圳南油女裝高端貨源app多區(qū)域部署,出現(xiàn)問題時自動切換到其他區(qū)域。
切片協(xié)議的性能問題,由于寫入磁盤損耗性能較大,除了內(nèi)存盤,還可以用多個源站降低負載SRS 源站集群是不建議直接對外提供服務(wù),而是依靠 Edge 對外服務(wù),因為使用了兩個簡單的技術(shù):流發(fā)現(xiàn):源站集群會訪問一個 HTTP 地址查詢流,默認是配置為其他源站,也可以配置為一個專門的服務(wù)。
RTMP 302 重定向,若發(fā)現(xiàn)流不在本源站,那么會定向到其他源站Note: 其實 Edge 在回源前也可以先訪問流查詢服務(wù),找到有流的源站后再發(fā)起連接但是有可能流會切走,所以還是需要一個重新定位流的過程。
這個過程非常簡單,如下圖所示:

由于流始終只在一個源站上面,因此生成 HL深圳南油女裝高端貨源appS 切片時也會由一個源站生成,不需要做同步一般使用共享存儲的方式,或者使用 on_hls 將切片發(fā)送到云存儲Note: 還有一種方式,使用雙流熱備,一般是兩個不同的流,在內(nèi)部實現(xiàn)備份。
這種一般需要自己實現(xiàn),而且對于 HLS、SRT 和 WebRTC 都很復雜,SRS 沒有支持也不展開了從負載均衡角度看源站集群,實際上是調(diào)度器實現(xiàn)的負載均衡,比如 Edge 回源時若使用 Round Robin,或者查詢專門的服務(wù)應(yīng)該往哪個源站推流,甚至當源站的負載過高,可以主動斷開流,讓流重推實現(xiàn)負載的重新均衡。
SRS: WebRTC CasecadeWebRTC 的負載只在源站,而不存在邊緣的負載均衡,因為 深圳南油女裝高端貨源appWebRTC 的推流和觀看幾乎是對等的,而不是直播這種一對萬級別的不對等換句話說,邊緣是為了解決海量觀看問題,而推流和觀看差不多時就不需要邊緣做負載均衡(直播可以用來做接入和跳轉(zhuǎn))。
WebRTC 由于沒有實現(xiàn) 302 跳轉(zhuǎn),因此接入都沒有必要邊緣做負載均衡了比如在一個 Load Balance,也就是一個 VIP 后面有 10 臺 SRS 源站,返回給客戶端的都是同一個 VIP,那么客戶端最終會落到哪個 SRS 源站呢?完全就是看 Load Balance 的策略,這時候并不能像直播一樣加一個邊緣實現(xiàn) RTMP 302 的跳轉(zhuǎn)。
因此,WebRTC 的負載均衡,就完全不是 Edge 能解決的,它深圳南油女裝高端貨源app本來就是依靠源站集群一般在 RTC 中,這種叫做 Casecade(級聯(lián)),也就是它們是平等關(guān)系,只是一級一級的路由一樣地連接起來,增加負載能力。
如下圖所示:

這里和 OriginCluster 有本質(zhì)的不同,因為 OriginCluster 之間并沒有媒體傳輸,而是使用 RTMP 302 讓 Edge 跳轉(zhuǎn)到指定的源站,因為源站的負載是可控的,它最多只有有限個 Edge 來回源取流。
而 OriginCluster 不適合 WebRTC,因為客戶端需要直接連接到源站,這時候源站的負載是不可控的比如在 100 人的會議中,每個流會有 100 個人訂閱,這時候需要將每個用戶分散到不同的源站上,和每個深圳南油女裝高端貨源app源站建立連接,實現(xiàn)推流和獲取其他人的流。
Note: 這個例子很罕見,一般 100 人互動的會議,會使用 MCU 模式,由服務(wù)器合并成一路流,或者選擇性的轉(zhuǎn)發(fā)幾路流,服務(wù)器內(nèi)部的邏輯是非常復雜的實際上考慮 WebRTC 的常用場景,就是一對一通話,基本上占了 80% 左右的比例。
那么這時候每個人都推一路流,播放一路流,是屬于典型的流非常多的情況,那么用戶可以完全連接到一個就近的 Origin,而一般用戶的地理位置并不相同,比如在不同的地區(qū)或國家,那么源站之間級聯(lián),可以實現(xiàn)提高通話質(zhì)量的效果。
在源站級聯(lián)的結(jié)構(gòu)下,用戶接入使用 DNS 或 HTTP DNS 協(xié)議訪問 HTTPS API,而在 SDP深圳南油女裝高端貨源app 中返回源站的 IP,因此這就是一次負載均衡的機會,可以返回離用戶比較接近而且負載較低的源站此外,多個源站如何級聯(lián),若大家地區(qū)差不多,可以調(diào)度到一臺源站避免級聯(lián),這可以節(jié)約內(nèi)部的傳輸帶寬(在大量的同地區(qū)一對一通話時很值得優(yōu)化),同時也增加了負載的不可調(diào)度性,特別是它們會演變成一個多人會議。
因此,在會議中,區(qū)分一對一的會議,和多人會議,或者限制會議人數(shù),對于負載均衡實際上是非常有幫助的如果能提前知道這是一對一會議,那么就更容易調(diào)度和負載均衡很可惜的是,產(chǎn)品經(jīng)理一般對這個不感興趣Remark: 特別說明,SRS 的級聯(lián)功能還沒有實現(xiàn),只是實現(xiàn)了原型,還沒有提交到開源倉庫。
TURN, ICE, QU深圳南油女裝高端貨源appIC, etc特別補充一下 WebRTC 相關(guān)的協(xié)議,比如 TURN、ICE 和 QUIC 等ICE 其實不算一個傳輸協(xié)議,它更像是標識協(xié)議,一般指 Binding Request 和 Response,會在里面帶有 IP 和優(yōu)先級信息,來標識地址和信道的信息,用于多條信道的選擇,比如 4G 和 WiFi 都很好時優(yōu)先選誰。
還會用作會話的心跳,客戶端會一直發(fā)送這個消息因此 ICE 對于負載均衡沒有作用,但是它可以用來標識會話,和 QUIC 的 ConnectionID 作用類似,因此在經(jīng)過 Load Balance 時可以起到識別會話的作用,特別是客戶端的網(wǎng)絡(luò)切換時。
而 TURN 協(xié)議其實是對深圳南油女裝高端貨源app Cloud Native 非常不友好的協(xié)議,因為它是需要分配一系列的端口,用端口來區(qū)分用戶,這種是在私有網(wǎng)絡(luò)中的做法,假設(shè)端口無限,而公有云上端口往往是受限的,比如需要經(jīng)過 Load Balance 這個系統(tǒng)時,端口就是有限的。
Note: 當然 TURN 也可以復用一個端口,而不真正分配端口,這限制了不能使用 TURN 直接通信而是經(jīng)過 SFU,所以對于 SRS 也沒有問題TURN 的真正用處是降級到 TCP 協(xié)議,因為有些企業(yè)的防火墻不支持 UDP,所以只能使用 TCP,而客戶端需要使用 TURN 的 TCP 功能。
當然了,也可以直接使用 TCP 的 host,比如 mediasoup 就深圳南油女裝高端貨源app已經(jīng)支持了,而 SRS 還沒有支持QUIC 比較友好的是它的 0RTT 連接,也就是客戶端會緩存 SSL 的類似 ticket 的東西,可以跳過握手。
對于負載均衡,QUIC 更有效的是它有 ConnectionID,那么經(jīng)過 LoadBalance 時,盡管客戶端改變了地址和網(wǎng)絡(luò),Load Balance 還是能知道后端哪個服務(wù)來處理它,當然這其實讓服務(wù)器的負載更難以轉(zhuǎn)移了。
其實 WebRTC 這么復雜的一套協(xié)議和系統(tǒng),講起來都是亂糟糟的,很糟心由于 100ms 級別的延遲是硬指標,所以必須使用 UDP 和一套復雜的擁塞控制協(xié)議,再加上安全和加密也是基本能力,也有人宣稱 Cloud Nativ深圳南油女裝高端貨源appe 的 RTC 才是未來,引入了端口復用和負載均衡,以及長連接和重啟升級等問題,還有那改得天翻地覆的結(jié)構(gòu),以及來攪局的 HTTP3 和 QUIC……。
或許對于 WebRTC 的負載均衡,有一句話是最適用的:世上無難事,只要肯放棄SRS: Prometheus Exporter所有負載均衡的前提,就是能知道負載,這依賴數(shù)據(jù)采集和計算Prometheus (https://prometheus.io) 就是做這個用的,它會不斷采集各種數(shù)據(jù),按照它的一套規(guī)則,也可以計算這些數(shù)據(jù),它本質(zhì)上就是一個時序數(shù)據(jù)庫。
系統(tǒng)負載,本質(zhì)上就是一系列的時序數(shù)據(jù),會隨著時間變化比如,Prometheus 有個 node深圳南油女裝高端貨源app_exporter (https://github.com/prometheus/node_exporter),它提供了主機節(jié)點的相關(guān)時序信息,比如 CPU、磁盤、網(wǎng)絡(luò)、內(nèi)存等,這些信息就可以作為計算服務(wù)負載的依據(jù)。
每個應(yīng)用服務(wù),也會有對應(yīng)的 exporter,比如 redis_exporter (https://github.com/oliver006/redis_exporter) 采集 Redis 的負載數(shù)據(jù),nginx-exporter (https://github.com/nginxinc/nginx-prometheus-exporter) 采集 Nginx 的負載數(shù)據(jù)。
目前 S深圳南油女裝高端貨源appRS 還沒有實現(xiàn)自己的 exporter,未來一定會實現(xiàn),詳細請參考 https://github.com/ossrs/srs/issues/2899。
