用于分区大小的 Cassandra 桶拆分

Cassandra bucket splitting for partition sizing

我对 Cassandra 很陌生,我刚刚通过 Datastax 课程学习了它,但是我在这里或在 Internet 上找不到关于存储桶的足够信息,在我的应用程序中我需要使用存储桶来拆分我的数据。

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

我正在使用 Cassandra 3.7

这是我的 table 大致的样子:

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 作为分区键,但后来我松开了仪器制作的 "flow of measures",因为我感兴趣的是在一个仪器中看到仪器所做的所有测量特定日期或时间段。

非常感谢您的帮助!

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