0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FreeSWITCH高可用部署與云原生集群部署知識分享

LiveVideoStack ? 來源:LiveVideoStack ? 2022-12-29 11:12 ? 次閱讀

大家好,我本次分享的主題是FreeSWITCH高可用部署與云原生集群部署,主要是談一談從高可用到彈性伸縮的一些技術應用。

具體包含以下相關內容:雙機、三機,到可彈性伸縮的通信集群建設經驗,包含?對?通話、呼叫中?及?視頻會議、?志監(jiān)控等場景,涉及FreeSWITCH、Kamailio、WebRTC、MCU、SFU、Docker、K8S、ETCD、NATS、Loki等相關技術。

主要會介紹我們用到的一些技術,希望能對大家有所幫助。上面提到的一些技術其實也不算是新技術,通信技術已經歷幾十年發(fā)展,早在二三十年前大家就已經在研究高可用相關技術。不過因為新時代的發(fā)展,最近大家開始關注云原生等相關技術,相應基礎設施產生一些變化,通信與互聯(lián)網的聯(lián)系也越來越緊密,由此產生了更多新的玩法。

01 單點故障

其實,一切的起源都是來自“單點故障”這個問題,我們就由此展開來進行介紹。

f048171c-871d-11ed-bfe3-dac502259ad0.jpg

A和B兩個通信的實體,兩個電話(人)通過一臺服務器進行通信,當然這個服務器可以是FreeSWITCH,也可以是任何其它服務器。假設這臺服務器由于通信鏈路中斷或者是網絡連接中斷,A和B則無法完成通信,這就是單點故障的起源。

f05d1464-871d-11ed-bfe3-dac502259ad0.jpg

那要想解決這個單點故障,就需要另外的服務器通過迂回路由或是其它辦法來克服單點故障的問題。

02雙機HA

一般來說,克服這個單點故障的方法就是雙機HA(High Availability),即主備高可用。

f0796236-871d-11ed-bfe3-dac502259ad0.jpg

雙機HA的主要原理是:有一臺主機和一臺備機,假如主機出現(xiàn)問題斷連,備機可以接替成為主機繼續(xù)進行工作,如此不斷進行主備交換。主機與備機為同一IP地址,對于A和B來說可能感知的到或者根本感知不到主備機所進行的切換,因為通訊時A和B看到的僅僅只是IP地址,當任何一臺服務器切換到主機時,它就占有了對外服務的IP地址,這個IP地址我們就叫做虛擬的IP,也叫業(yè)務IP或浮動IP。本身每臺服務器底層還有一個IP,但對外提供服務的IP(即A和B看到的IP)其實是虛擬IP。

這樣當服務器發(fā)生切換的時候,A和B仍然是和原來的IP進行通話,他們可能會感覺到網絡的短暫卡頓,然后恢復正常,而感知不到服務器是否有進行切換,這就是主備高可用的原理。

f093f308-871d-11ed-bfe3-dac502259ad0.jpg

為了實現(xiàn)主備高可用,由于主服務器和備服務器之間有一些數(shù)據需要同步,所以就需要一種數(shù)據同步機制。

f0a7b596-871d-11ed-bfe3-dac502259ad0.jpg

當然這個數(shù)據同步的機制有很多種,例如通過日志、消息隊列等等,在FreeSWITCH中主要是通過數(shù)據庫來同步這些數(shù)據。主服務器會實時將A和B(A和B可能有成千上萬個)通話的數(shù)據寫入到數(shù)據庫當中,備機可以在數(shù)據庫當中查詢數(shù)據,一旦發(fā)生主備切換,備機從數(shù)據庫當中取得數(shù)據,重新建立通話場景,A和B就可以繼續(xù)進行通話。

f0c01122-871d-11ed-bfe3-dac502259ad0.jpg

在這種情況下,數(shù)據庫也就成為了一個單點,為了解決這個問題,數(shù)據庫同樣需要主備高可用。

f0dfdaca-871d-11ed-bfe3-dac502259ad0.jpg

FreeSWITCH的主備切換原理:首先主機包含一個Param,參數(shù)為:,如果我們開啟此參數(shù),它就會實時的將通話數(shù)據寫入數(shù)據庫當中。當然這個會有一定的開銷,因為需要實時的寫入數(shù)據庫,比如每秒有一千路通話、一萬路通話,它的開銷就會很大,所以這種雙機切換會對系統(tǒng)的吞吐量有一定影響。但在一些必要的場景下,我們往往是需要犧牲一些性能來更好的實現(xiàn)高可用的。

