Apache Cassandra替代时间序列模型,在一行中有许多列

时间:2017-06-09 08:37:20

标签: cassandra time-series

我们成功地使用了瘦的行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))
) 
  • 在单个列上插入(例如,仅插入一天中的几秒钟)似乎会使节点大量加载。也许在插入之前加载完整行?
  • 但真正好的存储消耗
  • 如果未完全填充行,则会触发逻辑删除警告:ERROR“在查询期间扫描超过100001个墓碑'SELECT * FROM ...'” - >这是不行的

1 个答案:

答案 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%

enter image description here

来源: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