在关于OpenSIPS学习笔记中的前几个章节中,笔者详细说明了关于集群模块的使用和各种业务场景。很多读者看完以前的文章就提出要做OpenSIPS集群,这让笔者非常无语。集群仅是一个比较宽泛的概念,它可以支持很多具体的业务场景的集群,而且针对不同的集群方案,其部署和使用的模块都非常不同,因此,如果非常宽泛地讨论这些问题就没有任何意义。其中,在集群部署中,通过OpenSIPS集群注册是最常用的OpenSIPS或者Kamailio平台应用场景之一。关于集群和其他模块说明,读者可以参考:
OpenSIPS学习笔记-cluster集群模块配置-dialog集群机制设置-集群节点环境配置示例-2
用户通过注册绑定共享的方式,支持SIP账号通过OpenSIPS部署的各个节点实现SIP注册功能。OpenSIPS的集群模块来保证每个SIP注册对其他节点的广播,另外,因为集群模块中的每个节点可以支持同一类型数据的能力,因此,这种集群加节点共享的处理能力可以自动实现一个高可靠性部署方式,一个节点出现故障,其他节点可以支持SIP注册进行工作。下面,笔者使用一个简单全共享配置示例介绍如何配置集群注册示例和简单测试流程。
配置前说明:
- 已经创建好节点实例,并且保证几个实例之间互通互联,开启相应的端口。此要求在上一个章节中已经说明
- 已经安装好OpenSIPS 的控制界面
- 需要SIP用户端预先准备好安装软电话或者物理话机
- 为了保持内网的连通性,节点均在仅在同一云平台同一区域
配置集群注册示例需要大概经过以下几个步骤:
第一步,每个节点的用户需要访问控制界面,设置flags 为“seed”模式。从seed字面意思我们也可以大概的含义,就是为了节点那个找到相应的传播节点,这样做的目的是为了集群模块配合各个节点能够正常成功启动,确保每个节点在找到相应互相支持的节点后才能确认为一个正常状态的节点。完成了集群模块的成功启动以后,节点之间才真正能够互联互通,互相广播。因此,这一步是非常重要的一步,用户必须确保此步骤成功设置(需要配合后续配置文件的设置)。

然后,用户需要编辑OpenSIPS的cfg配置文件,修改相应的配置参数。这里,一定要注意自己的集群ID,node-ID和自己表示的node-ID,参考前面章节的配置说明,这里修改为全共享设置。
- modparam("usrloc", "location_cluster", __CLUSTER_ID__)
- modparam("usrloc", "working_mode_preset", "full-sharing-cluster")
通过”full-sharing-cluster“ 实现对其他节点进行广播。
接下来,在各个节点修改为自己相应的配置以后,各个节点需要完成集群同步,因此节点需要重新启动自己的实例。
第四步,各个节点用户分别创建一个独立的SIP用户。为了保持测试的完整性,用户通过OpenSIPS 控制界面或者CLI 命令根据节点不同创建不同的user和subscriber, 例如1X01, 这里X表示集群中的node ID,如果在节点3,就是1301。 注意,在上次文章中,我们示例创建了4个节点。为了简单测试,我们的密码使用的也是1X01密码。
通过SIP 1000(以前创建的SIP账号),进行注册测试。SIP 1000重新注册,通过CLI命令检查其地址状态:
watch -n0.5 'timeout 1 opensips-cli -x mi ul_dump | grep "AOR\":\|Contact\":"'

如果一切配置成功的话,从本地节点可以看到其他的SIP账号,例如, 1201,1301,甚至于1401等节点的SIP账号使用不同终端注册的状态:



如果节点在“seed”节点时,用户可以执行集群同步命令查看状态,返回状态应该是OK状态。
opensips-cli -x mi ul_cluster_sync

在呼叫测试流程,我们简单测试其中一种情况。测试通过非注册节点进行呼叫。用户可以使用SIP 1000对1X01等其他SIP用户帐户进行呼叫,然后用户1X01对1000SIP用户帐户进行呼叫,通过命令sngrep观察其呼叫流程。如果呼叫到一个1X01在非注册节点的呼叫时,本地节点的呼叫会直接呼叫到1X01终端,不经过注册节点。通过不同SIP终端进行不同的并发呼叫,通过命令sngrep抓取呼叫路径。确保所有节点都介入了呼叫,在各个节点通过命令查看所有节点的呼叫跟踪记录。测试集群中每个节点数据同步的可持续性场景中,需要每个节点都重新启动OpenSIPS,从其中一个节点数据同步到其他的节点中。其中,具有“seed”状态的节点负责执行节点数据的同步。在同步数据时一定要注意,同步数据初始总是一个为空的状态,这样可以保证集群数据都是绝对干净的数据状态,否则,所有数据可能发生冲突。因为同步不同节点的数据的处理流程比较复杂,用户可以通过查看5555端口的数据进行跟踪:
ngrep -tqd any -W byline -il '^((?!clusterer-internal).)*$' port 5555
不同节点示例需要根据是否是“seed” 节点来执行不同的命令完成特别操作,所以节点之间的协同必须一致。如果是在“seed” 节点,用户执行:
service opensips restart
opensips-cli -x mi ul_dump
opensips-cli -x mi ul_cluster_sync
opensips-cli -x mi ul_dump
经过命令查询,确保全部数据成功同步处理,查看其状态:

如果是其他节点的实例,执行以下命令:
- service opensips restart
- opensips-cli -x mi ul_dump

确保已经收到同步数据,同步成功。
最后,在本文章中笔者重点分享了如何在OpenSIPS中实现集群注册的配置示例。笔者通过几个主要的步骤分享了如何配置控制界面设置,如何修改cfg配置文件,加载配置参数以及如何进行集群测试和节点同步中需要注意的一些问题。
因为资源有限,笔者在测试环境中肯定存在很多不足之处,包括云平台,跨国家地域之间的跨平台测试和终端网络等测试,这些测试需要更多的集群环境和不同的测试点才能完成。这里仅是一个抛砖引玉,希望对计划做基于OpenSIPS对计划做SIP集群注册的用户有一定帮助。
参考资料:
www.OpenSIPS.org
www.hiastar.com
- 关于Asterisk文档,参考:www.asterisk.org.cn
- 融合通信/IPPBX/FreePBX商业解决方案:www.hiastar.com
- 最新Asterisk完整中文用户手册详解:www.asterisk.org.cn
- Freepbx/FreeSBC技术文档: www.freepbx.org.cn
- 如何使用免费会话边界控制器-FreeSBC,qq技术分享群:334023047
- 关注微信公众号:asterisk-cn,获得有价值的通信行业技术分享