當備機發(fā)生切換的時候,備機會執(zhí)行一個 sofia recover 命令,從數(shù)據庫中取得數(shù)據重建通話的場景,向A和B發(fā)送 reINVITE。前面我們說A和B感知不到,其實也能感知到,因為A和B收到了重新建連的邀請,繼續(xù)進行通話。一般這個通話過程大概在1-3秒內解決,A和B只是覺得會短暫的卡頓,不用掛斷重新呼叫。

f1037b7e-871d-11ed-bfe3-dac502259ad0.jpg

我們先排除數(shù)據庫的影響(默認數(shù)據庫是主備高可用的),來看FreeSWITCH的主備高可用。

為了能準確感知進行主服務器和備服務器之間的切換,需要有一個東西叫心跳(心跳線),一般心跳線在之前都是用串口線,因為心跳只是簡單的傳幾個字節(jié)的信息,對帶寬的要求不大。但現(xiàn)在在一些虛擬機中,不包含物理的串口,就只能用網線來實現(xiàn)。通過一個網線,不停的有心跳,備機可以借此感知主機的狀態(tài),一旦產生主機崩潰、斷連,備機會接管IP。

當然這個情況下也可能會產生誤判,考慮到心跳線本身的斷開影響,我們可以通過兩根心跳線或雙網卡的方法避免出現(xiàn)這種誤判的情況。總之,我們需要更多的機制來保護系統(tǒng),避免出現(xiàn)兩個服務器同時綁定同一個IP,同時寫入服務器導致服務器錯亂的情況產生。

f1269ac8-871d-11ed-bfe3-dac502259ad0.jpg

當然,這種情況下會有一些問題,兩臺機器作為一臺機器使用,可能會造成資源的浪費。還有一套方式是負載分擔(Load Balance),A和B之間有50%的話務分別放置于兩臺主機,兩臺主機可以同時達到滿負荷承載。但這種情況同樣存在一定問題,假設原本每臺可以承受一千路通話,兩臺配合總共可以承受兩千路通話,當其中一臺主機出現(xiàn)問題,另一臺在滿負載的情況下,實際上系統(tǒng)的吞吐量只能達到一千,就會發(fā)生擁塞發(fā)生問題。

所以說一般主備負載分擔的情況下,我們會保證兩臺FreeSWITCH主機每臺的話務量不要超過其設計容量的50%,這樣是比較安全的。當然,這樣算起來我們實際上還是有50%的浪費,我們也可以采取通信降級的策略,當一臺主機出現(xiàn)故障時,僅使用另外一臺主機,根據實際業(yè)務需求,保證部分通話連接的正常使用。

f148c878-871d-11ed-bfe3-dac502259ad0.jpg

不過負載分擔對于A和B會有一定的要求,前面我們說到主備的方式,A和B都只能看到一臺服務器(實際上是兩臺服務器),是一個IP地址。但是在負載分擔的情況下,A和B都能看到兩臺機器,這就需要一定的邏輯(在A和B上做),需要能夠分發(fā)比如將50%的話務量分到一臺主機,剩余50%分到另外一臺主機。而且有時候兩臺主機的性能不一樣,可能一個是64核,另一個是32核,需要根據主機性能對話務量進行分配,比如一個60%,一個40%。這樣就會對A的要求比較高,需要能夠感知主機來進行負載的分發(fā)。

f15e06de-871d-11ed-bfe3-dac502259ad0.jpg

在實際的部署當中,我們一般都是采用這樣的結構(如圖所示)。FreeSWITCH作為媒體服務器,前面再放上代理服務器,一般是用Kamailio或者openSIPS做代理。Kamailio只代理SIP就是指處理通信的建立和分發(fā),一臺Kamailio后端可以放很多的FreeSWITCH。因為FreeSWITCH要過媒體,要進行錄音、質檢、分析等等媒體的處理,所以FreeSWITCH的處理能力就不如Kamailio強。這樣前面放一個Kamailio,后端可以放很多FreeSWITCH進行通信。

