大规模sip信令存储、查询和实时跟踪的实现

15年前运营商的核心网还是七号信令(SS7),那时候的信令采集、监控和检测系统还很落后,基本上就是给交换部门一个实时跟踪呼叫的工具,尤其是查询历史信令,很麻烦,需要将某日的原始数据导入进数据库,再进行查询,相当麻烦而且查询速度超慢。当时一个朋友想挖掘呼叫的数据,于是我在本地网已经收敛好的信令上,做了一个信令采集、存储和快速检索系统,性能远超当时的中创信测系统,颇得运营商搞交换的弟兄好评。现在的IMS核心网已经是SIP了,如果重新设计一个类似的系统,可能吗?

信令采集系统需要采集全部的信令消息,其特点是数据很大,除了呼叫相关的信令消息还有注册消息,堪称海量。以10万注册分机的中等规模电力IMS为例,每日呼叫数约40万次,达320万个呼叫消息。注册及相关的消息更大,每天高达近7千万条消息。

最容易想到的是使用通用数据库,普通做企业应用的程序员(一般使用java),经常使用关系型数据库,但随着数据量的急剧增加,插入和检索的性能都很受影响,哪怕购买最强悍的硬件,也很难达到性能上的要求,最后的结果只能是限制时间,比如只能存储一个月的数据或者各种分表,不但可用性极差,存储和查询的性能也很难达到要求。实际上原先就运行了这么一个用Java+MySQL实现的系统:采集和存储使cpu达400%--全部跑满,查询慢如蜗牛,几分钟才出结果。

当然,也可以使用nosql类型的数据库,这个可能会好一点,不能彻底解决问题,而且换取一点性能提升仍然需要高成本的硬件投入,有没有一种更完美的解决方案呢?答案是肯定的。

让我们先来分析信令数据的特点:

1、数据只会增加,一旦生成了不会回过头去修改也不会逐条删除;因此关系型数据库的update、delete是不需要的操作,只要insert。关系型数据库可以排除。

2、sip信令消息都是文本,但不等长,每条消息数百字节到上千字节不等。

3、历史数据检索,一般是限定日期时间段,指定某个关键字进行检索,如主叫号码或被叫号码,呼叫ID、拒接码等。

根据这几个特点,我设定了目标:

1、使用自己设计的文件存储,简单,可扩展,不够加硬盘就可以。仅需一两台普通PC服务器,不需要特别大的硬件投入。

2、检索要很快,要在1秒内返回结果。

3、支持web查询,实时信令监控支持websocket推送。

设计方法简要列举一下:

1、使用C/C++开发,底层开发,保持高效率。

2、对应呼叫数据,从底层到上层可抽象为:原始信令文件,信令记录文件,CDR文件,CDR类似话单,话单一般接通了生成,CDR只要呼叫了就会生成,无论呼叫成功还是失败。CDR数据提供接口,可以导出到关系型数据库进行复杂的检索分析。

3、非呼叫数据,如分机注册数据,只有两个抽象:原始信令文件,信令记录文件

4、索引文件,简单的平坦单一索引,不使用B+数等更复杂的结构。

5、按记录条数来生成数据记录文件和索引,这样可避免单个的文件太大。

6、核心存储模块和查询检索模块分成两个进程,保证各自的稳定性。尤其是核心模块,对实时性要求比较高,需要稳定运行。

7、核心模块的信令采集和存储处理之间采用无锁的环形队列,保证高并发性和实时性。

上述设计在电力的IMS通信网中已经实现,效果相当不错。

你可能感兴趣的:(C/C++,实现,通信,大并发,大数据,SIP,信令采集)