我对Cassandra相当陌生,我正在努力了解如何为物联网传感器设计我的table。
这个想法是有几个设备,每个设备上都连接有几个传感器,定期发送数据(每个传感器每天每个设备最多发送200000个值)
我想能够查询一个传感器的最新值为一个传感器和设备的具体列表在或多或少的实时传感器。此外,设备并不总是发送数据,可能会长时间停机。
读了很多书之后,我想到了这样的东西
CREATE TABLE "sensor_data" (
deviceid TEXT,
sensorid TEXT,
ts timestamp,
value TEXT,
PRIMARY KEY ((deviceid, sensorid), ts)
) WITH CLUSTERING ORDER BY (ts DESC);
这背后的想法是对每个设备和传感器执行一个查询,例如
Select deviceid, sensorid, ts, value where deviceid = "device1" and sensorid = "temperature" limit 1
对每个设备和传感器运行这个。它并不是一个查询就可以全部返回(这将是理想的),但是它似乎足够快,可以为一些设备运行100个左右的传感器(有可能并行查询)。
不过,从我目前所读的内容来看,我知道这会给我的行带来很多列,而且可能会因为长期存储和cassandra限制而变得复杂。
我在想,也许像这样在表中添加日期之类的内容(在一些博客和指南中可以看到)可能是个好主意
CREATE TABLE "sensor_data" (
deviceid TEXT,
sensorid TEXT,
date TEXT
ts timestamp,
value TEXT,
PRIMARY KEY ((deviceid, sensorid, date), ts)
) WITH CLUSTERING ORDER BY (ts DESC);
然后像这样询问
Select deviceid, sensorid, date, ts, value where deviceid = "device1" and sensorid = "temperature" and date = "2018-11-14" limit 1
这有道理吗?感觉它可能会缓解存储问题,并允许在将来更轻松地存档旧数据。但是,如果某个特定传感器和设备停机一天或更长时间,我该如何查询该设备的最新值?我真的需要查询1天吗?如果没有找到任何东西,就查询前一天等等(可能只限于最后几天左右)?
Cassandra有没有更好的方法来处理这个问题,或者我的方向是对的?
1条答案
按热度按时间n3schb8v1#
问题的一部分,你会遇到的是,每个传感器将有20万读数每天。通常,您希望将每个分区的行数控制在100k以下。所以,你的第二个想法(把约会作为pk的一部分)可能有性能问题。
其实你要做的就是我们所说的“扣扣”;如何将事物组合在一起,以便查询可用且性能良好。
要真正帮助解决这个问题,我们需要了解更多的信息:
你有多少台设备?这个数字会增长还是有限的?
用简单的英语来说,你想回答的问题是什么?
根据您的答案(如下)将此纳入答案:
好吧,这里有一个潜在的想法。。。
不过,我们确实关心bucketing,以尽量保持分区中100k/分区的最佳行数。
你需要两张table:
查阅表格
传感器工作台
查找表将类似于:
CREATE TABLE sensor_data (
sensorid TEXT,
sensor_value (whatever data type fits what you need),
ts TIMESTAMP,
reading_date date,
time_bucket int,
PRIMARY KEY ((reading_date, sensorid, time_bucket), ts)
) WITH CLUSTERING ORDER BY (ts DESC);
CREATE TABLE sensor_by_value (
sensor-value INT,
ts TIMESTAMP,
sensorid TEXT,
reading_date DATE,
time_bucket INT,
PRIMARY KEY ((sensor-value, reading_date), ts)
) WITH CLUSTERING ORDER BY (ts DESC);