我有一个系统,可以存储来自有许多传感器的机器的测量值,每秒一次。我正在考虑使用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个状态变量,批处理id将每1-2小时更新一次。我已经阅读了关于每个表最多20亿个单元格的文档,并注意到类似的问题,这里cassandra允许的最大列数是多少,这里cassandra限制每个分区20亿个单元格,但是什么是分区?
如果我正确理解这个限制,我会在大约60天内达到inst\ U样本表中一台机器20亿个单元的限制?
(2e9个单元格/400列/行)/(3600行/小时)/(24小时/天)=~58天?
我是个十足的Cassandra新手。谢谢。
1条答案
按热度按时间flvlnr441#
这个20亿的限制是针对分区的,如果您有好的数据模型,那么您应该有很多分区。在实践中,建议控制每个分区的单元数—例如,每个分区不能超过100000个单元,否则可能会出现一些性能问题等。但实际限制取决于多个因素,例如cassandra版本、执行什么查询等。
在您的例子中,我们有machine\u id+batch\u id的分区密钥,这给了我们2小时的批量大小:400x7200=2880000-几乎300万个单元。它可能仍然可以工作(如果将批处理大小设置为1小时会更好),但需要在实际硬件上进行测试—例如,可以使用nosqlbench进行测试。
还有其他方法可以优化数据模型—例如,不用为每个变量分配单独的列,只需使用
frozen<map<text, double>>
-在这种情况下,所有测量值都将存储为一个单元格。它的缺点是,在不读取Map的情况下不能更改单个值&用更改后的值插入Map。另一个缺点是,你需要一次读取所有的测量值-但这是可以的。