當然Kamailio需要主備高可用,而Kamailio和FreeSWITCH之間是用Load Balance,這樣用HA+負載分擔的方式就完成了一種比較大的通信集群。而且由于A和B兩側的業(yè)務邏輯有可能會不一樣,比如說一側是中繼,一側是話務員是本次的系統(tǒng)電話,這時我們可以放兩個不同的Kamailio,管理起來會更方便一些。

當然我們也可以使用一個Kamailio,將A和B放在一側,但這樣的話腳本和邏輯的判斷上就會比較復雜。因為必須要判斷通話是由A還是B過來的,還是從FreeSWITCH過來的,需要判斷呼叫的方向,邏輯會相對比較復雜。

f16fe868-871d-11ed-bfe3-dac502259ad0.jpg

還有一種情況就是異地災備,什么是異地災備?舉個例子,我們可能有兩個機房分別在北京和上海,都用FreeSWITCH和主備高可用,這樣平常主要通過北京的機房,一旦出現(xiàn)問題可以通過迂回路由經由上海的機房進行通信。

但是異地災備同樣需要一些數(shù)據的同步,這就又對A提出了一定要求,因為A面對的是北京和上海兩個機房。所以說高可用是無窮無盡的,只要有需求只要改架構就需要相應的考慮,但萬變不離其宗,其實就是HA和負載均衡這兩種邏輯。當然具體地來說,A上可能靠DNS輪詢,也可以將北京或上海的地址直接寫進設備當中,自己執(zhí)行策略根據情況來進行切換等等。

f1872a96-871d-11ed-bfe3-dac502259ad0.jpg

那么,我們來看B這一側。A和B進行通話,有可能會呼叫進來之后執(zhí)行IVR有些應用,這些應用同樣需要主備高可用。比如有人打電話進來,Kamailio是負責信令的,F(xiàn)reeSWITCH負責媒體,但是具體的邏輯是由應用來負責的,需要由它來告訴FreeSWITCH應該什么時候處理媒體、什么時候錄音、放音等等,所以應用側同樣需要主備高可用。

f19a242a-871d-11ed-bfe3-dac502259ad0.jpg

當然,一般的這種IVR我們認為它大體都是無狀態(tài)的,接入通話掛斷之后再接入一個新的通話同樣還是這個IVR,所以一般都會用負載分擔的方式,可以承擔多個IVR的業(yè)務。

f1b4886a-871d-11ed-bfe3-dac502259ad0.jpg

但是有一些服務它是有狀態(tài)的,比如說呼叫中心當中常用的ACD。ACD需要check坐席的狀態(tài),以及隊列的狀態(tài),有多少客戶在等待、有多少坐席在服務、哪個坐席正在跟客戶溝通、哪個坐席正處于空閑,它需要跟蹤這些狀態(tài)。一般來說對于這種有狀態(tài)的服務,還是要采用主備高可用的方式。當然,雙機HA同樣可能會出現(xiàn)兩臺機器同時發(fā)生問題的情況,這時候我們就擴展到 —— 三機。

03Raft

三臺機器的場景更為麻煩,由此我們引入了一個協(xié)議叫做Raft,還有一個叫做PaxOS,不過現(xiàn)在比較常用的還是Raft協(xié)議。

f1e07862-871d-11ed-bfe3-dac502259ad0.jpg

Raft其實是一個共識協(xié)議,它的主要作用是做Log。首先它是用一個分布式的系統(tǒng),分布式系統(tǒng)主要是解決容錯的問題。那么怎么解決呢?就是同步日志。比如一臺機器上的日志,我要將這些日志副本同步到其它的服務器上去,當然我們說到的日志可能也是數(shù)據,數(shù)據庫數(shù)據或者通話的數(shù)據或者是狀態(tài)的數(shù)據等等。一般來說Raft都是奇數(shù)的,因為其遵循少數(shù)服從多數(shù)的原則,通過投票來進行選舉。

f1f98e1a-871d-11ed-bfe3-dac502259ad0.jpg

Raft中包含三個節(jié)點,Leader(領導)是一個主服務器,所有人會選舉選出一個Leader來,由Leader來決定什么時候修改數(shù)據。然后它會把這些數(shù)據同步給Follower(追隨者),所有的數(shù)據會從Leader上進行修改,之后會同步到Follower上。正常的情況下,集群內有Leader和Follower,數(shù)據就可以在服務器間進行同步。但又一種情況是作為Leader的主服務器掛掉了,其它所有的服務器就會變?yōu)?a target="_blank">Candidate(候選者),有機會被選舉成為新的Leader,通過這個機制可以保證有一臺服務器是可以保存這些數(shù)據的。

