Cassandra为工业数据传感器保存时间序列
我目前正在开发一个项目,研究从连接到PLC的工业工厂传感器(工厂中的机械控制器,例如控制电机、速度、开关……)检索数据的最佳方法 我将解释要实现的目标,我认为我的案例可以外推到如此多不同类型的行业:Cassandra为工业数据传感器保存时间序列,cassandra,time-series,plc,Cassandra,Time Series,Plc,我目前正在开发一个项目,研究从连接到PLC的工业工厂传感器(工厂中的机械控制器,例如控制电机、速度、开关……)检索数据的最佳方法 我将解释要实现的目标,我认为我的案例可以外推到如此多不同类型的行业: 我有几个PLC,给我很多不同的数据值。(其中许多值仅为布尔值,其他值为模拟值,例如实型。) 我将在整个工厂拥有超过10000个传感器 我希望至少每秒检索模拟值的数据(例如,电机rmp、温度、湿度……) 对于数字值,当事件出现时,数据将与时间戳一起保存 我想在timeseries中使用Cassandr
整个系统将用Java开发,它将向外部公司提供数据以进行分析。您的查询是什么还不太清楚。你提到 “我希望至少每秒检索一次模拟值的数据(例如,电机rmp、温度、湿度……)” 这是否意味着您每秒都在查询所有10K传感器?或针对特定传感器,或针对一组传感器?在cassandra中,在查看数据模型之前了解查询是什么是至关重要的。如果您正在寻找1秒的granuality,一个选项可能是将传入的数据流提供给Spark Streaming,并将Spark Streaming代码保存到适合您想要查询的Cassandra表中 至于您提到的选项,如果不知道您的查询的确切性质,很难说。将一个键连接到第二个键可能是一种选择——假设数据速率或每个传感器1/s,这意味着每个分区大约有10K个条目。每个传感器都有一个表是很奇怪的,但是每个传感器都有一个分区,每个条目都有时间戳。这取决于你的提问
如果你给我们举一个你打算如何检索数据的例子,我们可能会提供更好的帮助?我怀疑最终你会希望通过传感器和时间来查询数据。没有理由不使用两个表并将每个数据点同时写入这两个表中。(Twitter会将每条tweet写入一个不同的表中,供每个关注该tweet的人使用!) 您可能会编写以下表格:
CREATE TABLE factory_status (
date timestamp,
hour int,
minute int,
second int,
sensor_status_map map<uuid, float>
PRIMARY KEY ((date, hour, minute, second))
)
该表将记录每个传感器的输出。每个日期都是时间的截断版本。否则传感器每秒一次的输入将很快超过卡桑德拉的列限制。这将使查询特定时间或一段时间内传感器的状态变得容易
如果您在“从头开始”设计时遇到困难,请随意采用迭代方法并添加新表,因为您发现需要运行的新查询不符合旧查询的模式。感谢您的快速回复。我想存储传感器数据,但我尚未创建我将申请的查询。我所知道的唯一确定要查询的数据是类似股票行情的图形中的模拟值(你选择时间、日期、月份,然后看到图形),但我真的不知道这些数据在同一时间是否会显示。恐怕你需要了解一下你的查询。您提到您将指定时间、日期和月份……您还会指定传感器或传感器集合吗?时间的粒度是多少?如果到了第二秒,并且您不希望在2秒钟的窗口中出现100秒的数千个事件,那么((天、小时、秒)、传感器id)可能是一个很好的主键。但是,在不知道问题的情况下,我们又一次陷入了黑暗。我会分析需求,看看需要什么样的查询。查询驱动的建模是一种思维转变,但对卡桑德拉来说至关重要。谢谢阿西奇,我们在西班牙所说的就像是从屋顶上盖房子。我需要改变主意,以后我可以为此建立一个合适的系统。但是我面临的问题是,我们不知道以后会使用什么数据,这给我在Cassandrai上开发数据库带来了问题。Cassandra不一定有问题。即使使用SQL Server,如果您在建模时不知道查询将是什么,您也可能会遇到性能问题和非常复杂的查询。在卡桑德拉,从概念模型到实际物理模型的转变通常非常重要。但同时,一个设计良好的SQL数据库将知道它可以有效地支持哪些查询,哪些查询不能有效地支持。我现在明白你的意思了。有几个问题是,当性能下降时,例如在柱数方面,是否有任何限制?或者就像我在你的第一种方法中看到的那样,将地图排成一行将是更容易的方法,而且对我来说也非常灵活(添加新的传感器数据是正常的)。Cassandra非常有效地处理宽行。列数对速度影响不大。查询列的子集也是有效的。当查询的原始数据量非常大(超过2MB左右)时,会出现一些流问题。假设每个传感器只有一个值,甚至只有一小部分值,如果您遇到10000个传感器的问题(100000个可能更令人担忧),我会感到惊讶。自从您发布此问题以来,有没有更新过您是如何围绕此问题进行设计的?
CREATE TABLE sensor_status (
sensor_id uuid,
date timestamp,
time timestamp,
sensor_val float,
PRIMARY KEY ((sensor_id, date), time)
)