除了介紹dialog集群以外,筆者將介紹如何配置OpenSIPS集群機(jī)制,通過集群注冊的部署來演示集群的環(huán)境,并且最后介紹幾個集群CLI 命令。
1關(guān)于OpenSIPS的dialog集群背景介紹
大家可能都知道,OpenSIPS的dialog模塊在SIP呼叫中起著非常重要的作用,各種應(yīng)用場景都需要dialog支持,例如計費(fèi),呼叫控制,超時設(shè)置等。如果呼叫在處理過程中出現(xiàn)故障的話,顯然,這些應(yīng)用場景也不能得到保障。為了在高并發(fā)或者大規(guī)模部署中保證dialog的數(shù)據(jù)處理的穩(wěn)定性,OpenSIPS支持了對dialog的集群設(shè)置。集群的節(jié)點通過tag并且來共享一些業(yè)務(wù)層面的要求,例如,在節(jié)點中,如果呼叫完成后,哪個節(jié)點處理了BYE請求, 在集群中,哪個節(jié)點生成CDR 呼叫建立等。這些數(shù)據(jù)不可能在全部節(jié)點都在同一時間進(jìn)行各自處理,必須有一個節(jié)點服務(wù)器進(jìn)行處理。
2OpenSIPS中Dialog集群的基本思路
和對注冊集群的部署來說,dialog的集群相對比較簡單。其中部分設(shè)置的思路是相同的。完整細(xì)節(jié)的配置說明,讀者可以參考官方文檔,這里僅為了后續(xù)部分章節(jié)中的內(nèi)容支持,這里重點強(qiáng)調(diào)一些主要的知識點:
- 在復(fù)制集群環(huán)境中,所有的節(jié)點被組成一個組,在同樣的集群中使用anycast方式進(jìn)行廣播(非其他cast方式),關(guān)于其他cast方式的不同,讀者參考網(wǎng)絡(luò)資料。
- 所有dialog數(shù)據(jù)在整個cluster中進(jìn)行復(fù)制處理
- 通過BIN 協(xié)議復(fù)制數(shù)據(jù)
- 集群中的所有節(jié)點共享同一IP地址
- 通過dialog的更新來實現(xiàn)節(jié)點數(shù)據(jù)的交互,例如,執(zhí)行了re-ininvite等流程。
dialog集群部署方式同時使用了一個tag 標(biāo)簽的形式,通過對節(jié)點標(biāo)識標(biāo)簽的方式實現(xiàn)dialog節(jié)點的集群備份(HA)設(shè)置。另外,為了實現(xiàn)對呼叫的某些業(yè)務(wù)數(shù)據(jù)的共享,通過集群引擎,在dialog集群使用了共享profile的方式來實現(xiàn)集群文件共享。每個節(jié)點廣播自己的共享profile文件,無需外部數(shù)據(jù)庫支持。接下來的幾個章節(jié)中,筆者將進(jìn)一步介紹dialog標(biāo)簽在集群部署時代使用,節(jié)點共享dialog profile實現(xiàn)dialog 數(shù)據(jù)的同步共享。
3OpenSIPS環(huán)境中dialog集群的tag標(biāo)簽說明
筆者在前面很多文章中已經(jīng)講過,dialog是跟蹤呼叫的手段。在呼叫過程中,dialog可以跟蹤呼叫時長,CDR計費(fèi)統(tǒng)計,請求處理等狀態(tài)。讀者可以先閱讀以下文章:
OpenSIPS學(xué)習(xí)筆記-Dialog的五種狀態(tài)及配置示例
dialog的tag標(biāo)簽是OpenSIPS中對節(jié)點業(yè)務(wù)進(jìn)行管理的一個手段。在OpenSIPS的環(huán)境中,集群節(jié)點需要通過一定的標(biāo)識來對業(yè)務(wù)流程中某些特定的流程做出標(biāo)識處理,dialog上添加一個 tag標(biāo)簽對邏輯進(jìn)行標(biāo)識是一個比較好的方法。具體來說,dialog tag標(biāo)簽具有以下幾個方面的特征:
- 每個dialog指定到一個tag標(biāo)簽
- 每個節(jié)點能夠意識到所有被使用的tag標(biāo)簽
一個活動的節(jié)點實例僅支持一個特定tag標(biāo)簽,活動的實例處理dialog的ping廣播消息,dialog的生命周期管理
如果一個活動的節(jié)點出現(xiàn)故障以后,備用節(jié)點將會啟動來繼續(xù)為標(biāo)識的tag服務(wù)。這里將需要一個高可靠性處理,通過主備方式進(jìn)行HA的處理。tag的狀態(tài)將會遷移到另外一個備用的節(jié)點上。注意,一個節(jié)點可以支持多個活動的tag標(biāo)簽來支持多種業(yè)務(wù)需求。
dialog 標(biāo)簽的語法設(shè)置相對比較簡單,示例如下:
loadmodule "dialog.so'
modparam("dialog", "dialog replication cluster", 1)
modparam("clusterer", "sharing tag", "vip=active") // 另外一個做passive
{
create dialog();
set_dlg_sharing_tag("vip");
}
具體關(guān)于OpenSIPS dialog 集群HA的處理示例。節(jié)點需要通過一個主從備份的方式,通過tag標(biāo)簽對呼叫業(yè)務(wù)中的特定流程進(jìn)行跟蹤處理。節(jié)點雙方互相標(biāo)識;镜奶幚硭悸啡缦聢D例:
此圖例以及以下圖例均來自于互聯(lián)網(wǎng)資源
在以上示例中,呼叫可能通過幾個不同的節(jié)點來處理每個呼叫具體的流程,因此,各個節(jié)點的tag需要對其具體流程進(jìn)行跟蹤來監(jiān)控一個完整的呼叫記錄和CDR。為了保證你呼叫的流程的完整性,所有的dialog,包括后續(xù)請求的dialog都要通過具體的標(biāo)簽做記錄備份,最后,所有節(jié)點共享dialog 文件數(shù)據(jù)。如果丟失了ACK 請求的dialog記錄信息或者BYE的消息,系統(tǒng)就會丟失完整的CDR記錄,當(dāng)然也不可能繼續(xù)在此記錄上做計費(fèi)的功能。
4OpenSIPS中dialog集群的dialog profile討論
在分布式部署的OpenSIPS 平臺的呼叫環(huán)境中,因為負(fù)載均衡或者其他的業(yè)務(wù)要求的需要,一個SIP呼叫可能通過不同的路徑節(jié)點來實現(xiàn)。特別涉及到一些計費(fèi)功能時,或者一些對呼叫數(shù)量有限制的場景中,dialog profile 也需要通過節(jié)點共享dialog profile,通過profile來限定一些服務(wù)要求。通過集群部署共享dialog profile是非常必要的。和注冊集群的方式不同,注冊集群需要數(shù)據(jù)庫的處理來協(xié)同共享數(shù)據(jù),但是,dialog profile 共享無需其他的外部資源,它僅需要OpenSIPS 集群模塊引擎和BIN 響應(yīng)來完成。通過集群方式共享Dialog profile有以下幾個方面的特點:
- 通過集群引擎可以共享 profile的meta data數(shù)據(jù)
- dialog 文件復(fù)制各自獨立
- 無需要求外部數(shù)據(jù)庫引擎中存儲處理
- 依賴BIN 協(xié)議配合工作
- 每個節(jié)點僅廣播屬于自己的profile size
- 每個節(jié)點通過收到的prifile總值介紹所有的size
- 無需擔(dān)心節(jié)點故障
- 架構(gòu)設(shè)計相對比較輕,相對比較有更高的效率
dialog profile 設(shè)置語法如下:
loadmodule "dialog.so"
modparam("dialog', "profile replication cluster", 2)
# 這里 b表示BIN 協(xié)議,也可以是s, 表示shared 通過noSQL 數(shù)據(jù)庫處理
modparam("dialog""profiles no value", "all calls/b")
create_dialog();
set_dis_profile("all_call/b") # /b使用方式同上
5OpenSIPS環(huán)境下集群注冊的配置
集群部署是一個非常復(fù)雜的環(huán)境。在配置集群環(huán)境前,讀者需要首先明確測試環(huán)境的配置和核心配置文件,還有節(jié)點之間的網(wǎng)絡(luò)環(huán)境。特別是節(jié)點之間的網(wǎng)絡(luò)需要保證都能夠互相通信,相關(guān)的端口和安全策略必須一致。如果在基于云平臺測試環(huán)境中,用戶最好把所有的節(jié)點都部署在同一區(qū)域,保證你內(nèi)網(wǎng)可以互通,而且安全策略可以互相信任。
因為資源能力有限,相對于生產(chǎn)環(huán)境,筆者的測試環(huán)境僅限于一個集群平臺,支持3-5個節(jié)點的互通。為了實現(xiàn)簡單配置,筆者使用的是靜態(tài)配置方式,通過界面數(shù)據(jù)庫設(shè)置節(jié)點數(shù)據(jù),而不是通過動態(tài)加載節(jié)點的方式來實現(xiàn)的,所以我們需要預(yù)設(shè)好所有的節(jié)點,假設(shè)節(jié)點環(huán)境配置和我們操作的節(jié)點數(shù)據(jù),環(huán)境,安全策略都是相同的,并且能夠正常共享數(shù)據(jù)庫數(shù)據(jù)。
首先,我們需要通過OpenSIPS 控制界面,添加集群節(jié)點數(shù)據(jù),添加到主要參數(shù)包括:Cluster ID,Node ID,BIN URL和端口5555,SIP地址和具體節(jié)點描述信息。如果未安裝OpenSIPS GUI的話,用戶需要首先成功安裝好GUI控制界面。特別提醒,筆者僅說明一個節(jié)點的配置,其他節(jié)點的配置也需要完全一致設(shè)置為我們示例的配置,但是一定要注意自己的node id和其他鄰居節(jié)點的節(jié)點的地址和id的不同。
通過控制界面添加了節(jié)點以后,然后修改cfg 配置文件,加載必要的集群引擎,數(shù)據(jù)庫和BIN 協(xié)議配置:
- loadmodule "clusterer.so"
- modparam("clusterer", "my_node_id", __NODE_ID__) # 主要自己的ID
- modparam("clusterer", "db_mode", 1)
- modparam("clusterer", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
加載BIN 協(xié)議配置:
- loadmodule "proto_bin.so"
- listen = bin:eth0:5555 # 用戶也可以監(jiān)聽IP地址
添加以上必要設(shè)置以后,集群引擎停止,這里,一定要保證所有的節(jié)點的OpenSIPS能夠停止,然后所有節(jié)點保證同步好所有數(shù)據(jù)以后,再重新開啟。用戶必須對集群中的各個節(jié)點需要做多次測試,保證數(shù)據(jù)庫可以同步,保證BIN監(jiān)控正常。經(jīng)過一段時間的測試,各個節(jié)點數(shù)據(jù)能夠正常以后,我們才能進(jìn)行其他注冊等業(yè)務(wù)功能的測試。如果節(jié)點之間都能夠同步,集群服務(wù)器可以正常工作的話,用戶可以通過集群命令看到其他節(jié)點的數(shù)據(jù)狀態(tài),其中一個節(jié)點執(zhí)行以下命令,可以看到節(jié)點列表:
- opensips-cli -x mi clusterer_list
- opensips-cli -x mi clusterer_list_topology
最后,如果所有節(jié)點可以正常通信以后,用戶可以測試節(jié)點之間的連通性。具體測試方式很多,用戶可以在本地通過防火墻命令過濾某個節(jié)點的IP(例如:ufw insert 1 allow from 節(jié)點IP to any),然后再通過以上命令查看這些節(jié)點的狀態(tài),然后在關(guān)閉過濾的節(jié)點地址重新檢查所有節(jié)點狀態(tài)。全部完成以上所有的節(jié)點的測試以后,我們才能繼續(xù)進(jìn)行下一步的全共享集群注冊的配置示例操作。
完成以上配置以后,筆者將在后續(xù)章節(jié)具體介紹如何配置集群注冊示例(包括full sharing, federation 和no SQL配置),共享dialog profile配置示例,安裝配置mongodb實現(xiàn)以上功能。
6總結(jié)
在本文章中筆者介紹了關(guān)于dialog 和dialog profile共享的配置處理流程。在對集群dialog的設(shè)置部署中,筆者介紹了dialog的HA設(shè)置方式和標(biāo)簽tag的設(shè)置,針對呼叫流程中不同的業(yè)務(wù)做標(biāo)識處理,通過tag實現(xiàn)對節(jié)點呼叫的完整監(jiān)控。另外,筆者也介紹了關(guān)于集群場景配置的非常重要的流程,包括基本的集群配置,節(jié)點配置和控制界面對節(jié)點的設(shè)置,然后介紹了通過防火墻過濾等手段如何對節(jié)點故障的測試。
再次說明,筆者測試的集群節(jié)點必須都需要同步同一的配置場景,包括網(wǎng)絡(luò)環(huán)境,安全策略和端口等狀態(tài)都需要完全一致。在保證節(jié)點環(huán)境相同的情況下,我們才能繼續(xù)進(jìn)行集群注冊部署配置和dialog profile共享配置的流程。另外,筆者測試環(huán)境相對簡單,在生產(chǎn)環(huán)境中,可能很多用戶需要根據(jù)自己的場景中一定的調(diào)整,筆者僅是拋磚引玉,希望讀者對OpenSIPS的集群部署有一個完整清晰的概念,集群部署中涉及的太多細(xì)節(jié)需要通過不斷實踐才能完成。
參考資料:
https://opensips.org/html/docs/modules/2.4.x/clusterer.html
https://www.researchgate.net/publication/261427896_Secure_cluster-based_SIP_service_over_Ad_hoc_networks/link/549dbcce0cf2fedbc31198cb/download
https://blog.opensips.org/2018/03/23/clustering-ongoing-calls-with-opensips-2-4/
www.freesbc.cn
關(guān)于Asterisk文檔,參考:www.asterisk.org.cn
- 融合通信/IPPBX/FreePBX商業(yè)解決方案:www.hiastar.com
- 最新Asterisk完整中文用戶手冊詳解:www.asterisk.org.cn
- Freepbx/FreeSBC技術(shù)文檔: www.freepbx.org.cn
- 如何使用免費(fèi)會話邊界控制器-FreeSBC,qq技術(shù)分享群:334023047
- 關(guān)注微信公眾號:asterisk-cn,獲得有價值的通信行業(yè)技術(shù)分享