f2080b0c-871d-11ed-bfe3-dac502259ad0.jpg

但是它雖然能保存數(shù)據卻不能對外提供服務,Raft集群規(guī)定其中有一臺主機負責寫數(shù)據,另外兩臺負責備份,只有集群當中有多數(shù)的主節(jié)點和備節(jié)點活著的時候,比如說3個死了1個,則還可以繼續(xù)對外提供服務。但是如果是死了兩個,就不能繼續(xù)對外提供服務了。

那么,這是為什么?如圖最右側我們來看,假設原來的主服務器與其它服務器斷開鏈接,此時它還是能正常進行服務。而另外的兩臺服務器會根據當前情況判斷,重新選舉出一臺作為主服務器。此時,整個集群當中就會同時出現(xiàn)兩臺主服務器產生沖突。所以一定要遵循少數(shù)服從多數(shù)的原則,只有當整個集群中有多數(shù)的節(jié)點活著的時候才能對外提供服務。

f22508e2-871d-11ed-bfe3-dac502259ad0.jpg

f23c5010-871d-11ed-bfe3-dac502259ad0.jpg

當然,如果我們說要把所有的ACD里面都要實現(xiàn)一個Raft是很難的。目前有一個應用叫做ETCD,我們可以直接將服務連接到ETCD上,它會告訴我們誰是主誰是備。但是這樣又帶來了一個問題,本來三臺機器就可以,我們還需要另外再裝三臺ETCD,這樣會帶來更大的開銷和浪費,多用了一倍的資源。

f24ad55e-871d-11ed-bfe3-dac502259ad0.jpg

但是當我們的集群比較大的時候,比如除了ACD外我們還有其它服務如BCD、CDE等等。如果各種微服務的數(shù)量比較多,可以公用一個ETCD的話,相比較而言開銷也就沒那么大了。

f2717876-871d-11ed-bfe3-dac502259ad0.jpg

簡單的總結一下:

雙機可以提?可靠性,但投?資源和獲得回報不成正?;

為了節(jié)省服務器,把不同的服務放到相同的物理服務器或虛擬機上,可能適得其反;

集群可以提?可靠性,但只有集群?夠?,資源才能有效利?;

雙機需要的服務器數(shù)量是偶數(shù)的,?少2臺;

分布式系統(tǒng)(集群)需要的服務器數(shù)量是奇數(shù)的,?少3臺。

f28ccf0e-871d-11ed-bfe3-dac502259ad0.jpg

一般的來說,有一臺FreeSWITCH服務器就夠了,如果想雙機設備的話就需要兩臺服務器,如果需要數(shù)據庫的話就是四臺。有可能還會放Nginx代理HTTP,還有可能會放Kamailio來代理SIP。當然我們主要使用NATS,這是一個消息隊列。然后使用Etcd來做選主,有可能使用Redis來做緩存,還有可能做日志、監(jiān)控等各種服務器。還有可能rtpengine、存儲、業(yè)務系統(tǒng)......

總之,要是想建立一個可靠的系統(tǒng)至少需要十幾臺服務器,它對外所能提供的服務能力也超不過一臺服務器的服務。所以如果集群規(guī)模比較小,那就沒有什么意義,投入天文數(shù)字但實際上整體的收益很小。如果想要集群規(guī)模做的足夠大,類似云服務,那么投入多少臺服務器其實都無所謂了,因為開銷是相對比較小了。當然,這些最終還是需要根據業(yè)務本身來做權衡。

04XSwitch實踐

接下來介紹一些XSwitch的具體實踐。

f2c78c52-871d-11ed-bfe3-dac502259ad0.jpg

XSwitch即XSwitch集群,一般來說最小的配置就是雙機,主備高可用,F(xiàn)reeSWITCH和PostgreSQL放在一塊。

f2e6dada-871d-11ed-bfe3-dac502259ad0.jpg

對于有一定預算的客戶,我們就建議他們將數(shù)據庫獨立出來,放在獨立的服務器上,總共4臺服務器。Nginx一般我們可以跟FreeSWITCH放在一起,然后有可能我們會放Kamailio。

f300942a-871d-11ed-bfe3-dac502259ad0.jpg

