如何处理大量的日志和redis?

时间:2012-07-29 22:53:55

标签: node.js performance logging heroku redis

假设我每秒都有大约150个请求进入api(node.js),然后在Redis中登录。按照这个速度,价格适中的RedisToGo实例每小时左右就会填满一次。

日志只需要生成每日\每月\年度统计信息:这是最受欢迎的关键字,这是最高请求的网址,每日请求的总数等。没有超级重的计算,但有点耗时运行数组以查看每个数组中最常见的元素。

如果我分析然后转储这些数据(在节点中使用setInterval函数可能?),比如每隔30分钟,这似乎不是什么大问题。但是如果突然间我必须处理每秒2500个请求呢?

我突然间每小时处理4.5~Gb的数据。每30分钟约2.25Gb。即使redis \ node有多快,计算最频繁的请求仍需要一分钟。

问题: 当处理2.25 gb的dada时,redis实例会发生什么? (从列表中,我想)

是否有更好的方法来处理潜在的大量日志数据,而不是将其移至redis然后定期刷新?

2 个答案:

答案 0 :(得分:6)

IMO,您不应该使用Redis作为缓冲区来存储日志行并在之后批量处理它们。为此消耗内存并没有多大意义。通过在单个服务器中收集日志并将其写入文件系统,您将获得更好的服务。

现在您可以使用Redis做的是尝试实时计算您的统计数据。这是Redis真正闪耀的地方。您可以直接存储和汇总需要计算的统计信息,而不是将原始数据保存在Redis中(以后再批量处理)。

例如,对于每个日志行,您可以将以下命令传递给Redis:

zincrby day:top:keyword 1 my_keyword
zincrby day:top:url 1 my_url
incr day:nb_req

这将计算当前日期的热门关键字,最高网址和请求数。在一天结束时:

# Save data and reset counters (atomically)
multi
rename day:top:keyword tmp:top:keyword
rename day:top:url tmp:top:url
rename day:nb_req tmp:nb_req
exec

# Keep only the 100 top keyword and url of the day
zremrangebyrank tmp:top:keyword 0 -101
zremrangebyrank tmp:top:url 0 -101

# Aggregate monthly statistics for keyword
multi    
rename month:top:keyword tmp
zunionstore month:top:keyword 2 tmp tmp:top:keyword
del tmp tmp:top:keyword
exec

# Aggregate monthly statistics for url
multi    
rename month:top:url tmp
zunionstore month:top:url 2 tmp tmp:top:url
del tmp tmp:top:url
exec

# Aggregate number of requests of the month
get tmp:nb_req
incr month:nb_req <result of the previous command>
del tmp:nb_req

在月末,该过程完全相似(在月度数据上使用zunionstore或get / incr来汇总年度数据)。

这种方法的主要好处是每个日志行的操作数量有限,而月度和年度汇总可以轻松计算。

答案 1 :(得分:1)

如何使用flume或chukwa(或者甚至是scribe)将日志数据移动到不同的服务器(如果可用) - 您可以使用hadoop / hbase或任何其他基于磁盘的存储来存储日志数据。

https://cwiki.apache.org/FLUME/

http://incubator.apache.org/chukwa/

https://github.com/facebook/scribe/