2017-01-20 80 views
0

我的应用程序将性能时间序列数据存储在CrateDB中,为了使设置正确,我有几个问题,因为它将每天大约有72M条记录,并且它应该正确缩放:)。我的目标是可视化与Grafana得到的数据,目前我心目中的结构如下:在CrateDB中存储性能数据的最佳实践是什么?

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小时,很少最后一个月...

谢谢!

回答

0

一般来说,我会建议与第二个表格模式,因为它更简单,它可以让你捕捉原始数据(而不是预先组装),并为你实际需要做聚合。

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

最重要的是,设置partitioning可能会有用。 这可以加快查询并允许到change the number of shards for future partitions(并允许您更好地缩放)。 通常的做法是按月或按周划分,有些情况下按天划分。 但必须小心,以防止碎片数量的爆炸,因为 碎片也需要系统资源。

CrateDB工作得很好Grafana,感谢datasource plugin :)

0

只看到这一个,现在我已经和perdata(Nagios的)和cratedb玩耍。 我们测试了什么(基于mongodb时间序列演示)是每小时存储并让perfdata [ts] = {perf object} (我们实际测试过perfdata ['minute'] ['second'] = {})

24小时的模式将是perfdata [“小时”] [“分钟”]

所以通过定义主机/服务主键/你做 “上的重复密钥更新..”

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

相关问题