Cassandra中的时间序列模式设计

时间:2015-12-17 08:58:37

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

全部,

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

  • TimeStamp: - 表示接收数据的日期和时间
  • DeviceId:安装在车辆上的设备的-UniqueId
  • 纬度目前车辆的纬度
  • 经度当前车辆的经度
  • 车辆速度

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

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

先谢谢

2 个答案:

答案 0 :(得分:2)

使用查询驱动方法完成Cassandra中的数据建模是最好的。请参阅此blog post了解"规则"在建模Cassandra。

  

规则1:在群集中均匀传播数据

     

规则2:最小化分区数量

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

  

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

     

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

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

在时间段y期间设备的纬度,长度,速度是多少

分区时应考虑数据点的数量。什么是正常的时间框架?是分钟,小时,日,周,月吗?该时间范围应该有助于确定如何处理写入和分区。如果您在月份和年份进行分区,那将适用于传感器读数,每月读数不会超过20亿。有关围绕限制进行分区的详细说明,请参阅this SO answer

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

您将无法使用<,>分区键上的运算符。 (允许过滤可以解决这个问题,但不要将其作为核心模式设计的一部分。)必须在集群列上使用运算符。

  

Cassandra使用。分配节点上的分区   选定的分区器。因为只有ByteOrderedPartitioner保持一个   有序的数据分布Cassandra不支持>,> =,< =和   <操作员直接在分区键上。

     

相反,它允许您使用>,> =,< =和<操作员   通过使用令牌功能来分区键。

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';

答案 1 :(得分:-2)

Dunno关于这一点,但是如何使用ELK /弹性搜索作为你的时间DB ...