问题的快速概要:
我正在使用图表页面来映射我公司正在处理的设备的性能。 我每2秒获得一个新的statpoint(timestamp,stats,nodeid,volumeid,clusterid)。来自每个节点。
这导致每个节点每个节点每天大约43,000条记录。 现在让我们说我有13个统计数据。这是每天520k的记录。
所以一行看起来像是:
timestamp typeid clusterid nodeid volumeid value
01/02/2016 05:02:22 0 1 1 1 82.20
如此简短的解释,我们决定使用mysql,因为它可以在亚马逊中轻松扩展。我之前使用Influx可以很容易地解决这个问题但是没有办法在亚马逊中自动扩展InfluxDB。
我的最终目标是获得一个看起来像的返回值:
object[ {
node1-stat1: 20.0,
node2-stat1: 23.2,
node3-stat1: xx.x,
node1-stat2: 20.0
node2-stat2: xx.x,
node3-stat2: xx.x,
timestamp: unixtimestamp
},
{
node1-stat1: 20.0,
node2-stat1: 23.2,
node3-stat1: xx.x,
node1-stat2: 20.0
node2-stat2: xx.x,
node3-stat2: xx.x,
timestamp: unixtimestamp + 2 seconds
}]
我目前有一个收集所有唯一时间戳的查询。 然后循环遍历那些以获取属于该时间戳的值。 把它放进一个物体里。
这会产生所需的输出。但它需要永远这样做,并且它超过一百万个查询。
这样的事情甚至可以在Mysql中完成吗?我应该回到时间序列数据库吗?并且只是手动处理它?</ p>
//编辑//
我想我可能已经解决了我的问题:
SELECT data_points.*, data_types.friendly_name as friendly_name
FROM data_points, data_types
WHERE (cluster_id = '5'
AND data_types.id = data_points.data_type_id
AND unix_timestamp(timestamp) BETWEEN '1456387200' AND '1457769599')
ORDER BY timestamp, friendly_name, node_id, volume_id
给我所有需要的领域。 然后我循环遍历这些数据点。并为每个时间戳创建一个新的“对象”,只需为所有与时间戳匹配的对象添加统计数据。
这将在一秒钟内执行超过一百万条记录。
我肯定会尝试查看交换到Timeseries数据库是否会在将来有所改进。