【问题标题】:Cassandra bucket splitting for partition sizing用于分区大小的 Cassandra 存储桶拆分
【发布时间】:2017-01-19 16:38:34
【问题描述】:

我对 Cassandra 还很陌生,我只是通过 Datastax 课程学习的,但是我在此处或 Internet 上找不到有关存储桶的足够信息,并且在我的应用程序中,我需要使用存储桶来拆分我的数据。

我有一些可以测量的工具,很多,并且每天拆分测量(时间戳作为分区键)可能有点冒险,因为我们可以轻松达到分区的 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 行,我如何知道插入数据时必须在哪个存储桶中插入数据?
  • 有没有办法知道桶的数量?

非常感谢您的帮助!

【问题讨论】:

    标签: cassandra time-series datastax partition bucket


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。问题是我不知道一个仪器可以做多少测量。我的意思是当他们检测物体时,物体的数量没有限制。但是好吧,我可以照你说的做:) 所以没有“内置”方法来“计算”写入的桶数?以及在插入数据时是如何工作的?
    • @Miwauke 你不知道你的乐器的速度吗?如果一台仪器的吞吐量为每秒一次测量,那么在一天内,每台仪器每天最多有 M=86400 次测量。如果 吞吐量 是每秒 1k 次测量,那么每个仪器每天有 M=86M 次测量。您不需要确切 数字,一个(粗略的)猜测应该没问题。 决定在哪个存储桶中写入数据:每个仪器都应计算自己的度量值,并应使用正确的每个存储桶的度量计数相应地写入正确的存储桶。
    • 我还不知道仪器的速度,但我可以调查一下。谢谢你的回答,所以我必须跟踪“一切”才能写在正确的桶里,这就是我想知道的。计算一个桶中条目数的最佳方法是什么?我应该在某处使用计数器列吗?
    • 在桶里?你的意思是在一个分区? SELECT count(*) FROM mytable WHERE instrument_id=1 AND day='2016-09-23' AND bucket=4.
    • 是的,对不起,我的意思是在分区中。感谢您的查询,我忘记了我们可以做到这一点!非常感谢您回答我所有的问题:)
    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 2019-10-22
    • 2021-11-15
    • 2017-11-03
    • 2016-05-12
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多