如果預算充足也可以將它們都獨立出來,這樣后面就可以放更多的FreeSWITCH。

f31f1cec-871d-11ed-bfe3-dac502259ad0.jpg

再就是異地的,負載分擔。

f370367c-871d-11ed-bfe3-dac502259ad0.jpg

因為WebRTC只有媒體, 所以就是直接到FreeSWITCH,信令可以通過Nginx或者Kamailio實現(xiàn),因為信令都是基于WebSocket來做的,這是WebRTC的高可用。當然,媒體前面我們提到有個rtpengine也可以做代理,可以把后臺的FreeSWITCH隱藏起來,這就是更復雜的一些應用了。

f37f35dc-871d-11ed-bfe3-dac502259ad0.jpg

XSwitch如何實現(xiàn)多租戶呢?其實我們有好多種方式,一種就是Per tenant per FreeSWITCH,每個租戶給它一臺FreeSWITCH,每個FreeSWITCH一個Docker,使用同一個數(shù)據庫,我們用的是PostgreSQL,里面可以天然的分Schema,每個Schema都是彼此隔離的,這樣的話可以給每個租戶分一個Schema。

f38fe012-871d-11ed-bfe3-dac502259ad0.jpg

也就是每個租戶一個域名,每個租戶一個Docker,每個租戶一個Schema,數(shù)據庫是同一個。前面放一個sbc,用Kamailio來做信令的代理,當然sbc現(xiàn)在我們是單機部署的,以后也可以做HA。

f3aa5bea-871d-11ed-bfe3-dac502259ad0.jpg

具體的代碼其實我們就寫了一個映射表,因為我們現(xiàn)在集群規(guī)模比較小,還沒有放數(shù)據庫,通過域名就可以直接查到對應的IP地址,來進行分發(fā)。我們使用的是Kamailio+Lua。

f3c80bfe-871d-11ed-bfe3-dac502259ad0.jpg

在應用側我們就使用了NATS。NATS是一個消息隊列,所以它具有消息隊列的一些基本特性,比如說Pub/Sub來進行推送,還有一個就是Queue Groups,可以通過一個隊列進行訂閱,這種情況下就可以做負載分擔。生產者生成了一條消息,消費者可以負載分擔的消費這些消息。

f3d45698-871d-11ed-bfe3-dac502259ad0.jpg


那么我們就用它來做集群的應用:來了一個電話到Kamailio進行分發(fā),分發(fā)到不同的FreeSWITCH,通過NATS分配給不同的Controller,這個Controller就是應用側,應用側會控制通話的邏輯。

當來了一個電話到了FreeSWITCH以后,NATS會分給某一個Controller,這個時候Controller就跟某一臺FreeSWITCH建立了一個虛擬的對應關系,在這個電話的生存期間它就可以控制這路電話的通話行為和呼叫流程。

當然,這個Controller也可以額外增加,F(xiàn)reeSWITCH也可以。NATS也連接到了Kamailio,Kamailio也可以感知到NATS,這時候如果我們擴展、彈性伸縮,F(xiàn)reeSWITCH不夠用我們又加了幾臺,這個時候FreeSWITCH就會給NATS發(fā)一個消息,NATS會把這個消息發(fā)給Kamailio,Kamailio就感知到我現(xiàn)在有了6臺FreeSWITCH,它就會重新計算它的路由表,我們用的是dispatcher模塊,重載dispatcher模塊的數(shù)據,然后它就會把新的通話分發(fā)給新的FreeSWITCH,這樣就完成了一個擴容,這也就是彈性伸縮。

彈性伸縮的“伸”還是比較容易的,只需要往上加機器就行?!翱s”才是比較困難的,有時候需要等所有的話務量都去掉之后才能進行。

當然,“縮”還有一個就是可能大家都認為的,比如其中一臺機器掛掉了,我重啟一下。其實重啟之后它就不是原來那臺機器了,我們這邊用的都是FreeSWITCH的UUID,重啟之后UUID會發(fā)生改變。雖然IP地址有可能變有可能不變,但我們認為它是變了,因為是一臺新的機器了。

所以說在這個集群里面,即使是重啟了以后,它也不是原來那臺機器了。我們在哲學里曾學過:“?不能兩次踏?同?條河流”就是這個意思。如果想要做集群,那就要把它做成是無狀態(tài)的最好,這樣才能大規(guī)模的分發(fā)和復用。

