亿级数据的统计系统架构
公司的统计系统经历了两次比较大的架构变动:
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并不支持,此引擎可以列入下次的架构调整中