用于分区大小调整的Cassandra桶拆分

用于分区大小调整的Cassandra桶拆分,cassandra,time-series,datastax,partition,bucket,Cassandra,Time Series,Datastax,Partition,Bucket,我对Cassandra很陌生,我只是通过Datastax课程学习,但我在这里或互联网上找不到足够的bucket信息,在我的应用程序中,我需要使用bucket来分割数据 我有一些工具可以进行度量,很多,每天拆分度量(时间戳作为分区键)可能有点风险,因为我们很容易达到分区100MB的限制。每个度量都涉及一个用ID标识的特定对象。所以我想使用一个桶,但我不知道如何做 我用的是卡桑德拉3.7 下面是我的桌子大致的样子: CREATE TABLE measures ( instrument_id bi

我对Cassandra很陌生,我只是通过Datastax课程学习,但我在这里或互联网上找不到足够的bucket信息,在我的应用程序中,我需要使用bucket来分割数据

我有一些工具可以进行度量,很多,每天拆分度量(时间戳作为分区键)可能有点风险,因为我们很容易达到分区100MB的限制。每个度量都涉及一个用ID标识的特定对象。所以我想使用一个桶,但我不知道如何做

我用的是卡桑德拉3.7

下面是我的桌子大致的样子:

CREATE TABLE measures (
  instrument_id bigint,
  day timestamp,
  bucket int,
  measure_timestamp timestamp,
  measure_id uuid,
  measure_info float,
  object_id bigint,
  PRIMARY KEY ((instrument_id, day, bucket), measure_timestamp, measure_id)
);
我曾想过添加object_id作为分区键,但后来我松开了一个工具所做的“度量流”,因为我感兴趣的是看到一个工具在特定的一天或一段时间内所做的所有度量

  • 所以问题是,当我想请求某一特定仪器的所有日记录时,如果有许多桶,我该怎么办
  • 如果我希望分区限制为400000行,我如何知道在插入数据时必须在哪个存储桶中插入数据
  • 有没有办法知道桶的数量

非常感谢你的帮助

您应该关注您的需求,然后返回到您的模式模型。在您的情况下,每个仪器每天可以执行多少测量?如果每个人都能做不到你的400k措施,那么你已经做了没有扣。如果您的仪器每个可执行多达10米的测量,则N=10米/400k铲斗应足以满足您的要求。假设N存储桶,当您需要查询来自特定仪器的所有度量值时,您必须执行N查询,每个存储桶一个,除非您可以在写入期间计算度量值,以便在存储桶满时更改存储桶。我的意思是,你在bucket 0中写入第一个400k度量值,然后将第二个400k度量值写入bucket 1,依此类推。然后,您需要跟踪插入数据的K存储桶的数量,并只对N执行K查询。这样一来,您就有了不平衡的存储桶(和分区),但您只需要最少的查询就可以得到结果。如果您更喜欢平衡桶方法,您可以在均匀分布的随机桶数中执行每次写入操作,但随后您必须执行所有N查询以获取特定仪器的所有数据。

谢谢您的回答。问题是我不知道一台仪器能做多少测量。我的意思是,当他们检测到物体时,物体的数量没有限制。但好吧,我可以照你说的做:)那么没有“内置”的方法来“计算”写入的桶数?插入数据时它是如何工作的?@Miwauke你不知道你的仪器的速度吗?如果一台仪器的吞吐量为每秒一个测量值,则在一天内,每台仪器的最大吞吐量为每天86400个测量值。如果吞吐量是每秒1k个度量,那么每个仪器每天有M=86M个度量。您不需要精确的数字,一个猜测就可以了。您可以决定在哪个桶中写入数据:每个仪器都应计算其自身的测量值,并根据每个桶的正确测量值计数相应地写入正确的桶。我还不知道仪器的速度,但我可以进行调查。谢谢你的回答,所以我必须记录“一切”,以便在正确的桶中书写,这就是我想知道的。计算一个bucket中条目数的最佳方法是什么?我应该在某个地方用一根计数柱吗?在桶里?你是说在分区里<代码>从mytable中选择count(*),其中instrument_id=1,day='2016-09-23',bucket=4。是的,对不起,我是说在分区中。谢谢你的提问,我忘了我们能做到!非常感谢您回答我的所有问题:)