Cassandra跨分区的聚合

时间:2017-12-08 06:39:58

标签: cassandra data-modeling cqlsh cassandra-3.0

我有一个如下所示的数据模型,

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 - 主键和时间戳 - 聚类键(通过descinding oder排序以获取最新的),

此表格中的示例数据

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

这是正确可用的,每当我需要获取统计数据时,我都可以使用下面的分区键获取数据,

SELECT nodeip,readbw,timestamp FROM nodedata WHERE nodeip = '172.30.56.60' AND timestamp < 1512652272989 AND timestamp > 1512537899000;

还成功汇总了以下数据,

SELECT sum(readbw) FROM nodedata WHERE nodeip = '172.30.56.60' AND timestamp < 1512652272989 AND timestamp > 1512537899000;

现在是下一个用例,我需要获取群集数据(四个节点的所有数据),

如下所示,

SELECT nodeip,readbw,timestamp FROM nodedata WHERE nodeip IN ('172.30.56.60','172.30.56.61','172.30.56.62','172.30.56.63') AND timestamp < 1512652272989 AND timestamp > 1512537899000;

但它在网站数量上明确提到,“IN查询”有很多性能问题,那么你在上面提到的'nodedata'数据模型中的建议是什么? (注意:在不同的分区中执行多个查询是可以的,我觉得这是最后一个选项)

您是否有更好的方法(或)以更好的方式重新设计此数据模型(或)从多个分区检索数据的任何更好的解决方案?

任何帮助都会非常明显。

谢谢,
哈利

1 个答案:

答案 0 :(得分:1)

是的,不鼓励在分区键上使用IN,因为它会给协调节点带来更多负载,特别是如果在IN子句中指定了很多分区。例如,多个单独的异步请求甚至可以提高性能,并减少协调节点的负担。

此外,您需要考虑分区的大小 - 从快速查看到架构,我发现如果您每分钟都在进行抽样,那么每个分区将在一年内增长到〜55Mb。分区太宽可能也会导致一些性能问题(尽管并非总是如此,取决于用例)。也许您需要更改分区键以包括年份或年份+月份来制作更小的分区。但在这种情况下,当您检索跨越数年/月的数据时,应该在代码中添加一些额外的逻辑。

P.S。也许这不是一个完全回答你的问题,但评论领域太小了: - )