亿级数据的统计系统架构


公司的统计系统经历了两次比较大的架构变动:

1.数据直接入库的实时分析->

2.数据写入日志文件再归并入库的非实时分析(及时性:天)->

3.数据写入日志文件归并入库,建立不同维度的缓存表, 结合数据仓库(及时性:小时)

当前的系统状况:

数据源:Goolge Analytics / WebServer Log

数据库记录:5亿+

单表最大记录:1.2亿+

服务器数量:三台

1.日志存储服务器

2.日志分析服务器

3.数据库存储服务器

架构示意图:


日志存储服务器:普通时段每秒钟记录2000+条访问

1.从CDN下载Web server日志

2.对点出的日志进行直接存储

日志分析服务器:

从GA/WebServer得到数据后,使用Python多进程并行分析,分析后的数据直接写入数据库中。

数据库存储服务器:

存储引擎:MySQL Myisam、InfoBright(Community)

为了提高查询效率,建立有不同维度的数据表,InfoBright引擎存储相对稳定、不会进行变更的数据,因为Community版进行数据变更成本很高,你们懂得

关于日志分析:

Python的gzip模块能够直接读取压缩过的日志进行分析,相当节省磁盘空间。

由于分析过程使用大量的CPU资源,使用Python的多进程充分利用多核CPU。由于GIL的缘故,多线程不要考虑了。

另外用到了psyco,仅仅多了两行代码,分析效率成数十倍的提高。

关于查询性能:

当前最慢的查询时间应该是跨年度的分组查询,小于20秒。这里其实可以通过再次归并,增大记录粒度的方式优化到更快,只是有这种查询需求的并不多,这个时间也能接受。

另外值得一提的是InfiniDB,实测效果相当惊人,比InfoBright还要快好多倍,只是数据压缩比并不高,并且一些SQL并不支持,此引擎可以列入下次的架构调整中