Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何处理大量日志和redis?_Node.js_Performance_Logging_Heroku_Redis - Fatal编程技术网

Node.js 如何处理大量日志和redis?

Node.js 如何处理大量日志和redis?,node.js,performance,logging,heroku,redis,Node.js,Performance,Logging,Heroku,Redis,假设我每秒有大约150个请求进入一个api(node.js),然后登录到Redis。按照这种速度,价格适中的实例大约每小时就会填满一次 日志仅用于生成每日\每月\年度统计信息:哪一个是请求最多的关键字,哪一个是请求最多的url,每天的请求总数,等等。无需进行超繁重的计算,但需要花费一些时间来运行数组,以查看每个数组中哪一个是最频繁的元素 如果我分析并转储这些数据(可能在node中使用setInterval函数?),比如说,每30分钟一次,这看起来并不是什么大问题。但是如果突然间我不得不处理,比如

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

日志仅用于生成每日\每月\年度统计信息:哪一个是请求最多的关键字,哪一个是请求最多的url,每天的请求总数,等等。无需进行超繁重的计算,但需要花费一些时间来运行数组,以查看每个数组中哪一个是最频繁的元素

如果我分析并转储这些数据(可能在node中使用setInterval函数?),比如说,每30分钟一次,这看起来并不是什么大问题。但是如果突然间我不得不处理,比如说每秒2500个请求呢

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

问题: 在处理价值2.25 gb的数据时,redis实例会发生什么情况?(我想是从一张单子上)


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

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


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

现在你可以用Redis来实时计算你的统计数据。这就是Redis真正闪耀的地方。您可以直接存储和聚合需要计算的统计数据,而不是将原始数据保存在Redis中(稍后将进行批处理)

例如,对于每个日志行,可以通过管道将以下命令传输到Redis:

zincrby day:top:keyword 1 my_keyword
zincrby day:top:url 1 my_url
incr day:nb_req
这将计算当天的顶级关键字、顶级URL和请求数。一天结束时:

# 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
#保存数据并重置计数器(原子)
多种
重命名日期:top:关键字tmp:top:关键字
重命名日期:top:url tmp:top:url
重命名日期:nb_请求tmp:nb_请求
执行官
#只保留当天排名前100的关键字和url
zremrangebyrank tmp:顶部:关键字0-101
zremrangebyrank tmp:顶部:url 0-101
#关键字的汇总月度统计信息
多种
重命名月份:top:关键字tmp
zunionstore月份:top:关键字2 tmp tmp:top:关键字
del tmp tmp:top:关键字
执行官
#url的汇总月度统计信息
多种
重命名月份:top:url-tmp
zunionstore月份:top:url 2 tmp tmp:top:url
del tmp tmp:top:url
执行官
#当月的请求总数
获取tmp:nb_请求
增加月份:不需要
del tmp:不需要
月底时,过程完全相似(使用zunionstore或get/incr对月度数据进行汇总)


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

这太棒了。您建议如何定期从zlist中删除仅递增1的值?我担心的是,在数量非常大的情况下,可能85%的查询将是唯一的,因此会添加到zlist中,这就是我希望以定期处理的方式处理它们的原因。zremrangebyrank?还有,例如,day:top:keyword似乎会在新的一天被覆盖-比如说我需要复制数据以显示在其他地方的仪表板上-我是否只需在一天结束时运行这些命令之前复制数据,并在month\year中执行相同的操作?是的,您可以定期运行zremrangebyrank的守护程序(但你只会在一天结束时得到估计值,而不是准确的值)。要保留数据的历史记录,你只需将tmp:top:xxxx值重命名为类似于12JAN:top:xxxx的值,而不是仅仅删除它们。