日志系统是一个完整信息系统的重要组成部分,海量的日志信息一方面可以挖掘出用户的通用行为模式,提高系统的服务质量,另一方面还为系统优化,系统结构调整提供了依据,在面对高并发量的系统访问时,及时准确的收集日志成了日志分析的关键,传统日志信息的记录与业务系统代码交织,耦合过高,日志的记录因占用系统的资源进而影响正常业务系统的运行。为了改善这一现状,本文提出了一种与原业务系统零耦合的新设计方式,该方式从网络请求的负载均衡、分布式集群服务、服务中的多线程处理、和非关系型数据库MongoDb的分片拓展四个维度展开,实现了一套异步、分布、并行处理的日志记录系统,后经千万级数据量的压测,从系统吞吐能力,系统内存占用情况等多个方面证实了设计的可行性与强稳定性。
日志是用来记录用户行为信息和相关服务运行情况的文档, 日志的挖掘和分析对于指导系统主要业务的开展和系统运行情况的监控有着重要的意义[1],日志挖掘的前提是大数据量的日志信息,在面对超高并发量的系统访问时,及时准确的收集日志成了日志分析的关键,大数据时代,日志的记录既要满足高并发的需求,又要与核心业务系统做到零耦合,关系型数据库由于其事务的复杂性,不易拓展性已经不能满足高并发,海量数据的环境。非关系型数据库由于其模式自由便于拓展,在处理高并发写入时有着天然的优势[2],MongoDb 是非关系型数据库的一种,它使用的面向文档的数据模型,可以自动将数据拆分存储在不同的机器上,这种高效的拓展性,分散了高并发的写入的同时又支持海量数据[3]。在面对巨大的写入并发时, 单机版单线程的服务已经很难满足需求, 本文旨在实现一种分布式多线程并行写入的日志架构。
2. 设计的核心架构 软件定义下架构实际是利用不同的软件对硬件资源进行再分配, 高并发记录日志的核心思想体现在均衡化上,将高并发的请求首先在在网络层进行差分[4],利用Ngnix 的负载匀衡功能,将实际的网络请求规则性的差分到不同的服务器组上, 应用程序先把请求封装成对象暂时存于内存中, 日志系统的底层中多个线程同时获取内存中对象存入MongoDb 中, 然后将内存对象销毁释放内存, 在MongoDb 中也做了相应的分流, 利用MongoDb 的分片技术,将集合分成不同的chunk 存于多个片中[5]。设计的整体框架图如图1 所示。
当记录日志的请求来临时,经过纵向的多次拆分与内存的暂存作用,从而解决解决高并发的写入问题,下面将框架中每项技术逐个进行说明。
2.1. 运用JSONP 实现零耦合设计 传统的日志记录代码内嵌在业务代码中,日志记录与业务处理耦合在一起,存在着效率低,资源争夺,可重用性差等缺点,本次设计将处理日志的系统从主业务系统剥离,构建了一套完全独立的日志系统,日志记录的网络请求有页面端异步发起,但是由于同源策略的限制,XmlHttpRequest 只允许请求当