【问题标题】:Maximum Number of Cells in a Cassandra TableCassandra 表中的最大单元格数
【发布时间】:2020-09-08 17:49:15
【问题描述】:

我有一个系统可以存储来自具有许多传感器的机器的测量值,每秒一次。我正在考虑使用 Cassandra,并希望将 1 秒的机器状态测量样本存储在一个表中,类似于:

create table inst_samples (
    machine_id text,
    batch_id int,
    sample_time timestamp,
    var1 double,
    var2 double,
    .....
    varN double,
    PRIMARY KEY ((machine_id, batch_id), sample_time)
);

大约有 20 台机器,每台机器有 400 个状态变量,batch_id 将每 1-2 小时更新一次。我已经查看了关于每张表最多 20 亿个单元格的文档,并注意到了类似的问题 这里是What are the maximum number of columns allowed in Cassandra,这里是Cassandra has a limit of 2 billion cells per partition, but what's a partition?

如果我正确理解了这个限制,我会在大约 60 天内达到 inst_samples 表中单台机器的 20 亿个单元格限制吗?

(2e9 个单元格/400 列/行)/(3600 行/小时)/(24 小时/天)=~ 58 天?

我完全是 Cassandra 新手。谢谢。

【问题讨论】:

    标签: database cassandra


    【解决方案1】:

    这个 20 亿的限制是针对分区的,如果你有好的数据模型,你应该有很多分区。在实践中,建议控制每个分区的单元数 - 例如,每个分区不要超过 100,000 个单元,否则可能会出现一些性能问题等。但实际限制取决于多种因素,例如 Cassandra 版本,什么执行查询等。

    在您的情况下,我们有 machine_id + batch_id 的分区键,这为我们提供了 2 小时的批量大小:400x7200 = 2880000 - 近 300 万个单元。它可能仍然有效(如果将批量大小设置为 1 小时会更好),但需要在真实硬件上进行测试 - 例如,可以使用 NoSQLBench

    还有其他方法可以优化您的数据模型 - 例如,不要为每个变量分配单独的列,只需使用 frozen<map<text, double>> - 在这种情况下,所有测量值都将存储为单个单元格。它的缺点 - 如果不阅读地图并使用更改的值插入它,您将无法更改单个值。另一个缺点是您需要一次读取所有测量值 - 但这可能没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多