【问题标题】:Time Series schema design in CassandraCassandra 中的时间序列模式设计
【发布时间】:2016-03-23 16:09:06
【问题描述】:

全部,

我们正在为基于 iOT 的应用程序进行 POC。选择的数据库是 cassandra。我们将从安装在车辆上的设备接收时间序列数据。下面给出时间序列数据的主要属性

  • TimeStamp :- 表示接收数据的日期和时间
  • DeviceId :-安装在车辆上的设备的唯一 ID
  • Latitude 车辆的当前纬度
  • Lo​​ngitude 车辆的当前经度
  • 车速 车速

我们计划将月份和年份作为分区键,将设备 ID 和时间戳作为集群键...这是使用以下类型的查询获取数据的最佳方式吗

  • 检索设备的数据,其中 DeviceId 在 start 之间 日期和结束日期
  • 检索开始日期和结束日期之间所有设备的数据 日期

提前致谢

【问题讨论】:

  • 何不看看针对此类数据优化的时间序列数据库。

标签: cassandra schema time-series datastax datastax-enterprise


【解决方案1】:

Cassandra 中的数据建模最好使用查询驱动的方法完成。参见 blog post 了解 Cassandra 建模中的“规则”。

规则 1:在集群中均匀分布数据

规则 2:最小化读取的分区数

您在问题中提供了 2 个查询,它们仅在范围上有所不同。一种是通过设备 ID 请求时间范围内的数据,另一种是与设备 ID 无关的时间范围内的数据。

检索开始日期之间具有 DeviceId 的设备的数据 和结束日期

检索开始日期之间所有设备的数据 和结束日期

您的表应支持的查询如下所示:

设备 x 在时间段 y 内的纬度、经度、速度是多少

分区时应考虑数据点的数量。正常的时间范围是多少?是按分钟、按小时、按天、按周、按月吗?该时间范围应有助于确定如何处理写入和分区。如果您按月和年进行分区,则传感器读数每月不会超过 20 亿个读数。请参阅 this SO answer 以获得关于围绕限制进行分区的详细说明。

了解分区是启用范围结果集的关键。请参阅"Deep look at the CQL WHERE clause" 的以下摘录。

您将无法在分区键上使用 运算符。 (ALLOW FILTERING 可以帮助您解决这个问题,但不要将其作为核心架构设计的一部分。)运算符必须用于集群列。

Cassandra 使用 选定的分区器。因为只有 ByteOrderedPartitioner 保留一个 Cassandra 不支持数据的有序分布 >、>=、

相反,它允许您在 通过使用token函数的分区键。

SELECT * FROM numberOfRequests
    WHERE token(cluster, date) > token('cluster1', '2015-06-03')
    AND token(cluster, date) <= token('cluster1', '2015-06-05')
    AND time = '12:00';

【讨论】:

  • 感谢您的解释。每个设备将每 30 秒发送一次数据,即每分钟两次。每行最多可以有 25 列,我们计划在前 6 个月内搭载大约 50,000 台设备,根据我的计算,应该在 10 亿个单元以下
【解决方案2】:

不知道,但是使用 ELK/弹性搜索作为您的时间数据库怎么样...

【讨论】:

  • 这个答案作为评论会更好。
猜你喜欢
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2013-06-09
  • 2016-08-29
  • 2013-04-17
  • 2013-08-02
相关资源
最近更新 更多