【问题标题】:How to deal with a large amount of logs and redis?如何处理大量的日志和redis?
【发布时间】:2016-01-22 18:02:46
【问题描述】:

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

日志只需要生成每日\每月\每年的统计信息:哪个是请求最多的关键字,哪个是请求最多的url,每天的请求总数等。没有超繁重的计算,但有点耗时遍历数组以查看每个数组中出现频率最高的元素。

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

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

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

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

【问题讨论】:

    标签: node.js performance logging heroku redis


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了。您如何建议定期从 zlist 中删除仅增加 1 的值?我担心的是,如果查询量非常大,可能 85% 的查询将是唯一的,因此会添加到 zlist 中,这就是我想以我的方式处理它们的原因。
    • zremrangebyrank 定期?
    • 另外,例如 day:top:keyword 似乎每天都会被覆盖 - 假设我需要复制数据以显示在其他地方的仪表板上 - 我只是在之前复制数据吗在一天结束时运行这些命令并对月\年执行相同的操作?
    • 是的,您可以定期对 zremrangebyrank 运行守护程序(但您只会在一天结束时获得估计,而不是准确的值)。要保留数据历史记录,您只需将 tmp:top:xxxx 值重命名为 12JAN:top:xxxx 之类的名称,而不仅仅是删除它们。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多