您当前的位置是:  首页 > 资讯 > 文章精选 >
 首页 > 资讯 > 文章精选 >

OpenSIPS学习笔记-cluster集群模块配置-dialog集群机制设置-集群节点环境配置示例-2

2021-03-18 10:22:17   作者:james.zhu    来源:Asterisk开源派   评论:0  点击:


  在上一个章节,笔者介绍了集群注册的基本配置方式和各种机制的优缺点。本章节中,笔者将进一步介绍关于OpenSIPS集群支持的另外一种常见的场景-dialog的集群。dialog集群是OpenSIPS在高并发环境中一定需要考虑的配置功能。通过集群部署方式,可以保证呼叫中的dialog能够正确处理完成。
  除了介绍dialog集群以外,笔者将介绍如何配置OpenSIPS集群机制,通过集群注册的部署来演示集群的环境,并且最后介绍几个集群CLI 命令。
  1关于OpenSIPS的dialog集群背景介绍
  大家可能都知道,OpenSIPS的dialog模块在SIP呼叫中起着非常重要的作用,各种应用场景都需要dialog支持,例如计费,呼叫控制,超时设置等。如果呼叫在处理过程中出现故障的话,显然,这些应用场景也不能得到保障。为了在高并发或者大规模部署中保证dialog的数据处理的稳定性,OpenSIPS支持了对dialog的集群设置。集群的节点通过tag并且来共享一些业务层面的要求,例如,在节点中,如果呼叫完成后,哪个节点处理了BYE请求, 在集群中,哪个节点生成CDR 呼叫建立等。这些数据不可能在全部节点都在同一时间进行各自处理,必须有一个节点服务器进行处理。
  2OpenSIPS中Dialog集群的基本思路
  和对注册集群的部署来说,dialog的集群相对比较简单。其中部分设置的思路是相同的。完整细节的配置说明,读者可以参考官方文档,这里仅为了后续部分章节中的内容支持,这里重点强调一些主要的知识点:
  • 在复制集群环境中,所有的节点被组成一个组,在同样的集群中使用anycast方式进行广播(非其他cast方式),关于其他cast方式的不同,读者参考网络资料。
  • 所有dialog数据在整个cluster中进行复制处理
  • 通过BIN 协议复制数据
  • 集群中的所有节点共享同一IP地址
  • 通过dialog的更新来实现节点数据的交互,例如,执行了re-ininvite等流程。
  dialog集群部署方式同时使用了一个tag 标签的形式,通过对节点标识标签的方式实现dialog节点的集群备份(HA)设置。另外,为了实现对呼叫的某些业务数据的共享,通过集群引擎,在dialog集群使用了共享profile的方式来实现集群文件共享。每个节点广播自己的共享profile文件,无需外部数据库支持。接下来的几个章节中,笔者将进一步介绍dialog标签在集群部署时代使用,节点共享dialog profile实现dialog 数据的同步共享。
  3OpenSIPS环境中dialog集群的tag标签说明
  笔者在前面很多文章中已经讲过,dialog是跟踪呼叫的手段。在呼叫过程中,dialog可以跟踪呼叫时长,CDR计费统计,请求处理等状态。读者可以先阅读以下文章:
  OpenSIPS学习笔记-Dialog的五种状态及配置示例
  dialog的tag标签是OpenSIPS中对节点业务进行管理的一个手段。在OpenSIPS的环境中,集群节点需要通过一定的标识来对业务流程中某些特定的流程做出标识处理,dialog上添加一个 tag标签对逻辑进行标识是一个比较好的方法。具体来说,dialog tag标签具有以下几个方面的特征:
  • 每个dialog指定到一个tag标签
  • 每个节点能够意识到所有被使用的tag标签
  一个活动的节点实例仅支持一个特定tag标签,活动的实例处理dialog的ping广播消息,dialog的生命周期管理
  如果一个活动的节点出现故障以后,备用节点将会启动来继续为标识的tag服务。这里将需要一个高可靠性处理,通过主备方式进行HA的处理。tag的状态将会迁移到另外一个备用的节点上。注意,一个节点可以支持多个活动的tag标签来支持多种业务需求。
  dialog 标签的语法设置相对比较简单,示例如下:
  loadmodule "dialog.so'
  modparam("dialog", "dialog replication cluster", 1)
  modparam("clusterer", "sharing tag", "vip=active")  // 另外一个做passive
  {
  create dialog();
  set_dlg_sharing_tag("vip");
  }
  具体关于OpenSIPS dialog 集群HA的处理示例。节点需要通过一个主从备份的方式,通过tag标签对呼叫业务中的特定流程进行跟踪处理。节点双方互相标识。基本的处理思路如下图例:
 
  此图例以及以下图例均来自于互联网资源
  在以上示例中,呼叫可能通过几个不同的节点来处理每个呼叫具体的流程,因此,各个节点的tag需要对其具体流程进行跟踪来监控一个完整的呼叫记录和CDR。为了保证你呼叫的流程的完整性,所有的dialog,包括后续请求的dialog都要通过具体的标签做记录备份,最后,所有节点共享dialog 文件数据。如果丢失了ACK 请求的dialog记录信息或者BYE的消息,系统就会丢失完整的CDR记录,当然也不可能继续在此记录上做计费的功能。
  4OpenSIPS中dialog集群的dialog profile讨论
  在分布式部署的OpenSIPS 平台的呼叫环境中,因为负载均衡或者其他的业务要求的需要,一个SIP呼叫可能通过不同的路径节点来实现。特别涉及到一些计费功能时,或者一些对呼叫数量有限制的场景中,dialog profile 也需要通过节点共享dialog profile,通过profile来限定一些服务要求。通过集群部署共享dialog profile是非常必要的。和注册集群的方式不同,注册集群需要数据库的处理来协同共享数据,但是,dialog profile 共享无需其他的外部资源,它仅需要OpenSIPS 集群模块引擎和BIN 响应来完成。通过集群方式共享Dialog profile有以下几个方面的特点:
  • 通过集群引擎可以共享 profile的meta data数据
  • dialog 文件复制各自独立
  • 无需要求外部数据库引擎中存储处理
  • 依赖BIN 协议配合工作
  • 每个节点仅广播属于自己的profile size
  • 每个节点通过收到的prifile总值介绍所有的size
  • 无需担心节点故障
  • 架构设计相对比较轻,相对比较有更高的效率
  dialog profile 设置语法如下:
  loadmodule "dialog.so"
  modparam("dialog', "profile replication cluster", 2)
  # 这里 b表示BIN 协议,也可以是s, 表示shared  通过noSQL 数据库处理
  modparam("dialog""profiles no value", "all calls/b")
  create_dialog();
  set_dis_profile("all_call/b") # /b使用方式同上
  5OpenSIPS环境下集群注册的配置
  集群部署是一个非常复杂的环境。在配置集群环境前,读者需要首先明确测试环境的配置和核心配置文件,还有节点之间的网络环境。特别是节点之间的网络需要保证都能够互相通信,相关的端口和安全策略必须一致。如果在基于云平台测试环境中,用户最好把所有的节点都部署在同一区域,保证你内网可以互通,而且安全策略可以互相信任。
  因为资源能力有限,相对于生产环境,笔者的测试环境仅限于一个集群平台,支持3-5个节点的互通。为了实现简单配置,笔者使用的是静态配置方式,通过界面数据库设置节点数据,而不是通过动态加载节点的方式来实现的,所以我们需要预设好所有的节点,假设节点环境配置和我们操作的节点数据,环境,安全策略都是相同的,并且能够正常共享数据库数据。
  首先,我们需要通过OpenSIPS 控制界面,添加集群节点数据,添加到主要参数包括:Cluster ID,Node ID,BIN URL和端口5555,SIP地址和具体节点描述信息。如果未安装OpenSIPS GUI的话,用户需要首先成功安装好GUI控制界面。特别提醒,笔者仅说明一个节点的配置,其他节点的配置也需要完全一致设置为我们示例的配置,但是一定要注意自己的node id和其他邻居节点的节点的地址和id的不同。
  通过控制界面添加了节点以后,然后修改cfg 配置文件,加载必要的集群引擎,数据库和BIN 协议配置:
  • 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 协议配置:
  • loadmodule "proto_bin.so"
  • listen = bin:eth0:5555 # 用户也可以监听IP地址
  添加以上必要设置以后,集群引擎停止,这里,一定要保证所有的节点的OpenSIPS能够停止,然后所有节点保证同步好所有数据以后,再重新开启。用户必须对集群中的各个节点需要做多次测试,保证数据库可以同步,保证BIN监控正常。经过一段时间的测试,各个节点数据能够正常以后,我们才能进行其他注册等业务功能的测试。如果节点之间都能够同步,集群服务器可以正常工作的话,用户可以通过集群命令看到其他节点的数据状态,其中一个节点执行以下命令,可以看到节点列表:
  • opensips-cli -x mi clusterer_list
  • opensips-cli -x mi clusterer_list_topology
  
  最后,如果所有节点可以正常通信以后,用户可以测试节点之间的连通性。具体测试方式很多,用户可以在本地通过防火墙命令过滤某个节点的IP(例如:ufw insert 1 allow from 节点IP to any),然后再通过以上命令查看这些节点的状态,然后在关闭过滤的节点地址重新检查所有节点状态。全部完成以上所有的节点的测试以后,我们才能继续进行下一步的全共享集群注册的配置示例操作。
  完成以上配置以后,笔者将在后续章节具体介绍如何配置集群注册示例(包括full sharing, federation 和no SQL配置),共享dialog profile配置示例,安装配置mongodb实现以上功能。
  6总结
  在本文章中笔者介绍了关于dialog 和dialog profile共享的配置处理流程。在对集群dialog的设置部署中,笔者介绍了dialog的HA设置方式和标签tag的设置,针对呼叫流程中不同的业务做标识处理,通过tag实现对节点呼叫的完整监控。另外,笔者也介绍了关于集群场景配置的非常重要的流程,包括基本的集群配置,节点配置和控制界面对节点的设置,然后介绍了通过防火墙过滤等手段如何对节点故障的测试。
  再次说明,笔者测试的集群节点必须都需要同步同一的配置场景,包括网络环境,安全策略和端口等状态都需要完全一致。在保证节点环境相同的情况下,我们才能继续进行集群注册部署配置和dialog profile共享配置的流程。另外,笔者测试环境相对简单,在生产环境中,可能很多用户需要根据自己的场景中一定的调整,笔者仅是抛砖引玉,希望读者对OpenSIPS的集群部署有一个完整清晰的概念,集群部署中涉及的太多细节需要通过不断实践才能完成。
  参考资料:
  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
  关于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,获得有价值的通信行业技术分享
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

相关阅读:

专题

CTI论坛会员企业