所以說使用的機制主要是Docker和K8S。當然,將FreeSWITCH放在K8S里面并不容易,首先我們先放到Docker里面,先完成容器化,然后再放到K8S里面。因為K8S它是一個網絡,優(yōu)點就是不知道它在哪臺物理機上運行,想啟動就啟動,想關閉就關閉。但是FreeSWITCH、SIP,尤其是RTP,它們有一大堆的端口,就會比較麻煩。

f41999e2-871d-11ed-bfe3-dac502259ad0.jpg

那么,我們是怎么做的呢?我們使?Kamailio做Ingress,負責信令進來。Kamailio還是雙機,然后它分發(fā)給后端的FreeSWITCH,F(xiàn)reeSWITCH不夠用了就執(zhí)行Scale Up,相反就Scale Down。

f425a2aa-871d-11ed-bfe3-dac502259ad0.jpg

但是具體的我們使用了一個東西叫做VIP,這個VIP是我們自己寫的一個協(xié)議,因為現(xiàn)在的K8S主要是針對HTTP來優(yōu)化的,對SIP類的應用就會比較麻煩。所以我們就自己寫了一個應用,在每臺物理機或者虛擬機上,都有一個VIP的服務。當FreeSWITCH啟動的時候,同樣每臺機器上也只啟動一個FreeSWITCH,它告訴VIP打開一對端口,然后VIP就把這些端口通過iptables打開,就可以正常分發(fā)了。萬一這臺機器死了之后,端口就是空著不用也無所謂,因為FreeSWITCH也死了,不會有服務往這上面發(fā)了。當機器重啟之后,端口仍舊還是使用這幾個端口段,所以也沒有問題。這種情況下RTP就是直接到FreeSWITCH,前端還是通過Kamailio進行分發(fā)SIP。

f44a104a-871d-11ed-bfe3-dac502259ad0.png

這種應用就是每個Node上只運??個FreeSWITCH,每個Node上運??個vip。當然,VIP這個東西叫做DaemonSet,每臺機器上只起一個VIP服務,這個服務也在集群當中。通過這種方式我們就可以動態(tài)的打開SIP和RTP的端口,這樣可以做彈性的伸縮。這是我們做的一些應用。

f465a954-871d-11ed-bfe3-dac502259ad0.jpg

當然,如果一個Node 64核、128核,能不能運行多個FreeSWITCH?可以的,其實這樣就需要按端口段來分開,可以做成兩個Pod,一個占10000-20000,另一個占30000-50000。這樣的話通過這種方式,保證兩個FreeSWITCH同時啟動的時候互不影響,同樣管理也會更加復雜。

下面是在Kamailio中使用NATS的一些基本代碼:

f47ce966-871d-11ed-bfe3-dac502259ad0.jpg

f49720c4-871d-11ed-bfe3-dac502259ad0.jpg

05會議

下面還有一種就是會議。

f4c9bf3e-871d-11ed-bfe3-dac502259ad0.jpg

我們平常的負載分擔分發(fā)是盡量平均的分發(fā)到不同的FreeSWITCH,這是最好的分發(fā)策略。但是會議不能,會議需要把呼入同一個會議號的,都分發(fā)到同一臺FreeSWITCH上。這里我們用了Kamailio中一個“2”的策略,“hash over to URI”。

f4e546fa-871d-11ed-bfe3-dac502259ad0.jpg

當然,實際使用的時候會議規(guī)模比較大,一臺FreeSWITCH不能滿足,我們需要放到多臺FreeSWITCH上,這個時候我們就用了“7”這個策略,“hash over the content of PVs string”。我們可以自己創(chuàng)建一個字符串,只要是計算出來不同的終端,它在一個組內,通過分組,只要計算出來字符串是相同的,就會分配到同一臺FreeSWITCH。

f4f72bae-871d-11ed-bfe3-dac502259ad0.jpg

視頻會議有這么幾種方式:Mesh是無狀態(tài)的,MCU就是所有的東西都通過中間融屏,SFU是通過它進行分發(fā),不融屏。

f509a590-871d-11ed-bfe3-dac502259ad0.jpg

f5243d06-871d-11ed-bfe3-dac502259ad0.jpg

f533b06a-871d-11ed-bfe3-dac502259ad0.jpg

