我是 Cassandra 的新手,我刚刚通过 Datastax 类(class)学习了它,但是我在这里或在 Internet 上找不到足够的关于 bucket 的信息,在我的应用程序中我需要使用 buckets 来拆分我的数据。
我有一些工具可以进行很多测量,每天拆分测量(时间戳作为分区键)可能有点冒险,因为我们很容易达到分区 100MB 的限制。每个度量都涉及一个用 ID 标识的特定对象。所以我想用一个桶,但我不知道该怎么做。
我正在使用 Cassandra 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 添加为分区键,但后来我放弃了仪器所做的“测量流”,因为我感兴趣的是查看仪器在特定日期或时间段内所做的所有测量.
- 那么问题来了,当我想查询一个特定仪器一天的所有记录时,如果有很多桶,我该怎么办?
- 如果我希望分区限制为 400 000 行,我如何知道在插入数据时必须将数据插入到哪个存储桶中?
- 有没有办法知道桶的数量?
非常感谢您的帮助!
最佳答案
您应该专注于您的需求,然后再回到您的模式模型。在您的情况下,每台仪器每天可以进行多少次测量?如果每个人都可以做的少于您的 400k 措施,那么您已经完成了没有分桶的工作。如果您的仪器每台最多可以执行 10M 次测量,那么 N=10M/400k 桶应该足以满足您的要求。假设有 N 个桶,当您需要查询来自特定仪器的所有度量时,您必须执行 N 查询,每个桶一个,除非您可以计算期间的度量您的写入,以便您可以在桶满时更换桶。我的意思是,您将前 400k 度量写入存储桶 0,然后将第二个 400k 度量写入存储桶 1,依此类推。然后,您需要跟踪插入数据的 K 个桶,并仅执行 K 查询,而不是对 N 进行查询。这样你就有了不平衡的桶(和分区),但是你在最少数量的查询中得到了你的结果。如果您更喜欢平衡桶方法,则可以在均匀分布的随机桶号中执行每次写入,但是您必须执行所有 N 查询才能获取特定仪器的所有数据.
关于用于分区大小的 Cassandra 桶拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39446962/