发明内容
本发明要解决的技术问题是提供一种采集,分析,存储海量数据,针对多个查询终端的数据查询或检索请求,系统能够快速,准确,均衡的将数据返回给查询终端想要检索的数据的,基于网络数据的通用查询系统及查询方法。
本发明采用的技术方案如下:一种基于网络数据的通用查询系统,其特征在于:包括分析服务器;所述分析服务器包括,
采集网络所有出口数据的数据流采集模块;
对数据包进行分析的分析模块;
对分析后的数据包进行存储的存储模块;
对存储的数据包进行查询的查询模块。
数据流是指满足某一特征的一组数据包(比如数据包的源IP地址和目的IP地址分别是A和B,那么所有具有该特征的数据包叫做数据流,也叫IP会话流)。
原始数据包是二进制数据,识别就是按照OSI七层协议模型来解释数据包的二进制数据。比如一个TCP数据包,从物理层,数据链路层,网络层到传输层,依次识别其二进制数据为其对应的协议和字段,并将协议和字段保存到识别结果中。识别是分析的基础,识别后,知道每个数据包属于什么协议。分析时,根据协议来进行数据统计。
统计数据是指在某个时间范围内,针对数据流的一些字段(总数据包数,总字节数)进行统计。
所述数据包分析模块,包括,
数据包识别模块,识别数据包二进制数据所对应的协议和字段作为识别结果;
分析线程池调度模块,调度一个分析线程对所述识别结果和原始数据包进行分析;
数据分析模块,将数据包按照不同的协议进行数据包统计。
数据分析主要是将数据按不同的协议进行数据统计,比如:IP协议统计总字节数,TCP协议统计重传次数。
所述数据包分析模块还包括数据包缓存模块,用于存放数据包识别后的识别结果和原始数据包;
跨秒检测模块,检查数据包收集一旦跨秒,则提交当前缓存数据到分析线程池。
数据包的时间戳精度为纳秒,每收集完1秒的数据包,就进行后面的分析流程,2015/11/25 23:05:01:999999999 到 2015/11/25 23:05:02:111111111便是跨秒。
所述存储模块包括,
合并线程模块,根据所要查询的数据的时间范围,确定所要用的时间桶和时间桶的个数;
时间桶间隔时间判断模块,计算当前时间是否满足各个时间桶的时间间隔;
时间桶合并模块,将满足各个时间桶时间间隔的对应的时间桶进行合并;
数据压缩存储模块,合并线程在合并完成后,将合并结果提交给存储线程,存储线程将数据压缩后写入磁盘。
所述查询模块包括,
查询监听模块,监听客户端的查询请求;
查询线程启动模块,启动查询线程开始查询流程;
查询时间校正模块,对查询时间进行校正,计算要查询的时间桶和时间桶的点数;
查询条件设置模块,设置要用于检索数据的查询条件;
记录合并模块,将查询到的各个时间桶的点多数据进行合并;
查询数据返回模块,将查询到的数据返回给客户端。
所述查询模块还包括压缩模块,对查询到的数据进行压缩后返回给客户端。
所述查询线程启动模块有两个以上的查询线程与两个以上的查询客户端一一对应。
一种基于网络数据的通用查询方法,具体方法步骤为:
一、采集网络所有出口数据的数据流(如网络中出口交换机的数据流);
二、对数据包进行分析;
三、对分析后的数据包进行存储;
四、对存储的数据包进行查询。
其中,所述步骤二的具体方法步骤为:
2.1、识别数据包二进制数据所对应的协议和字段作为识别结果;
2.2、调度一个分析线程对所述识别结果和原始数据包进行分析;
2.3、将数据包按照不同的协议进行数据包统计。
所述步骤2.1和步骤2.2之间的步骤还包括,将数据包识别后的识别结果和原始数据包存入数据包缓存中;检查数据包收集一旦跨秒,则提交当前缓存数据到分析线程池。
所述步骤三的具体方法步骤为:
3.1、合并线程,根据所要查询的数据的时间范围,确定所要用的时间桶和时间桶的个数;
3.2、计算当前时间是否满足各个时间桶的时间间隔,是则进入下一步,否则继续等待;
3.3、将满足各个时间桶时间间隔的对应的时间桶进行合并;
3.4、合并线程在合并完成后,将合并结果提交给存储线程,存储线程将数据压缩后写入磁盘。
如果查询1天的数据,查询1秒桶,需要查询3600*24个点(1个点为1秒)的数据;如果查询1小时桶,需要查询24个点的数据(1个点1小时),这就是合并的意义:快速提高查询效率。合并线程通过计算当前时间是否满足各个桶的间隔时间(比如:从2015/11/25 00:00:00开始,00:00:10时,合并第一个10秒点,00:00:20时,合并第二个10秒点,其余类似,00:01:00时,合并第一个1分钟点,00:10:00时,合并第一个10分钟点,01:00:00时,合并第一个1小时点,2015/11/26 00:00:00时,合并第一个1天点),若满足,则合并对应桶。一共6个时间桶(时间间隔:1秒,10秒,1分,10分,1小时,1天)。
所述步骤四的具体方法步骤包括:
4.1、监听客户端的查询请求,判断是否有查询请求,是则进入下一步,否则继续监听;
4.2、启动并分配查询线程开始查询流程;
4.3、结合服务器最新分析时间和最早分析时间,对查询时间进行校正,计算要查询的时间桶和时间桶的点数;
4.4、根据检索数据过滤条件,找出所有请求字段的依赖字段,并将请求字段和依赖字段作为要查询的字段;
4.5、将校正后的查询时间、要查询的时间桶、要查询的时间桶的点数和查询的字段传给存储模块;
4.6、存储模块每读完一个点的数据,就回调给查询模块的数据解析函数,根据过滤条件中的键值字段进行第一次过滤;
4.7、将查询到的时间桶的多个点的数据进行合并;
4.8、根据过滤条件中的非键值字段进行二次过滤;
4.9、将查询到的数据进行压缩后返回给客户端。
回溯分析服务器监听到客户端的查询请求,线程池启动新查询线程开始查询流程;校正查询时间,计算要查询的桶和查询的点数(共6个时间桶,1秒,10秒,1分,10分,1小时,1天,表示每个点的时间单位);根据查询的开始时间和结束时间(该开始时间和结束时间是查询请求终端传给服务器的参数,然后结合服务器分析最新时间和服务器最早分析时间,来校正查询时间:max(开始时间,服务器最早分析时间,min(结束时间,服务器最新分析时间))),计算需要查询桶的组合,比如需要查询70分钟数据,需要查询一个小时桶加上一个10分钟桶。
针对过滤条件,解析出请求的字段;根据请求的字段,找出所有字段的依赖字段(在查询该字段时,需要先查询出的字段。比如:每秒字节数的依赖字段是总字节数,因为每秒字节数=总字节数/查询时间段),并将两者(请求字段,依赖字段)作为要查询的字段;
过滤条件(其作用主要用于检索数据,比如:我想查询一个时间段总字节数大于100字节的数据,这时就需要过滤器。过滤器是基于字段的。系统内部内置了大量字段,过滤器将字段用&&,||,and,or组合起来便可以进行过滤,比如:(协议=IP)&&(发送字节数>100字节)):(表达式1&&(表达式2||表达式3)&&(表达式4||表达式5)),其中&&可以用and替代,||支持用or替代,表达式支持>,>=,<,<=,=,!=.
键值字段,与数据库表中的主键一致,表示数据表中能够表示唯一性的一个或几个字段;
合并记录:由于查询的数据是多个点的数据,而存储是每个点返回一次,所以,需要将查询到的点的数据进行合并(比如查询的是10个点,其中只有5个点有数据,每个点的总字节数都是20字节,合并就是将5个点的20字节相加,合并后为100字节;注意:不同的字段,合并算法不一样);
第二次过滤:根据过滤条件中的非键值字段进行二次过滤;这部分字段大部分是通过计算得出的,只有在合并后,才能得出结果,所以只能在合并后过滤;
压缩并返回查询结果:由于一般查询结果数据量比较大,压缩一方面降低网络的负担,另一方面提高传输效率。
与现有技术相比,本发明的有益效果是:
1、能够指定时间范围进行查询,这个时间范围只要在服务器的开始分析和最新能够分析时间内,都有效,而且这些都是对历史数据进行查询,回溯更形象的表现查询历史数据这种方式;
2、能够查询海量的数据。(查询天桶,每个点为1天,控制台一次支持查询240个点,也就是240天的数据,服务器支持2Gbps,240天就是2G*3600*24*240=41472000Gb)。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本说明书(包括摘要和附图)中公开的任一特征,除非特别叙述,均可被其他等效或者具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
如图1所示,在网络中,找到出口交换机,并把流量复制一份给回溯分析服务器;配置服务器,选择抓包网卡进行抓包并分析。其中,回溯分析服务器负责数据包的抓取,分析和存储,并提供高性能的查询服务,支持控制台查询,支持API接口查询。
首先对数据包进行识别。原始数据包是二进制数据,识别就是按照OSI七层协议模型来解释数据包的二进制数据。比如一个TCP数据包,从物理层,数据链路层,网络层到传输层,依次识别其二进制数据为其对应的协议和字段,并将协议和字段保存到识别结果中。识别是分析的基础,识别后,知道每个数据包属于什么协议。分析时,根据协议来进行数据统计。
数据包识别以后,将识别结果数据和原始数据存入数据包缓存中;检测数据包时间一旦跨秒,提交当前缓存数据到分析线程池(在本具体实施例中,线程池有3个线程,每个分析任务一到来,线程池便指派其中一个空闲线程去执行分析任务),分析线程池调度一个线程对该缓存的数据进行分析。
分析线程在分析完成后,将分析结果提交给合并线程,合并线程通过计算当前时间是否满足各个桶的间隔时间,若满足,则合并对应桶。合并线程在合并完成后,将合并结果提交给存储线程,存储线程将数据压缩后写入磁盘。
如图2所示,回溯分析服务器监听到客户端的查询请求,线程池启动新查询线程开始查询流程;校正查询时间,计算要查询的桶和查询的点数(共6个时间桶,1秒,10秒,1分,10分,1小时,1天,表示每个点的时间单位);根据查询的开始时间和结束时间,计算需要查询桶的组合,在本具体实施例中,需要查询70分钟数据,需要查询一个小时桶加上一个10分钟桶。
针对过滤条件,解析出请求的字段;根据请求的字段,找出所有字段的依赖字段作为要查询的字段;将校正后的查询时间,要查询的桶,查询的点数和查询的字段传给存储模块;
第一次过滤:存储每读完一个点的数据,就回调查询模块的数据解析函数,此时根据过滤条件中的键值字段进行第一次过滤;
合并记录:由于查询的数据是多个点的数据,而存储是每个点返回一次,所以,需要将查询到的点的数据进行合并;
第二次过滤:根据过滤条件中的非键值字段进行二次过滤;这部分字段大部分是通过计算得出的,只有在合并后,才能得出结果,所以只能在合并后过滤;
压缩并返回查询结果:由于一般查询结果数据量比较大,压缩一方面降低网络的负担,另一方面提高传输效率。