【发布时间】:2018-05-22 10:42:45
【问题描述】:
我有一个如下所示的数据模型,
CREATE TABLE appstat.nodedata (
nodeip text,
timestamp timestamp,
flashmode text,
physicalusage int,
readbw int,
readiops int,
totalcapacity int,
writebw int,
writeiops int,
writelatency int,
PRIMARY KEY (nodeip, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)
其中,nodeip - 主键和时间戳 - 聚类键(按降序排序以获得最新的),
此表中的示例数据,
SELECT * from nodedata WHERE nodeip = '172.30.56.60' LIMIT 2;
nodeip | timestamp | flashmode | physicalusage | readbw | readiops | totalcapacity | writebw | writeiops | writelatency
--------------+---------------------------------+-----------+---------------+--------+----------+---------------+---------+-----------+--------------
172.30.56.60 | 2017-12-08 06:13:07.161000+0000 | yes | 34 | 57 | 19 | 27 | 8 | 89 | 57
172.30.56.60 | 2017-12-08 06:12:07.161000+0000 | yes | 70 | 6 | 43 | 88 | 79 | 83 | 89
这是正确可用的,每当我需要获取统计信息时,我都可以使用如下分区键获取数据,
(上面的逻辑似乎和我之前的问题类似:Aggregation in Cassandra across partitions)但期望不同,
我为所有 4 个节点中每一分钟填充的每一列(如 readbw、延迟等)设置了值。
现在,如果我需要获取列的最大值(例如:readbw),可以使用以下查询,
SELECT max(readbw) FROM nodedata WHERE nodeip IN ('172.30.56.60','172.30.56.61','172.30.56.60','172.30.56.63') AND timestamp < 1512652272989 AND timestamp > 1512537899000;
1) 第一个问题:有没有办法在不使用 IN 查询的情况下对列的所有节点(readbw)执行 max 聚合?
2) 第二个问题:有没有办法在 Cassandra 中,每当我在节点 1、节点 2、节点 3 和节点 4 中插入数据时。 它需要聚合并存储在另一个表中。这样我将从聚合表中收集每列的聚合值。
如果我的任何观点不清楚,请告诉我。
谢谢,
哈利
【问题讨论】:
-
“所有节点”在您的情况下是常量(字面意思是所有节点)还是变量(例如,组成某些集群的节点,并且节点列表可能会更改)?
-
节点列表会有所不同。无论复制因子如何,它都会有所作为吗?
-
这与第一个问题有关 -
IN中的列表是不变的,或者不是 - 我考虑了如何调整架构。 -
IN查询使用会涉及到所有Cassandra节点(即)如果集群中有4个节点,那么IN查询会涉及到所有四个节点如'172.30.56.60','172.30.56.61 ','172.30.56.60','172.30.56.63'
-
每个节点都有自己的统计信息,分区键作为其nodeIp,集群键作为其时间戳进行排序。注意:由于需要在每列的节点之间执行聚合,所以我没有简单的方法来做到这一点