我們也會做會議的級聯(lián),通過多個FreeSWITCH級聯(lián)來實現(xiàn)較大規(guī)模的會議。

f540cf98-871d-11ed-bfe3-dac502259ad0.jpg

級聯(lián)也會出現(xiàn)一個問題,叫做“看對眼”,就是出限類似無限循環(huán)的效果,如上圖中的樣子。

f56ab6a0-871d-11ed-bfe3-dac502259ad0.jpg

那么,我們是怎么做的?我們在會議當中,首先我們說怎么將兩個FreeSWITCH的會議串起來。

很簡單,就是在第一臺FreeSWITCH里面 conference 3000(會議號),然后呼叫另外一臺FreeSWITCH也呼3000,另外一臺FreeSWITCH收到呼叫以后,直接conference 3000 加入會議,這個時候就是把兩個會議進行串起來。

f57dd2a8-871d-11ed-bfe3-dac502259ad0.png

串起來之后,我們就可以設置兩個畫布,第一個是“video_initial_canvas”,表示我把我的圖像放在哪個canvas上;第二個是“video_initial_watching_canvas”,表示我看哪個canvas。

f5a6387e-871d-11ed-bfe3-dac502259ad0.jpg

通過這種方式,我們也完成了MCU和SFU的互通。我們現(xiàn)在打通了Agora、TRTC以及MediaSoup之類的應用。

06日志

最后一個我想說的就是日志。

f5c7c390-871d-11ed-bfe3-dac502259ad0.jpg

日志很簡單,都有一些現(xiàn)成的服務:

Homer是做SIP的日志的,它的實現(xiàn)原理就是FreeSWITCH或Kamailio插入一個Agent,會將收到的消息轉發(fā)給它,將SIP的圖畫出來;Loki就是存放日志的,我們會把所有的日志都發(fā)給它;另外還有Zabix、Grafana、Promuthus。

f5e264f2-871d-11ed-bfe3-dac502259ad0.jpg

這里面關鍵的一點是,每天成千上萬路的通話并發(fā),我們需要知道哪一路通話跟哪一路是相關的。所以說要有一個uuid,F(xiàn)reeSWITCH里面每一路通話都有一個uuid,這個UUID要跟call-id關聯(lián)起來。通過call-id就可以找到對應的uuid,通過uuid就可以找到另外一條腿的uuid。

f6094e14-871d-11ed-bfe3-dac502259ad0.jpg

上面是呼入,呼出的時候使用的是這個參數(shù):outbound-use-uuid-as-callid。

f61cd088-871d-11ed-bfe3-dac502259ad0.jpg

如果FreeSWITCH對外發(fā)出一路呼叫,在SIP當中的Call-ID和內部的uuid是一致的,這樣就可以找到它們的對應關系,日志和SIP的對應關系。

這樣的話,A進來,通過A的Call-ID就可以找到uuid,通過B的uuid就可以找到對應的Call-ID。通過Other-Leg-Unique-ID,這個在事件里面會有,或者Channel-Call-UUID,都能找到到對方,找到A和B。

07總結

f63c9f76-871d-11ed-bfe3-dac502259ad0.jpg

最后,簡單的總結一下。通信的集群我們要用到各種各樣的開源軟件,要有雙機、三機,彈性伸縮,包括?對?通話、呼叫中?及?視頻會議、?志監(jiān)控等場景。最終還是萬變不離其宗,不管使用的是任何軟件,它們的基本原理是不變的。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • RTC
    RTC
    +關注

    關注

    2

    文章

    511

    瀏覽量

    65897
  • MCU技術
    +關注

    關注

    0

    文章

    19

    瀏覽量

    5774
  • SFUD
    +關注

    關注

    0

    文章

    4

    瀏覽量

    1047

原文標題:FreeSWITCH高可用部署與云原生集群部署

