【问题标题】:time series logging/statistics - scalable solution时间序列记录/统计 - 可扩展的解决方案
【发布时间】:2013-05-18 06:16:16
【问题描述】:

查询数据库或日志文件以获取正常运行时间信息或每个给定时间间隔的请求数是很常见的。

随着您收集的数据越来越多,SQL 查询或日志爬取变得越来越慢(想象一下 1000 万个表行/日志行)。

典型问题:

  • 过去 x 个月我们处理了多少任务?
  • 我们的服务在过去 X 时间段内的可用性如何?
  • 过去一小时的平均请求数是否高于过去 1 天的平均值?

我想使用一些键值存储:许多具有不同自动过期的存储桶 - 所以我们可以研究例如10 分钟/1 小时/1 天存储桶并汇总所有项目,并自豪地说“在过去 10 分钟内,我们处理了 10^6 个请求”。

我确信 MongoDB 或 Redis 在存储桶中提供时间到期 - 我只是有点担心实现是否简单。

你会如何解决这个问题?你知道更好的工具来完成这项任务吗?

(我们的项目是用java和python编写的)

【问题讨论】:

  • 我的第一个想法是使用一些 AOP 来捕获您想要的 KPI 数据,但是使用 python 以及我想它不会起作用。我的一些客户正在使用 Zabbix (zabbix.com) 来捕获 Mysql 和 Webserver KPI。

标签: java mongodb scalability key-value nosql


【解决方案1】:

我会建议一种不同的概念方法...

假设您有一个记录请求的日志表。以下是我将如何解决报告日志数据的问题:

  1. 开始在表中存储日志数据。
  2. 一旦日志表达到 100 万条记录,您就可以将整个表发送到数据仓库。基本上是“存档”数据,这样较慢的查询就可以在以后遇到它。
  3. 对刚刚归档的数据进行离线聚合快照。开展一项获得所需数字的工作。
  4. 编写代码以合并实时查询和 - 如果需要 - 存档查询。

总体思路是日志数据在完成后是静态的。您可以对数据运行一次聚合,它永远不会改变。那么为什么每次都是实时的呢?

您想让实时数据变得非常小且快速。旧数据要么快速查找已知聚合,要么处理时间更长。

【讨论】:

    【解决方案2】:

    CouchDB 二级索引/视图在O(log n) time 中公开您的数据,并且由于整个事物位于 RESTful HTTP API 后面,因此实现和交互毫不费力。看看吧:

    • 一个二级索引根据日志事件的创建时间为它们编制索引,并使用内置的 _countreduce 函数将它们减少到一个计数。
    • 另一个二级索引可能只索引指示停机时间、正常运行时间、500 秒或独角兽的日志事件。关键是,它们都是对数运行的 3 行函数。
    • 通过使用startkey=[timestamp for X days ago] 查询,您可以只计算从那一刻起的日志条目。
    • 通过使用reduce=false 查询,您可以返回日志条目本身,以创建日期为关键字。
    • 使用其他内置 reduce 函数(例如 _stats)来获取有关日志的统计信息。

    CouchDB 有 JavaPython 的客户端库,但归根结底只是一个 RESTful HTTP API,所以任何 HTTP 库都应该可以做到这一点。

    【讨论】:

      【解决方案3】:

      您可以为此使用 RDDTool。 http://oss.oetiker.ch/rrdtool/ IT 是一个非常有用的库,用于记录时间序列数据并使用它们创建图表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-06
        • 2017-04-27
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 2016-06-04
        相关资源
        最近更新 更多