2

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

日志只需要生成每日\每月\每年的统计信息:哪个是请求最多的关键字,哪个是请求最多的 url,每天的请求总数等。没有超繁重的计算,但是通过数组运行有点耗时看看哪个是每个中最常见的元素。

如果我分析然后转储这些数据(可能在节点中使用 setInterval 函数?),比如说,每 30 分钟一次,这似乎没什么大不了的。但是,如果我突然不得不处理每秒 2500 个请求怎么办?

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

问题:在处理 2.25 GB 的数据时,redis 实例会发生什么?(我想来自一个列表)

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

4

2 回答 2

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 对月度数据进行汇总,以汇总年度数据)。

这种方法的主要好处是为每个日志行完成的操作数量是有限的,而每月和每年的聚合可以很容易地计算出来。

于 2012-07-30T10:41:32.033 回答
1

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

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

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

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

于 2012-07-29T23:30:05.137 回答