我们成功地使用了瘦的行aproach来存储cassandra中的时间序列(包括bucketing)。然而,我正在为我们寻找有效的存储模型(例如,减少存储消耗......)。一个用例是将每个值每秒存储到一个表中。
最后一种方法(有很多列的宽行)对我来说感觉就像一个完整的模式(不是在理论上,而是在实践中)。有人对这种方法有经验并能确认我的感受吗?
1)瘦行宽行(灵活,可以按时间戳过滤)
CREATE TABLE timeseries (
id int,
date date,
timestamp timestamp,
value decimal,
PRIMARY KEY ((id, date), timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)
2)具有一天所有值的Blob / JSON(减少存储消耗,不对节点上的时间戳进行过滤)
CREATE TABLE timeseries(
id int,
date date,
json text, -- [{'secondOfDay': 0, 'value': 12.34}, {...} or BLOB
PRIMARY KEY ((id, date))
)
3)宽行包含多列的瘦行
CREATE TABLE timeseries(
id int,
date date,
"0" decimal, "1" decimal,"2" decimal, -- ... 86400 decimal values
-- each column index is the second of the day
PRIMARY KEY ((id, date))
)
答案 0 :(得分:3)
我建议您使用First Data Model。
你的第一和第三个数据模型在cassandra的内部结构中是相似的。和 你对cassandra中宽行和瘦行的理解是错误的。 First数据模型是宽行,Second和Third数据模型是瘦行。
第一个数据模型内部结构:
{"key": "1:2017-06-09",
"cells": [["2017-06-09 15\\:05+0600:","",1496999149885944],
["2017-06-09 15\\:05+0600:value","3",1496999149885944],
["2017-06-09 15\\:05+0600:","",1496999146862326],
["2017-06-09 15\\:05+0600:value","2",1496999146862326],
["2017-06-09 15\\:05+0600:","",1496999142150486],
["2017-06-09 15\\:05+0600:value","1",1496999142150486]]},
{"key": "1:2017-06-10",
"cells": [["2017-06-09 15\\:06+0600:","",1496999171997567],
["2017-06-09 15\\:06+0600:value","4",1496999171997567]]}
Cassandra将分区(id, date
)密钥中的每个单元格存储为单行,并将群集密钥(timestamp
)值存储为每个单元格的密钥。这就是为什么这个模型被称为宽行。
所以你可以看到第一和第三个数据模型是相似的。 因此,如果您使用的是第一个模型而不是第三个模型,则不必为每个条目的条目创建新列
并且不使用第二个模型,对于每个插入,您必须读取整个值并附加新值并重新插入。这是一个非常糟糕的设计,一个反模式。而且cassandra建议列值为1 MB。
单列值不得大于2GB;在实践中," MB的单个数字"是一个更合理的限制,因为没有流式或随机访问blob值。
来源:https://wiki.apache.org/cassandra/CassandraLimitations
如果要减少磁盘空间,可以使用COMPACT STORAGE选项。以下结果表明,紧凑型存储可将磁盘空间减少高达35%
来源:http://blog.librato.com/posts/cassandra-compact-storage
注意:
使用WITH COMPACT STORAGE指令可防止您定义多个不属于复合主键的列。具有非复合主键的紧凑表可以包含多个不属于主键的列。
使用复合主键的紧凑表必须至少定义一个群集列。创建紧凑表后,无法添加或删除列。除非您指定WITH COMPACT STORAGE,否则CQL会创建一个包含非紧凑存储的表。
集合和静态列不能与COMPACT STORAGE表一起使用。
来源:http://docs.datastax.com/en/cql/3.3/cql/cql_using/useCompactStorage.html