【问题标题】:What's the best practice to store performance data in CrateDB?在 CrateDB 中存储性能数据的最佳实践是什么?
【发布时间】:2025-12-22 21:35:06
【问题描述】:

我的应用程序将性能时间序列数据存储在 CrateDB 中,为了正确设置,我有几个问题,因为它每天将有大约 72M 条记录,并且应该可以适当扩展:)。我的目标是使用 Grafana 可视化生成的数据,目前我想到了以下结构:

CREATE TABLE metrics (
  ts TIMESTAMP,
  hostname STRING,
  servicename STRING, 
  perfdata OBJECT(DYNAMIC)
)

// for example
{
    "hostname": "localhost",
    "servicename": "ping",
    "timestamp": 1483699527,
    "perfdata": {
        "rta": {
            "current": 0.5,
            "unit": "ms",
            "warn": 100,
            "critical": 200
        },
        "pl": {
            "current": 0,
            "unit": "%",
            "warn": 10,
            "crit": 20
        }
    }
}

重要的位是主机/服务名称、指标的名称和值以及时间戳。这也将是替代架构:

 CREATE TABLE metrics (
   ts TIMESTAMP,
   hostname STRING,
   servicename STRING, 
   metric OBJECT(DYNAMIC) AS (
      unit STRING,
      name STRING,
      value DOUBLE,
   )       
 )

那么,哪一种是存储数据的首选方式?我还需要分区吗?我的聚合通常显示过去 24 小时,很少显示上个月...

谢谢!

【问题讨论】:

    标签: sql crate cratedb


    【解决方案1】:

    一般来说,我会建议使用 第二个表架构,因为它更简单,并且可以让您捕获原始数据(而不是预先组装的数据)并针对您实际的数据进行聚合需要。

    但是,这个问题非常棘手,因为它在很大程度上取决于实际要求。所以本质上,组合模式会使更新变得棘手(对象只能被替换而不能被更新),因此需要一起发送数据(并且可能以相同的速度收集?)。

    最重要的是,设置partitioning 可能很有用。 这可以加快查询速度并允许change the number of shards for future partitions(并允许您更好地扩展)。 常见的做法是按月或按周进行分区,在某些情况下也按天分区。 但必须注意防止分片数量爆炸 分片也需要系统资源。

    感谢datasource plugin :)

    【讨论】:

      【解决方案2】:

      现在才看到这个,我一直在玩 perdata (nagios) 和 cratedb。 我们测试的(基于 mongodb 时间序列演示)是每小时存储并让 perfdata[ts]={perf object} (我们确实测试了 perfdata['minute']['second']={})

      24 小时架构是 perfdata['hour']['minute']

      因此,通过在 host/service/ 上定义主键,您可以 '重复密钥更新..'

      所以按主机/服务/小时查询只是一个查询:-)

      【讨论】: