三體云的前身是一家視頻會(huì)議提供商,如今致力于為多領(lǐng)域提供實(shí)時(shí)音視頻技術(shù)整體解決方案,為開發(fā)者提供簡單易用、極度穩(wěn)定、低延時(shí)、高保障的直播云服務(wù),這其中的轉(zhuǎn)變在架構(gòu)升級、系統(tǒng)調(diào)度和質(zhì)量監(jiān)控三個(gè)方面都有不同的體現(xiàn)。本文來自于張光在LiveVideoStackCon2019北京站上的精彩分享。
大家好,我是三體云CTO張光,今天我演講的主題是三體云如何提供高可用的實(shí)時(shí)音視頻服務(wù)。我從2005年開始從事音視頻技術(shù)研究,有十年的移動(dòng)端音視頻研發(fā)經(jīng)驗(yàn),曾任著名視頻會(huì)議廠商研發(fā)經(jīng)理,負(fù)責(zé)過多行業(yè)100+音視頻項(xiàng)目,2008奧運(yùn)會(huì)有幸擔(dān)任TD3G供應(yīng)商項(xiàng)目主要負(fù)責(zé)人,目前更加關(guān)注與實(shí)時(shí)音視頻技術(shù)的發(fā)展。
1. 高可用
1.1 高可用的定義
眾所周知,云服務(wù)廠商與客戶簽訂協(xié)議之時(shí)一般都會(huì)附帶SLA協(xié)議,而SLA協(xié)議中基本就已經(jīng)定義了廠商給用戶提供的服務(wù)需要達(dá)到什么樣的等級。SLA協(xié)議中更多提到的是服務(wù)在什么時(shí)候可以提供給客戶使用,而具體的使用效果并沒有明確說明,因此三體云對自身提出了更高的要求,希望提供的服務(wù)能夠在可用的同時(shí)帶給用戶更好的使用體驗(yàn)。
1.2 如何做到高可用
三體云的前身是一家視頻會(huì)議提供商,整體軟件的架構(gòu)都是由視頻會(huì)議過渡而來,要提供實(shí)時(shí)音視頻服務(wù)并處理海量并發(fā)需求,當(dāng)務(wù)之急是需要對系統(tǒng)架構(gòu)進(jìn)行升級,另外,好的調(diào)度系統(tǒng)也能使音視頻服務(wù)變得更好用。在提供優(yōu)質(zhì)服務(wù)之后,三體云還希望能夠建設(shè)一套全面的質(zhì)量監(jiān)控系統(tǒng),更好更快的找出系統(tǒng)的不足,不斷地改進(jìn)以提供更好的服務(wù)給客戶。
2. 系統(tǒng)架構(gòu)升級
2.1 早期適用于視頻會(huì)議的系統(tǒng)架構(gòu)
既然三體云之前是視頻會(huì)議的系統(tǒng)架構(gòu),那么就先從早期架構(gòu)談起。如圖所示,早期的業(yè)務(wù)和媒體節(jié)點(diǎn)都部署在一個(gè)地點(diǎn),如果沒有高并發(fā)、跨地域等的需求情況下,僅僅一個(gè)master就能提供服務(wù)。隨著用戶有更多分支機(jī)構(gòu)的變更以及更多用戶接入的情況出現(xiàn),就需要在MASTER節(jié)點(diǎn)上用SLAVE節(jié)點(diǎn)連接做拓展,隨著層級越來越多,延遲也會(huì)越來越大,MASTER節(jié)點(diǎn)可能會(huì)成為瓶頸。在這種結(jié)構(gòu)下,所有的狀態(tài)都存儲(chǔ)在業(yè)務(wù)服務(wù)器上,業(yè)務(wù)同步會(huì)非常復(fù)雜,某一節(jié)點(diǎn)宕機(jī)之后一般都采取雙機(jī)熱備的方式處理。因此三體云在轉(zhuǎn)型音視頻服務(wù)之后需要對舊的系統(tǒng)架構(gòu)進(jìn)行全面的升級。
2.2 更適合公有網(wǎng)絡(luò)部署的方案
2.2.1 媒體接入及轉(zhuǎn)發(fā)
系統(tǒng)架構(gòu)升級的第一步是對媒體接入及轉(zhuǎn)發(fā)做一些改變,在媒體接入部分,三體云將全國各地的每臺(tái)服務(wù)器做平級化處理,相互之間沒有分層,所有的媒體服務(wù)器都會(huì)向loadbalance節(jié)點(diǎn)上報(bào)狀態(tài),幫助其做一些調(diào)度方面的決策。而在媒體之間轉(zhuǎn)發(fā)部分,在視頻會(huì)議架構(gòu)中節(jié)點(diǎn)轉(zhuǎn)發(fā)需要上報(bào)根節(jié)點(diǎn)之后才能下發(fā)到相應(yīng)節(jié)點(diǎn),而改變也如圖中所示,例如北京移動(dòng)轉(zhuǎn)發(fā)到廣東電信需要經(jīng)過BGP中心節(jié)點(diǎn)來幫助做路由轉(zhuǎn)發(fā),廣東到上海也會(huì)有一個(gè)三線IDC來幫助其轉(zhuǎn)發(fā)。
2.2.2 信令及狀態(tài)維護(hù)
信令和狀態(tài)維護(hù)方面的改變與之前媒體部分的改變比較類似,loadbalance節(jié)點(diǎn)同樣做接入和分發(fā)的工作,而業(yè)務(wù)之間也不存在層級關(guān)系,都會(huì)向loadbalance上報(bào)自己的狀態(tài),同時(shí)所有跟業(yè)務(wù)相關(guān)的房間、用戶的狀態(tài)信息等都會(huì)寫入redis,業(yè)務(wù)之間的數(shù)據(jù)同步就會(huì)變得更簡單。
2.2.3 結(jié)合
上圖表示的是一個(gè)客戶端想要接入系統(tǒng)首先需要連接loadbalance,當(dāng)前更多采用域名的方式來連接,接入之后調(diào)度到指定的業(yè)務(wù)服務(wù)器上,所有的業(yè)務(wù)都需要把狀態(tài)寫到redis,業(yè)務(wù)服務(wù)器分發(fā)之后首先會(huì)有校驗(yàn)和創(chuàng)建狀態(tài)的環(huán)節(jié),完成之后就會(huì)給他分配媒體服務(wù)器。改變之后的業(yè)務(wù)和媒體的拓展比之前的樹狀結(jié)構(gòu)要簡單許多,不需要把新加的媒體或業(yè)務(wù)掛在某一個(gè)MASTER或SLAVE節(jié)點(diǎn)下,只需要部署在平臺(tái)上并注冊在loadbalance上就可以,業(yè)務(wù)和媒體的個(gè)數(shù)不用一一綁定,拓展要相對靈活一些。盡管三體云做到了這些架構(gòu)升級,但在現(xiàn)實(shí)中仍然出現(xiàn)Loadbalance和redis集群癱瘓所引發(fā)的問題,因此需要進(jìn)一步改進(jìn)框架,優(yōu)化產(chǎn)品服務(wù)。
2.2.4 優(yōu)化
通過對系統(tǒng)架構(gòu)的升級優(yōu)化,客戶端在接入時(shí),會(huì)有如圖兩套loadbalance連接,而且redis分開寫入,兩個(gè)loadbalance之間保持高速同步,這樣可以做到兩個(gè)人通過不同的loadbalance進(jìn)行連麥操作。但這樣做還是會(huì)出現(xiàn)部分用戶連接不到服務(wù)器的問題,經(jīng)過排查發(fā)現(xiàn)原因是這部分用戶的域名被劫持,因此三體云又多建了一套固定IP,與前兩個(gè)loadbalance一起寫入SDK,用戶使用服務(wù)進(jìn)行連通時(shí)如果訪問不到域名就會(huì)嘗試連接靜態(tài)IP來訪問,更進(jìn)一步保證了服務(wù)的連通性。
3. 智能調(diào)度
3.1 節(jié)點(diǎn)的選擇
系統(tǒng)架構(gòu)的升級在一定程度上提高了三體云服務(wù)的用戶體驗(yàn),但僅僅靠架構(gòu)優(yōu)化遠(yuǎn)遠(yuǎn)達(dá)不到我們的預(yù)期,還需要智能調(diào)度來進(jìn)一步提升產(chǎn)品質(zhì)量。中國幅員遼闊,大的國土面積帶來的問題是會(huì)出現(xiàn)各種各樣的網(wǎng)絡(luò)問題,如果要為不同地方的用戶提供服務(wù)就需要部署更多的服務(wù)器,目前在國內(nèi)就已經(jīng)有兩百多個(gè)數(shù)據(jù)節(jié)點(diǎn),而對于不同位置需要對節(jié)點(diǎn)部署進(jìn)行選擇。首先需要找到一些能夠部署服務(wù)器的機(jī)房,找到節(jié)點(diǎn)之后進(jìn)行撥測,保證服務(wù)器真實(shí)可用且滿足基本條件就可以部署服務(wù),部署成功再經(jīng)過內(nèi)部測試才可以上線,而上線之后才是對于節(jié)點(diǎn)的真正考驗(yàn)。節(jié)點(diǎn)上線之后我們會(huì)對其進(jìn)行數(shù)據(jù)監(jiān)控,以觀測該節(jié)點(diǎn)是否符合服務(wù)標(biāo)準(zhǔn),最終會(huì)對不符合條件的節(jié)點(diǎn)進(jìn)行淘汰,并重新在該區(qū)域選擇節(jié)點(diǎn)部署。這樣對于節(jié)點(diǎn)的選擇流程會(huì)使三體云部署的全部節(jié)點(diǎn)都是符合服務(wù)標(biāo)準(zhǔn)的選擇。
3.2 第一公里&最后一公里
想要做到智能調(diào)度的第一點(diǎn)是要讓節(jié)點(diǎn)部署離用戶更近,最初三體云是通過IP庫返回所在地域以及運(yùn)營商進(jìn)行選擇,但實(shí)際上國內(nèi)的網(wǎng)絡(luò)環(huán)境非常復(fù)雜,IP庫也存在一定的準(zhǔn)確性問題,甚至服務(wù)器獲取的IP與媒體服務(wù)器獲取到的IP可能不一致,這些問題都急需解決。
通過IP庫返回所在地域以及運(yùn)營商這件事本身并沒有錯(cuò),問題出在運(yùn)營商并沒有將這件事解決徹底,因此在進(jìn)行用戶調(diào)度時(shí)需要更嚴(yán)格要求就近原則、運(yùn)營商匹配度以及負(fù)載均衡,除此之外還需要做一些兜底保障和數(shù)據(jù)統(tǒng)計(jì)的工作來完善調(diào)用規(guī)則。
3.3 路徑選擇
互聯(lián)網(wǎng)做實(shí)時(shí)音視頻交互大部分都是跨區(qū)域連通,而三體云在解決這部分問題時(shí)也遵循著四個(gè)原則,首先通過探測機(jī)制探測各節(jié)點(diǎn)間的網(wǎng)絡(luò)狀況(分區(qū)域),畢竟在國內(nèi)目前就存在兩百多個(gè)服務(wù)器節(jié)點(diǎn),對這些節(jié)點(diǎn)進(jìn)行探測是基本不可能的,因此是按區(qū)域劃分進(jìn)行探測,各區(qū)域會(huì)把自己的探測結(jié)果上報(bào)到?jīng)Q策中心去做統(tǒng)一的調(diào)度。第二點(diǎn)是關(guān)于實(shí)時(shí)負(fù)載狀況的統(tǒng)計(jì),國內(nèi)兩百多個(gè)服務(wù)器節(jié)點(diǎn)的配置是不一樣的,所以必須把實(shí)時(shí)運(yùn)行的狀態(tài)上報(bào)到?jīng)Q策中心,方便做后續(xù)分配。最后在路徑選擇方面還需要基于成本考量,并且遵循最短路徑原則。
3.4 路徑切換
路徑選擇完成之后在真實(shí)網(wǎng)絡(luò)環(huán)境下還會(huì)出現(xiàn),國內(nèi)的網(wǎng)絡(luò)包括主干網(wǎng)和單線機(jī)房都會(huì)隨時(shí)發(fā)生抖動(dòng),或者發(fā)生機(jī)房宕機(jī)等情況,為了盡量避免這些特殊情況對用戶體驗(yàn)的影響,還需要在智能調(diào)度中加入路徑切換,能夠在使用過程中對路徑做實(shí)時(shí)選擇。
3.5 服務(wù)下線、升級
服務(wù)器部署之后并不是一成不變的,算法的改進(jìn)和服務(wù)節(jié)點(diǎn)的替換都是服務(wù)下線和升級的過程,而在這個(gè)過程中我們也希望能有更好的用戶體驗(yàn)。假如A服務(wù)需要下線、升級,之前的做法是直接殺死A服務(wù),依賴client的斷線重連使服務(wù)維持下去,但這期間會(huì)發(fā)生黑屏、卡頓等非常影響用戶體驗(yàn)的狀況發(fā)生。而后的改進(jìn)措施是先從loadbalance上注銷A服務(wù),保證調(diào)度時(shí)不再有新的用戶訪問A服務(wù),等待A服務(wù)用戶逐漸歸零之后再升級服務(wù),但現(xiàn)實(shí)情況下根本沒辦法等到所有用戶都從A服務(wù)上下線,所以最終三體云的改進(jìn)方法是主動(dòng)發(fā)送信令通知用戶從A服務(wù)遷移到B服務(wù),在此期間做到用戶對于服務(wù)下線、升級完全無感知,體驗(yàn)不到中間有任何的斷開。
4. 質(zhì)量監(jiān)控
在做完服務(wù)器部署以及智能調(diào)度之后,已經(jīng)可以保證用戶能夠無時(shí)無刻的訪問三體云的業(yè)務(wù),但最終的使用效果如果沒有質(zhì)量監(jiān)控是沒辦法觀測到的,并且需要做到先于用戶發(fā)現(xiàn)問題,或者幫助客戶一起來改進(jìn)服務(wù)質(zhì)量。以下是三體云質(zhì)量監(jiān)控系統(tǒng)對某客戶使用效果的一些指標(biāo)統(tǒng)計(jì)數(shù)據(jù)。
4.1 質(zhì)量監(jiān)控示例
來源:LiveVideoStack