文章出處:【微信號:livevideostack,微信公眾號:LiveVideoStack】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    云原生技術概述 云原生火爆成為升職加薪核心必備

    云原生微服務可通過分布式部署,大幅提升團隊和日常的工作效率,K8s+Docker+Ceph+Envoy+Istio+Prometheus架構,目前是各大主流互聯(lián)網首選的技術方向,掌握云原生微服務架構
    的頭像 發(fā)表于 07-27 10:23 ?1181次閱讀

    Kubernetes Ingress 可靠部署最佳實踐

    摘要: 在Kubernetes集群中,Ingress作為集群流量接入層,Ingress的高可靠性顯得尤為重要,今天我們主要探討如何部署一套高性能可靠的Ingress接入層。簡介
    發(fā)表于 04-17 14:35

    Hadoop的集群環(huán)境部署說明

    或者是相同,指令多、步驟繁瑣。有的時候覺得不免覺得很奇怪,這些發(fā)行商為什么不對hadoop的集群環(huán)境部署做一下優(yōu)化呢?幸運的是總算是讓我找到了一個hadoop發(fā)行版集群環(huán)境搭建簡單易用。這里使用的是一款
    發(fā)表于 10-12 15:51

    Flink集群部署方法

    Flink集群部署詳細步驟
    發(fā)表于 04-23 11:45

    如何在集群部署時實現(xiàn)分布式session?

    集群部署時的分布式 session 如何實現(xiàn)?
    發(fā)表于 07-17 06:57

    開放應用模型(OAM):全球首個云原生應用標準定義與架構模型

    Helm charts 這樣的方式來嘗試表達一個可部署的應用,可一旦部署起來,實際運行的應用中卻依舊缺乏以應用為中心的約束模型。這些問題都反映出,Kubernetes 以及云原生技術棧需要一種以應用為
    發(fā)表于 10-23 10:06

    redis集群的如何部署

    redis集群部署(偽分布式)
    發(fā)表于 05-29 17:13

    Docker部署Redis服務器集群的方法

    Docker部署Redis服務器集群
    發(fā)表于 06-13 09:12

    請問鴻蒙系統(tǒng)上可以部署kubernetes集群嗎?

    鴻蒙系統(tǒng)上可以部署kubernetes集群
    發(fā)表于 06-08 11:16

    只需 6 步,你就可以搭建一個云原生操作系統(tǒng)原型

    優(yōu)化業(yè)務調度能力 。最后一步當我們擁有了這樣的一套系統(tǒng),我們如何才能把它安裝部署起來?設想一下,當我們面臨一千臺虛擬機的集群需要部署一個云原生系統(tǒng)的時候,我們該怎么做?難道我們需要一臺
    發(fā)表于 09-15 14:01

    如何部署基于Mesos的Kubernetes集群

    的內核。把Kubernetes運行在Mesos集群之上,可以和其他的框架共享集群資源,提高集群資源的利用率。 本文是Kubernetes和Mesos集成指南系列文章第一篇:實戰(zhàn)部署。
    發(fā)表于 10-09 18:04 ?0次下載
    如何<b class='flag-5'>部署</b>基于Mesos的Kubernetes<b class='flag-5'>集群</b>

    華為云中什么是云原生服務中心

    、統(tǒng)一存儲、全域分發(fā),幫助您簡化云原生服務的生命周期管理。 UCS深度集成云原生服務中心的功能,可真正實現(xiàn)服務的開箱即用,有效提升云原生服務能力與質量,支持服務的訂閱、部署、升級、更新
    發(fā)表于 07-27 15:44 ?641次閱讀
    華為云中什么是<b class='flag-5'>云原生</b>服務中心

    什么是分布式云原生

    什么是分布式云原生 華為云分布式云原生服務(Ubiquitous Cloud Native Service, UCS)是業(yè)界首個分布式云原生產品,為企業(yè)提供云原生業(yè)務部署、管理、應用生
    發(fā)表于 07-27 15:52 ?1484次閱讀

    Helm部署MinIO集群

    Helm部署MinIO集群
    的頭像 發(fā)表于 12-03 09:44 ?690次閱讀
    Helm<b class='flag-5'>部署</b>MinIO<b class='flag-5'>集群</b>

    K8S學習教程(二):在 PetaExpress KubeSphere容器平臺部署可用 Redis 集群

    前言 Redis 是在開發(fā)過程中經常用到的緩存中間件,為了考慮在生產環(huán)境中穩(wěn)定性和可用,Redis通常采用集群模式的部署方式。 在制定Redis
    的頭像 發(fā)表于 07-03 15:30 ?360次閱讀
    K8S學習教程(二):在 PetaExpress KubeSphere容器平臺<b class='flag-5'>部署</b><b class='flag-5'>高</b><b class='flag-5'>可用</b> Redis <b class='flag-5'>集群</b>