最近一直在考虑架构的事情,有一个问题依然困扰着咱们这些作业务系统的,那就是日志以及日志统计。大概的问题以下:javascript
咱们有不少模块,日志格式虽然相似但都写在各自的服务器和目录中。java
日志中有不少信息是key=>value格式的数据。web
一般一个功能上线后,PM或者需求方都会要求一些统计数据以及报表之类,用来跟踪功能的使用效果。一般PM是不懂写程序的,所以统计数据的事情多半又提给RD。算法
这种统计数据和报表,价值随着时间的流逝而递减,到了某个时间就再也不有价值,再也不有人关心,而统计程序还在跑,保不齐哪天又要维护,都忘了部署在哪了。mongodb
日志存储占用空间,须要按期删除数据库
web服务器镜像不少,日志一般也是多份,处理时须要合并服务器
web服务器有时要调整,下线了web服务器通常日志也就丢了架构
我是个懒人,作好了功能以后,对于这种数据统计的需求一般都很反感,由于数据挖掘这种事情总的来讲很考验灵感,因此需求总变化,今儿要这样的数,明儿要那样的数。一个理想状况是PM都会SQL,而后RD把数据都灌入数据库,之前咱们组的那几个NB的PM还在的时候,常常这么搞的,如今是不行了。还有一个问题就是数据库不是schema free的,格式不那么自由,须要事先设计好,这也架不住需求老变。app
日志统计这种事情,一般有如下特色:异步
大数据量,天天可能有上G的数据(业务数据)
写频繁,读不频繁(几乎每一个PV都会产生若干条日志数据)
统计服务能够任务化,不须要实时
不准要绝对的数据一致性
按照这个特色,MongoDb算是挺合适的选择,缘由是:
schema free,随时能够加须要的字段进去
可扩展性极佳,不用太担忧存储空间不够问题
写的时候能够异步,不用太担忧占用请求响应的时间
对于collection,能够规定固定大小(capped collection) ,好比100G,这样mongodb会按照LRU算法来复用空间,不用惦记着删日志
能够支持通常的查询条件和汇集,而且提供Javascript Shell,这样可让有志于本身分析数据的PM自学编写统计脚本,最终让RD摆脱这样的工做
虽然培养RD的产品意识是好的,但统计产品使用数据这样的事情,确确实实让RD提不起兴趣,之前部门曾有过一个产品,从各产品线抓取数据而后记录在数据库并提供报表展现,但总的来讲灵活性很低,一来双方要定接口,二来统计的事情其实仍是要RD作好,只是省下了作数据展示的工做。
如今的想法是搭建mongodb集群,用来集中存储业务日志的数据,而后在mongodb之上搭建一个平台用于处理通常的数据统计需求,容许编写一些任务放在平台上运行,而这些任务能够用统一的javascript语言来编写。对于相对小数据量(咱们的业务系统,相比较检索端的日志来讲算是小数据量了,一天上G数据都算大的)的需求来讲,不失为一种不错的方案,主要目的是解决维护和管理的问题。