一种日志分布式收集及存储方法

文档序号:7867987阅读:264来源:国知局
专利名称:一种日志分布式收集及存储方法
技术领域
本发明涉及计算机技术领域,尤其涉及一种日志分布式收集及存储方法。
背景技术
在分布式网络与高性能系统中,一定时间内,从多个节点收集并处理的数据是很多的,单个数据库系统的数据处理能力有限,怎样提高高流量数据收集、处理及存储能力,是一个亟待解决的问题。目前,普遍采用syslog-ng日志收集服务器来收集处理日志。当多个客户端将日志发送给中央日志服务端时,由服务端统一写入数据库。但是syslog-ng将大量数据写入命名管道时,如果正好在读取管道的数据,这样写操作会阻塞。而且syslog-ng作为日志服务器集中往数据库写日志时,事务到达频繁,大量的数据库IO操作,会成为系统性能的瓶颈,影响系统的实时性和可用性。

发明内容
本发明的目的是为了克服现有技术的缺陷,提供一种日志分布式收集及存储方法,通过该方法改善客户端与日志服务器传输的效率,改善日志服务器与数据库操作的吞吐量。一种日志分布式收集及存储方法,其具体流程为各客户端节点收集的日志缓存在一个数组容器中,Protobuf序列化后通过回调函数发送给远程日志收集服务器,一次大量发送比通过管道多次少量发送要高效,采用tcp/ip协议进行数据交互,发送端对数据序列化,接收端对数据反序列化;为了维护长连接,客户端定期发送心跳包判断日志服务端是否在线,若在线则日志服务端对心跳包响应;调度器I对连接来的fd统一调度,并将处理好的数据放在数据缓存池中,调度器2从数据缓存池中取一定数量数据后,发送给远程终端,计算机远程终端收到数据后,将数据写入数据库。本发明技术方案带来的有益效果通过本发明将日志进行分布式收集及存储不仅改善了客户端与日志服务器传输的效率,还改善了日志服务器与数据库操作的吞吐量,提高了系统的实时性和可用性。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲, 在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。图1是本发明方法的整体流程图;图2是本发明中调度器I对客户端发送来的数据进行处理的流程图;图3是本发明中调度器2将调度器I处理好的数据发送给远程终端系统的流程图。
具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。本发明提供的一种日志分布式收集及存储方法,其所要解决的问题是将客户端日志能快速的发给远程日志收集服务器,日志收集服务器能有效的往数据库写日志。整个发明流程图如图1所不。各客户端节点收集的日志缓存在一个数组容器中,Protobuf序列化后通过回调函数发送给远程日志收集服务器,在以下四种情况下,发送回调函数将被调用。I)当缓存数量达到数据高水位级别时。2 )当缓存时间达到时间高水位级别时。3)当缓存数量达到数据临界水位时。4)当缓存时间达到时间临界水位时。其中,数据高水位发送数据操作,使得输出缓 冲区的数据量在此级别或者更高时,发送回调函数将被调用。数据临界水位发送数据操作,使得输出缓冲区的数据量在此级别,并且时间间隔达到一定时,发送回调函数将被调用。时间高水位发送数据操作,时间间隔在此级别或者更高时,发送回调函数将被调用。 时间临界水位发送数据操作,时间间隔在此级别,并且输出缓冲区的数据量达到一定时,发送回调函数将被调用。发送数据先缓存在数组容量里,一次大量发送比通过管道多次少量发送要高效。采用tcp/ip协议进行数据交互,发送端对数据序列化,接收端对数据反序列化。为了维护长连接,客户端定期发送心跳包判断日志服务端是否在线,若在线则日志服务端对心跳包响应。调度器I对连接来的fd (file descriptor)统一调度,并将处理好的数据放在数据缓存池中,调度器2从数据缓存池中取一定数量数据后,发送给远程终端,计算机远程终端收到数据后,将数据写入数据库。其中,调度器I对客户端发送来的数据进行处理,其处理流程如图2所示,具体为主线程负责监听客户端的建立连接请求,然后将这次连接设置为非阻塞。将返回的fd轮询放入不同的处理数据线程队列中,以达到负载均衡。完成此操作后,通过管道发送一个字节通知process_data_thread线程。process_data_thread线程负责处理已经建立好连接的读写等事件,先将数据反序列化,并将处理好的数据放在数据缓存池中,交给调度器2来统一调度。其中,调度器2主要负责将调度器I处理好的数据发送给远程终端系统,具体流程如图3所示,具体为
发送线程Send_data_thread从数据缓存池中取一定数量数据后,发送给远程终端,计算机远程终端收到数据后,将数据写入数据库。每一个发送线程Send_data_thread实际通信的远程终端负载数Sn_load,图3中虚线框部分起的作用是,维护每一个线程Send_data_thread实际通信的n_load数,以达到负载均衡。以下主要对虚线框部分进行详细说明。每一台计算机远程终端的fd和ip地址等信息存储在peer_add的结构体中,远程终端与发送线程Send_data_thread通信活动连接的peer_add放在active堆中,心跳包检测超时的远程终端peer_add放在inactive链表中,由线程Work_thread来维护。active堆是一个最小堆,每一个节点对应着一个发送线程Send_data_thread,节点存储有相应的peer_add结构、负载数n_load,。堆按照负载数n load排序,在最小堆中父节点n_load小于儿子节点的n_load。inactive链表里存储的是心跳超时的远程终端ip, Work_thread进程定时ping这些超时的远程终端,如果ping得通,还得重新发起新的连接,并将建立起连接的peer_add结构,交给active中n_load小的节点,动态调节每个send_data_thread的n_load数,并更新堆。通过本发明不仅改善了客户端与日志服务器传输的效率,还改善了日志服务器与数据库操作的吞吐量。以上对本发明实施 例所提供的一种日志分布式收集及存储方法进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
权利要求
1.一种日志分布式收集及存储方法,其特征在于,该方法具体为各客户端节点收集的日志缓存在一个数组容器中,ProtobUf序列化后通过回调函数发送给远程日志收集服务器,一次大量发送比通过管道多次少量发送要高效,采用tcp/ip协议进行数据交互,发送端对数据序列化,接收端对数据反序列化;为了维护长连接,客户端定期发送心跳包判断日志服务端是否在线,若在线则日志服务端对心跳包响应;调度器I对连接来的fd统一调度,并将处理好的数据放在数据缓存池中,调度器2从数据缓存池中取一定数量数据后,发送给远程终端,计算机远程终端收到数据后,将数据写入数据库。
2.根据权利要求1所述的方法,其特征在于,发送回调函数将被调用的情形为当缓存数量达到数据高水位级别时;当缓存时间达到时间高水位级别时;当缓存数量达到数据临界水位时;当缓存时间达到时间临界水位时;其中,数据高水位是指发送数据操作,使得输出缓冲区的数据量在此级别或者更高时;数据临界水位是指发送数据操作,使得输出缓冲区的数据量在此级别,并且时间间隔达到一定时;时间高水位是指发送数据操作,时间间隔在此级别或者更高时;时间临界水位是指发送数据操作,时间间隔在此级别,并且输出缓冲区的数据量达到一定时。
3.根据权利要求1所述的方法,其特征在于,调度器I对客户端发送来的数据进行处理的流程为主线程负责监听客户端的建立连接请求,然后将这次连接设置为非阻塞;将返回的fd轮询放入不同的处理数据线程队列中,以达到负载均衡;完成此操作后,通过管道发送一个字节通知process_data_thread线程,process_data_thread线程负责处理已经建立好连接的读写事件,先将数据反序列化,并将处理好的数据放在数据缓存池中,交给调度器2来统一调度。
4.根据权利要求1所述的方法,其特征在于,调度器2负责将调度器I处理好的数据发送给远程终端系统,具体为发送线程Send_data_thread从数据缓存池中取一定数量数据后,发送给远程终端,计算机远程终端收到数据后,将数据写入数据库。
5.根据权利要求4所述的方法,其特征在于,每一个发送线程Send_data_thread实际通信的远程终端负载数为n_load。
6.根据权利要求1或4所述的方法,其特征在于,每一台计算机远程终端的fd和ip地址等信息存储在peer_add的结构体中,远程终端与发送线程Send_data_thread通信活动连接的peer_add放在active堆中,心跳包检测超时的远程终端peer_add放在inactive链表中,由线程Work_thread来维护。
7.根据权利要求6所述的方法,其特征在于,active堆是一个最小堆,每一个节点对应着一个发送线程Send_data_thread,节点存储有相应的peer_add结构、负载数n_load,堆按照负载数n_load排序,在最小堆中父节点n_load小于儿子节点的n_load。
8.根据权利要求6所述的方法,其特征在于,inactive链表里存储的是心跳超时的远程终端ip,ffork_thread进程定时ping这些超时的远程终端,如果ping得通,还得重新发起新的连接,并将建立起连接的peer_add结构,交给avtive中n_load小的节点,动态调节每个send_data_thread的n_load数,并更新堆。
全文摘要
本发明公开了一种日志分布式收集及存储方法,该方法采用tcp/ip协议进行数据交互,发送端对数据序列化,接收端对数据反序列化。为了维护长连接,客户端定期发送心跳包判断日志服务端是否在线,若在线则日志服务端对心跳包响应。调度器1对连接来的fd(file descriptor)统一调度,并将处理好的数据放在数据缓存池中,调度器2从数据缓存池中取一定数量数据后,发送给远程终端,计算机远程终端收到数据后,将数据写入数据库。通过本发明不仅改善了客户端与日志服务器传输的效率,还改善了日志服务器与数据库操作的吞吐量,提高了系统的实时性和可用性。
文档编号H04L29/08GK103036961SQ20121052464
公开日2013年4月10日 申请日期2012年12月7日 优先权日2012年12月7日
发明者柯宗贵, 柯宗庆, 杨育斌, 张道磊 申请人:蓝盾信息安全技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1