除了介紹dialog集群以外,筆者將介紹如何配置OpenSIPS集群機制,通過(guò)集群注冊的部署來(lái)演示集群的環(huán)境,并且最后介紹幾個(gè)集群CLI 命令。
1關(guān)于OpenSIPS的dialog集群背景介紹
大家可能都知道,OpenSIPS的dialog模塊在SIP呼叫中起著(zhù)非常重要的作用,各種應用場(chǎng)景都需要dialog支持,例如計費,呼叫控制,超時(shí)設置等。如果呼叫在處理過(guò)程中出現故障的話(huà),顯然,這些應用場(chǎng)景也不能得到保障。為了在高并發(fā)或者大規模部署中保證dialog的數據處理的穩定性,OpenSIPS支持了對dialog的集群設置。集群的節點(diǎn)通過(guò)tag并且來(lái)共享一些業(yè)務(wù)層面的要求,例如,在節點(diǎn)中,如果呼叫完成后,哪個(gè)節點(diǎn)處理了BYE請求, 在集群中,哪個(gè)節點(diǎn)生成CDR 呼叫建立等。這些數據不可能在全部節點(diǎn)都在同一時(shí)間進(jìn)行各自處理,必須有一個(gè)節點(diǎn)服務(wù)器進(jìn)行處理。
2OpenSIPS中Dialog集群的基本思路
和對注冊集群的部署來(lái)說(shuō),dialog的集群相對比較簡(jiǎn)單。其中部分設置的思路是相同的。完整細節的配置說(shuō)明,讀者可以參考官方文檔,這里僅為了后續部分章節中的內容支持,這里重點(diǎn)強調一些主要的知識點(diǎn):
- 在復制集群環(huán)境中,所有的節點(diǎn)被組成一個(gè)組,在同樣的集群中使用anycast方式進(jìn)行廣播(非其他cast方式),關(guān)于其他cast方式的不同,讀者參考網(wǎng)絡(luò )資料。
- 所有dialog數據在整個(gè)cluster中進(jìn)行復制處理
- 通過(guò)BIN 協(xié)議復制數據
- 集群中的所有節點(diǎn)共享同一IP地址
- 通過(guò)dialog的更新來(lái)實(shí)現節點(diǎn)數據的交互,例如,執行了re-ininvite等流程。
dialog集群部署方式同時(shí)使用了一個(gè)tag 標簽的形式,通過(guò)對節點(diǎn)標識標簽的方式實(shí)現dialog節點(diǎn)的集群備份(HA)設置。另外,為了實(shí)現對呼叫的某些業(yè)務(wù)數據的共享,通過(guò)集群引擎,在dialog集群使用了共享profile的方式來(lái)實(shí)現集群文件共享。每個(gè)節點(diǎn)廣播自己的共享profile文件,無(wú)需外部數據庫支持。接下來(lái)的幾個(gè)章節中,筆者將進(jìn)一步介紹dialog標簽在集群部署時(shí)代使用,節點(diǎn)共享dialog profile實(shí)現dialog 數據的同步共享。
3OpenSIPS環(huán)境中dialog集群的tag標簽說(shuō)明
筆者在前面很多文章中已經(jīng)講過(guò),dialog是跟蹤呼叫的手段。在呼叫過(guò)程中,dialog可以跟蹤呼叫時(shí)長(cháng),CDR計費統計,請求處理等狀態(tài)。讀者可以先閱讀以下文章:
OpenSIPS學(xué)習筆記-Dialog的五種狀態(tài)及配置示例
dialog的tag標簽是OpenSIPS中對節點(diǎn)業(yè)務(wù)進(jìn)行管理的一個(gè)手段。在OpenSIPS的環(huán)境中,集群節點(diǎn)需要通過(guò)一定的標識來(lái)對業(yè)務(wù)流程中某些特定的流程做出標識處理,dialog上添加一個(gè) tag標簽對邏輯進(jìn)行標識是一個(gè)比較好的方法。具體來(lái)說(shuō),dialog tag標簽具有以下幾個(gè)方面的特征:
- 每個(gè)dialog指定到一個(gè)tag標簽
- 每個(gè)節點(diǎn)能夠意識到所有被使用的tag標簽
一個(gè)活動(dòng)的節點(diǎn)實(shí)例僅支持一個(gè)特定tag標簽,活動(dòng)的實(shí)例處理dialog的ping廣播消息,dialog的生命周期管理
如果一個(gè)活動(dòng)的節點(diǎn)出現故障以后,備用節點(diǎn)將會(huì )啟動(dòng)來(lái)繼續為標識的tag服務(wù)。這里將需要一個(gè)高可靠性處理,通過(guò)主備方式進(jìn)行HA的處理。tag的狀態(tài)將會(huì )遷移到另外一個(gè)備用的節點(diǎn)上。注意,一個(gè)節點(diǎn)可以支持多個(gè)活動(dòng)的tag標簽來(lái)支持多種業(yè)務(wù)需求。
dialog 標簽的語(yǔ)法設置相對比較簡(jiǎn)單,示例如下:
loadmodule "dialog.so'
modparam("dialog", "dialog replication cluster", 1)
modparam("clusterer", "sharing tag", "vip=active") // 另外一個(gè)做passive
{
create dialog();
set_dlg_sharing_tag("vip");
}
具體關(guān)于OpenSIPS dialog 集群HA的處理示例。節點(diǎn)需要通過(guò)一個(gè)主從備份的方式,通過(guò)tag標簽對呼叫業(yè)務(wù)中的特定流程進(jìn)行跟蹤處理。節點(diǎn)雙方互相標識。基本的處理思路如下圖例:

此圖例以及以下圖例均來(lái)自于互聯(lián)網(wǎng)資源


在以上示例中,呼叫可能通過(guò)幾個(gè)不同的節點(diǎn)來(lái)處理每個(gè)呼叫具體的流程,因此,各個(gè)節點(diǎn)的tag需要對其具體流程進(jìn)行跟蹤來(lái)監控一個(gè)完整的呼叫記錄和CDR。為了保證你呼叫的流程的完整性,所有的dialog,包括后續請求的dialog都要通過(guò)具體的標簽做記錄備份,最后,所有節點(diǎn)共享dialog 文件數據。如果丟失了ACK 請求的dialog記錄信息或者BYE的消息,系統就會(huì )丟失完整的CDR記錄,當然也不可能繼續在此記錄上做計費的功能。
4OpenSIPS中dialog集群的dialog profile討論
在分布式部署的OpenSIPS 平臺的呼叫環(huán)境中,因為負載均衡或者其他的業(yè)務(wù)要求的需要,一個(gè)SIP呼叫可能通過(guò)不同的路徑節點(diǎn)來(lái)實(shí)現。特別涉及到一些計費功能時(shí),或者一些對呼叫數量有限制的場(chǎng)景中,dialog profile 也需要通過(guò)節點(diǎn)共享dialog profile,通過(guò)profile來(lái)限定一些服務(wù)要求。通過(guò)集群部署共享dialog profile是非常必要的。和注冊集群的方式不同,注冊集群需要數據庫的處理來(lái)協(xié)同共享數據,但是,dialog profile 共享無(wú)需其他的外部資源,它僅需要OpenSIPS 集群模塊引擎和BIN 響應來(lái)完成。通過(guò)集群方式共享Dialog profile有以下幾個(gè)方面的特點(diǎn):
- 通過(guò)集群引擎可以共享 profile的meta data數據
- dialog 文件復制各自獨立
- 無(wú)需要求外部數據庫引擎中存儲處理
- 依賴(lài)BIN 協(xié)議配合工作
- 每個(gè)節點(diǎn)僅廣播屬于自己的profile size
- 每個(gè)節點(diǎn)通過(guò)收到的prifile總值介紹所有的size
- 無(wú)需擔心節點(diǎn)故障
- 架構設計相對比較輕,相對比較有更高的效率
dialog profile 設置語(yǔ)法如下:
loadmodule "dialog.so"
modparam("dialog', "profile replication cluster", 2)
# 這里 b表示BIN 協(xié)議,也可以是s, 表示shared 通過(guò)noSQL 數據庫處理
modparam("dialog""profiles no value", "all calls/b")
create_dialog();
set_dis_profile("all_call/b") # /b使用方式同上
5OpenSIPS環(huán)境下集群注冊的配置
集群部署是一個(gè)非常復雜的環(huán)境。在配置集群環(huán)境前,讀者需要首先明確測試環(huán)境的配置和核心配置文件,還有節點(diǎn)之間的網(wǎng)絡(luò )環(huán)境。特別是節點(diǎn)之間的網(wǎng)絡(luò )需要保證都能夠互相通信,相關(guān)的端口和安全策略必須一致。如果在基于云平臺測試環(huán)境中,用戶(hù)最好把所有的節點(diǎn)都部署在同一區域,保證你內網(wǎng)可以互通,而且安全策略可以互相信任。
因為資源能力有限,相對于生產(chǎn)環(huán)境,筆者的測試環(huán)境僅限于一個(gè)集群平臺,支持3-5個(gè)節點(diǎn)的互通。為了實(shí)現簡(jiǎn)單配置,筆者使用的是靜態(tài)配置方式,通過(guò)界面數據庫設置節點(diǎn)數據,而不是通過(guò)動(dòng)態(tài)加載節點(diǎn)的方式來(lái)實(shí)現的,所以我們需要預設好所有的節點(diǎn),假設節點(diǎn)環(huán)境配置和我們操作的節點(diǎn)數據,環(huán)境,安全策略都是相同的,并且能夠正常共享數據庫數據。
首先,我們需要通過(guò)OpenSIPS 控制界面,添加集群節點(diǎn)數據,添加到主要參數包括:Cluster ID,Node ID,BIN URL和端口5555,SIP地址和具體節點(diǎn)描述信息。如果未安裝OpenSIPS GUI的話(huà),用戶(hù)需要首先成功安裝好GUI控制界面。特別提醒,筆者僅說(shuō)明一個(gè)節點(diǎn)的配置,其他節點(diǎn)的配置也需要完全一致設置為我們示例的配置,但是一定要注意自己的node id和其他鄰居節點(diǎn)的節點(diǎn)的地址和id的不同。

通過(guò)控制界面添加了節點(diǎn)以后,然后修改cfg 配置文件,加載必要的集群引擎,數據庫和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 # 用戶(hù)也可以監聽(tīng)IP地址
添加以上必要設置以后,集群引擎停止,這里,一定要保證所有的節點(diǎn)的OpenSIPS能夠停止,然后所有節點(diǎn)保證同步好所有數據以后,再重新開(kāi)啟。用戶(hù)必須對集群中的各個(gè)節點(diǎn)需要做多次測試,保證數據庫可以同步,保證BIN監控正常。經(jīng)過(guò)一段時(shí)間的測試,各個(gè)節點(diǎn)數據能夠正常以后,我們才能進(jìn)行其他注冊等業(yè)務(wù)功能的測試。如果節點(diǎn)之間都能夠同步,集群服務(wù)器可以正常工作的話(huà),用戶(hù)可以通過(guò)集群命令看到其他節點(diǎn)的數據狀態(tài),其中一個(gè)節點(diǎn)執行以下命令,可以看到節點(diǎn)列表:
- opensips-cli -x mi clusterer_list
- opensips-cli -x mi clusterer_list_topology


最后,如果所有節點(diǎn)可以正常通信以后,用戶(hù)可以測試節點(diǎn)之間的連通性。具體測試方式很多,用戶(hù)可以在本地通過(guò)防火墻命令過(guò)濾某個(gè)節點(diǎn)的IP(例如:ufw insert 1 allow from 節點(diǎn)IP to any),然后再通過(guò)以上命令查看這些節點(diǎn)的狀態(tài),然后在關(guān)閉過(guò)濾的節點(diǎn)地址重新檢查所有節點(diǎn)狀態(tài)。全部完成以上所有的節點(diǎn)的測試以后,我們才能繼續進(jìn)行下一步的全共享集群注冊的配置示例操作。
完成以上配置以后,筆者將在后續章節具體介紹如何配置集群注冊示例(包括full sharing, federation 和no SQL配置),共享dialog profile配置示例,安裝配置mongodb實(shí)現以上功能。
6總結
在本文章中筆者介紹了關(guān)于dialog 和dialog profile共享的配置處理流程。在對集群dialog的設置部署中,筆者介紹了dialog的HA設置方式和標簽tag的設置,針對呼叫流程中不同的業(yè)務(wù)做標識處理,通過(guò)tag實(shí)現對節點(diǎn)呼叫的完整監控。另外,筆者也介紹了關(guān)于集群場(chǎng)景配置的非常重要的流程,包括基本的集群配置,節點(diǎn)配置和控制界面對節點(diǎn)的設置,然后介紹了通過(guò)防火墻過(guò)濾等手段如何對節點(diǎn)故障的測試。
再次說(shuō)明,筆者測試的集群節點(diǎn)必須都需要同步同一的配置場(chǎng)景,包括網(wǎng)絡(luò )環(huán)境,安全策略和端口等狀態(tài)都需要完全一致。在保證節點(diǎn)環(huán)境相同的情況下,我們才能繼續進(jìn)行集群注冊部署配置和dialog profile共享配置的流程。另外,筆者測試環(huán)境相對簡(jiǎn)單,在生產(chǎn)環(huán)境中,可能很多用戶(hù)需要根據自己的場(chǎng)景中一定的調整,筆者僅是拋磚引玉,希望讀者對OpenSIPS的集群部署有一個(gè)完整清晰的概念,集群部署中涉及的太多細節需要通過(guò)不斷實(shí)踐才能完成。
參考資料:
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)于A(yíng)sterisk文檔,參考:www.asterisk.org.cn
- 融合通信/IPPBX/FreePBX商業(yè)解決方案:www.hiastar.com
- 最新Asterisk完整中文用戶(hù)手冊詳解:www.asterisk.org.cn
- Freepbx/FreeSBC技術(shù)文檔: www.freepbx.org.cn
- 如何使用免費會(huì )話(huà)邊界控制器-FreeSBC,qq技術(shù)分享群:334023047
- 關(guān)注微信公眾號:asterisk-cn,獲得有價(jià)值的通信行業(yè)技術(shù)分享