2

我们目前正在研究 Cassandra 作为大型时间序列系统的数据库。

我已阅读https://academy.datastax.com/resources/getting-started-time-series-data-modeling关于在 Cassandra 中建模时间序列数据的信息。

我们拥有的是来自许多气象站的高速时间序列数据。每个气象站都有许多“传感器”,每个传感器收集三个指标:温度、湿度和光线。

我们正在尝试将每个系列存储为宽行。但是,我们希望在项目的整个生命周期内每个站点获得数十亿个读数,因此我们希望限制行大小。

我们希望每个 都有一行(weather_station_id, year, day_of_year),即每天都有一个新行。但是,我们仍然希望分区键是weather_station_id- 也就是说,我们希望一个站的所有读数都在同一个节点上。

我们目前有以下架构,但我想得到一些反馈。

CREATE TABLE weather_station_data (
    weather_station_id int,
    year int,
    day_of_year int,
    time timestamp,
    sensor_id int,
    temperature int,
    humidity int,
    light int,
    PRIMARY KEY ((weather_station_id), year, day_of_year, time, sensor_id)
) WITH CLUSTERING ORDER BY (year DESC, day_of_year DESC, time DESC,       sensor_id DESC);

在上述文档中,他们利用了这种“按日期限制分区行”的概念。但是,我不清楚他们示例中的日期是否是分区键的一部分。

4

2 回答 2

1

根据教程,如果我们选择将 weather_station_id 作为唯一分区,则该行将被耗尽。即 C* 每个分区的实际限制是 20 亿列。

所以海事组织,你的数据模型很糟糕。

但是,我不清楚他们示例中的日期是否是分区键的一部分。

使用的教程

PRIMARY KEY ((weatherstation_id,date),event_time)

所以,是的,他们认为数据是分区键的一部分。

我们希望一个站的所有读数都在同一个节点上。

我不确定,为什么你不想要这样的要求。您始终可以使用多个查询获取一年以上的天气数据。

select * from weather_station_data where weather_station_id=1234 and year= 2013; select * from weather_station_data where weather_station_id=1234 and year= 2014;

所以考虑改变你的结构

PRIMARY KEY ((weather_station_id, year), day_of_year, time, sensor_id)

希望能帮助到你!

于 2016-04-20T06:39:31.190 回答
0

在我看来,datastax 模型并不是很好。这个模型的问题:

  • 他们使用气象站作为分区键。具有相同分区键的所有行都存储在同一台机器上。这意味着:如果您有 10 年的原始数据(100ms 步长),您将很快突破 cassandras 限制。10 年 × 365 天 × 24 小时 × 60 分钟 × 60 秒 x 10(100ms 步长)x 7 列。上限为 20 亿。在我看来,如果您构建此数据模型,您将不会使用 cassandra 的好处。对于每个气象站,您还可以使用 mongo、mysql 或其他数据库。

更好的解决方案:问问自己将如何查询这些数据。如果你说:我每年查询所有数据,也使用年份作为分区键。如果您还需要查询超过一年的数据,您可以创建两个不同年份的查询。这有效并且性能更好。(瓶颈可能只是您客户端的网络)

  • 还有一点提示:Cassandra 不像 mysql。这是一个非规范化的数据库。这意味着:多次保存数据并不脏。这意味着:每年查询数据对您很重要,每小时、每天或每个传感器 ID 查询数据也很重要,您可以创建具有不同分区键和主键顺序的列族。可以复制您的数据。Cassandra 针对写入性能进行了优化,而不是针对读取进行了优化。这意味着: 以正确的顺序写入数据通常比以正确的顺序读取数据要好。在 cassandra 3.0 中有一个新功能,称为物化视图,用于自动复制。如果您认为:哦,不,我将复制所需的存储空间。记住:存储真的很便宜。买十块1tb的硬盘是可以的。它没有任何成本。

我有一个问题要问你:你能汇总你的数据吗?Cassandra 有一个称为计数器的列类型。您可以创建一个 java/scala 应用程序,您可以在其中聚合生成的数据。您可以为此使用流式传输框架:Flink 或 Spark。(如果您需要的不仅仅是计数。)。一种情况:您汇总每小时和每天的数据。您在流媒体应用程序中获取了数据。现在:您有一个每小时数据的变量。你数数或数数之类的。如果一小时结束,则将此行放入每小时列族和每日列族中。在您的日常专栏系列中,您使用计数器。我希望,你明白我的意思。

于 2016-04-20T07:18:26.707 回答