为传感器数据建模 Cassandra 多对多关系

Modelling Cassandra Many-to-Many Relation for Sensor Data

我正在构建一个使用 Cassandra 作为数据存储的应用程序,它从大量传感器捕获数据并允许不同的监控组件监控这些传感器。

例如,服务器机房可能有一个温度传感器,10 个不同的服务器监控组件可能会从该传感器接收值。同样,监控组件将从多个传感器接收数据。

我的(非常简化的)概念架构类似于:

我需要运行以下查询:

  1. 单个传感器的历史值
  2. 监控组件各属性的最新值

这是我遇到问题的第二个。

当测量到达时,我只知道传感器 ID、时间戳和值。我怎样才能建立一个 table 的模型,使我能够在监视器上保留每个属性的当前值?

我尝试了以下 table:

CREATE TABLE monitor_subscriptions (
    sensor_id uuid,
    monitor_id uuid,
    attribute text, # e.g. 'Temperature'
    timestamp timestamp,
    value double,
    PRIMARY KEY (sensor_id, monitor_id, attribute)
);

我试图做的是更新订阅该传感器的每个监视器的 timestamp/value,但显然以下查询不起作用,因为我没有指定 monitor_idattribute:

UPDATE monitor_subscriptions
SET timestamp = ?, value = ?
WHERE sensor_id = ?;

虽然我收到新的测量结果,但我只知道 sensor_idtimestampvalue

我猜你可能会重新审视你的 monitor_subscriptions table 成为:

  • append-only,不更新最新值,而是每次插入一个新值
  • 分成两个不同的 table 最适合您的特定查询。

例如:

create table sensor_data (
  sensor_id uuid,
  timestamp timestamp,
  value double,
  primary key (sensor_id, timestamp)
) with clustering order by (timestamp desc);

此table用于存储原始传感器读数,您可以有效地查询特定传感器的最新数据。如果您计划插入大量传感器读数(例如每秒),您可能需要将当前日期添加到聚类键以处理以后可能出现的压缩问题。

监视器 table 可能看起来像这样:

create table monitor_subscriptions (
  monitor_id uuid,
  sensor_id uuid,
  attribute text,
  primary key (monitor_id, attribute, sensor_id)
)

此 table 可用于查询监视器的所有属性或这些属性的所有传感器。因此,要查询每个属性的最新值,您:

  1. 查询 monitor_subscriptions 以获取属性-> 传感器映射(最佳情况:1 次磁盘读取)
  2. 为每个传感器查询 sensor_data(最佳情况:N 次磁盘读取,其中 N = 传感器数量)。