如何为下一个项目选择正确的MQTT数据存储
#database #reductstore #mqtt

选择正确的数据库可能会压倒性地相信我。

Photo by Jan Antonin Kolar
Jan Antonin Kolar {:target =“ _ blank”}的照片Unsplash {:target =“ _ blank”}

自加入Reductore项目以来,我一直在探索替代解决方案,以更好地了解该项目如何适合当前的回声系统。我找到了各种数据库,从最受欢迎的数据库到最晦涩的数据库。

为了给您一些上下文,我们将研究通常使用MQTT相互通信的物联网设备(例如传感器,相机等)存储数据的解决方案。

MQTT代表“邮件排队遥测传输”,是一种轻巧的消息传递协议,旨在高效,可靠和可扩展,使其非常适合实时收集和传输数据。

选择数据库时为什么这很重要?

好吧,mqtt是格式的,但它以特定的方式起作用。因此,我们应该意识到其架构,其工作原理以及其做出正确选择的局限性。这就是本文的目的,我们将尝试削减雾气并探索选择正确的选项时要考虑的一些关键因素。

让我们开始!

  1. Brief explanation of MQTT and its use in IoT projects
  2. Importance of choosing the right data storage for MQTT
  3. Factors to consider when choosing MQTT data storage
  4. Types of database options available

简要说明MQTT及其在IoT项目中的用途

MQTT是一种发布订阅消息传递协议,允许设备通过网络发送和接收消息。由于其轻巧的性质,低功耗和对不可靠的网络的支持,因此特别适合物联网项目。

在基于MQTT的系统中,设备(称为发布者)向中央经纪人发布消息,然后将这些消息分发给已订阅特定主题的其他设备(称为订户)。然后,订户可以处理消息并采取适当的措施。例如,传感器可以发布包含其当前温度的消息,然后由已订阅主题“温度”的订户收到。

Example of Pub/Sub architecture
pub/sub Architture的示例(作者图像)

MQTT易于使用,并将订阅和发布任务分开。要从设备获取信息,您不需要知道其所有详细信息,例如其地址或密码。您只需要连接到一个称为经纪人的“中间人”,并知道该主题的名称。此模式比其他协议(例如HTTP)为物联网提供了许多优势,例如HTTP,它要求服务器和客户互相了解彼此的详细信息并直接进行交流。

为MQTT选择正确的数据存储的重要性

要考虑的一个重要方面是物联网项目的“实时”方面。请注意,MQTT消息不是直接延时的,但是您通常会在有效载荷中设置时间信息。这是由发布者完成的,您可能决定使用所需的时间。例如,当创建消息或收集数据时传感器的时间时,可以传输边缘设备的时间。

更重要的是,存储解决方案必须能够按时间顺序处理MQTT的高吞吐量。

时间序列数据库似乎是一个明显的选择,可以按时间顺序排列数据,因为它可以有效地存储和检索按时间索引的消息。

要考虑的另一个方面是可以通过MQTT传输的数据类型(几乎所有内容)。 MQTT协议是格式 - 不可思议的,这意味着它没有指定应如何格式化数据。这允许通过MQTT传输多种数据类型,包括文本,图像或音频。唯一的要求是,必须将数据格式化为字符串(UTF-8编码)或字节流,并且有效载荷大小不超过256mbâ,这很大,就像2K视频一样35秒...

换句话说,MQTT可用于传输所有类型的数据,包括文本,图像,视频或音频,只要将其格式化为字符串或二进制流,并且比256MB更轻。

选择MQTT数据存储时需要考虑的因素

选择MQTT数据存储解决方案时,有几个因素需要考虑:

  • 性能
  • 可伸缩性
  • 可靠性
  • 安全
  • 兼容性
  • 成本

性能:处理和检索数据的速度和效率

表现是显而易见的。该存储应能够在较低的响应时间内有效,快速地处理和检索数据,这意味着数据库的读写速度以及网络延迟被最小化。

从相机中存储图片或高频传感器数据(例如加速度计)的性能变得更加关键。相机通常会产生可能很大的高分辨率图像,并且平均加速度计可以轻松地每秒产生约4,000个测量值(4KHz)。

例如,让我们考虑使用MQTT传输安全摄像机捕获的映像的智能监视系统。在这种情况下,存储解决方案需要能够实时处理时间stamp的连续流。这不仅需要快速写速速度,还需要有效的压缩技术,以减少每个图像的大小而不会损害其质量。

,在检索这些图片以进行分析或审查目的时,速度至关重要。您应该能够从安装在边缘设备上的数据库和部署在云上的数据库中的任何指定时间间隔中轻松访问和获取图像。

可伸缩性:能够处理大量数据并增加工作量的能力

虽然这可能是云数据库的期望,但如何应用于边缘数据库?

由于MQTT应用程序经常从各种设备和传感器中产生大量数据,因此边缘存储应能够管理此较高的吞吐量并具有坚实的配额策略(当您磁盘用完时)和复制方法(在云中备份数据)。

可扩展的系统还应包括考虑增加工作负载,可容纳其他设备或传感器以及在需要时添加更多的边缘设备或存储节点来支持水平缩放等考虑因素。

可靠性:确保数据完整性和可用性而不会损失或腐败

为了保证存储数据的可靠性和可访问性而不会损失或损坏,因此选择包含适当措施的存储解决方案至关重要。这些措施应能够解决可能的故障,例如停电或网络中断,并保护数据丢失或妥协。

一种流行的解决方案是复制数据。复制涉及创建数据的重复副本,并将它们存储在多个位置或服务器中。这种冗余可确保即使一台服务器失败了,仍然可以从另一个服务器访问数据,从而最大程度地减少数据丢失或损坏的风险。

安全:防止未经授权的访问,攻击和违规

MQTT数据可以包含敏感信息,例如设备遥测,用户行为或图像,这对于防止未经授权的访问,攻击和违规至关重要。

您怎么知道数据库是否值得信赖?

我相信重点应该放在“开源”及其相关社区上。

数据库的开放性质允许在漏洞和修复方面提高透明度,因为任何人都可以审查代码。这意味着社区可以快速识别并解决任何潜在的安全问题。

开源数据库通常具有庞大的用户群和社区支持。这意味着许多眼睛正在寻找潜在的威胁或脆弱性,从而更快地发现和解决任何问题。

兼容性:与其他系统,协议或分析工具集成

考虑兼容性因子时,您可以考虑数据库需要集成的其他系统或协议。

例如,如果您还使用AWS或Azure等云平台,则需要确保所选的边缘数据库可以与这些平台集成。

此外,如果您打算在MQTT数据上执行分析,则需要一种可以轻松与Grafana,Apache Kafka或Apache Spark等流行工具集成的解决方案。

成本:负担能力和成本效益

成本是选择存储解决方案时要考虑的另一个重要因素。总体而言,数据库的成本可以分为两类:前期成本和持续成本。

  • 预先费用包括数据库的初始购买价格,以及运行它所需的任何其他硬件或软件。

  • 持续的费用包括维护费,支持费以及与使用数据库相关的任何其他经常性费用。

可用的数据库选项类型

有几种可用于物联网的流行数据库选项,例如时间序列,NOSQL或关系“ SQL”数据库。

时间序列数据库

时间序列数据库是专门设计用于处理时间stamp数据的,这是存储MQTT数据的理想选择。

整个想法一句话:

时间序列数据库通过有效索引数据来优化时间序列数据的存储和检索性能。

他们提供了内置功能和查询功能,非常适合分析和可视化以时间顺序存储的信息。他们经常提供诸如下采样和保留政策之类的功能,以有效地管理大量历史数据。

流行的时间序列数据库的示例

一些通常用于存储MQTT数据的流行时间序列数据库包括:

  • InfluxDB {:target =“ _ black”}:一个开源数据库,提供高性能存储和带有SQL类似的查询语言的时间戳记数据的检索。您可以存储数字(整数或浮点值),布尔值或文本字符串with a limit of 64KB on v1.7 {:target =“ _ blank”} - 比MQTT的有效载荷少4000倍。

  • TimescaleDB {:target =“ _ blank”}:PostgreSQL的扩展,将时间序列功能添加到关系数据库模型中。它为处理大量时戳数据提供了可伸缩性和性能优化,同时保持关系数据库的灵活性。

  • Prometheus {:target =“ _ blank”}:另一个广泛使用的开源监视系统和时间序列数据库,旨在从各种来源收集指标。它提供了功能强大的查询功能,提醒功能以及与Grafana(开源可视化和监视工具)的简单集成。

时间序列斑点数据的还原店

ReductStore {:target =“ _ blank”}是一个唯一的时间序列数据库,它提供了一个专门的数据库,用于以时间序列blob数据的形式存储MQTT数据。

与存储结构化数据的传统时间序列数据库不同,还原商店允许存储非结构化数据(BLOB)及其相关的时间戳。这使其适用于MQTT数据包括大量文本信息,图像,音频,高频传感器(例如加速度计),视频或其他类型的二进制文件的方案。

使用还原商店,您可以有效地存储和检索这些BLOB数据,同时受益于时间序列数据库提供的性能优化和查询功能。

NOSQL数据库

NOSQL(不仅代表“ SQL”)涵盖了不限于传统SQL(结构化查询语言)数据库的更广泛类别的数据库。

NOSQL数据库通常以存储MQTT数据而闻名,因为它们的灵活性和可扩展性。这些数据库可以处理大量结构化,半结构化和非结构化数据,使其非常适合存储多种信息。

例如:

  • 键值商店是简单的数据库,以键值对的格式存储信息,类似于字典。
  • 文档数据库:将半结构化数据组织为文档。
  • 面向列的数据库:通过列组织数据,使查找特定信息有效。
  • 图形数据库:优化用于存储和查询高度连接的数据。
  • 广阔的商店:存储大量结构化和半结构化数据。

流行NOSQL数据库的示例

常用的一些流行的NOSQL数据库包括MongoDB,Apache Cassandra和Amazon DynamoDB。

  • MongoDB {:target =“ _ blank”}是一个面向文档的数据库,具有高扩展性和灵活性,可用于处理非结构化或半结构化数据。它提供了丰富的查询功能,索引选项以及使用称为“ Sharding”技术的分布式数据存储的支持。

  • Apache Cassandra {:target =“ _ black”}是一个高度可扩展且容忍故障的数据库,可以在多个节点或簇中处理大量数据。它提供快速的读写操作,使其适用于实时分析或具有高吞吐量要求的应用程序。

  • Amazon DynamoDB {:target =“ _ blank”}是一个完全管理的NOSQL数据库。这意味着它提供自动缩放,低延迟访问数据,耐用性保证以及与其他AWS服务的集成。

斑点存储

blob代表“二进制大对象”,可以存储在专门存储非结构化二进制数据的特定服务中,例如文件,图像,视频和备份。

BLOB存储通常不被视为NOSQL数据库类别的一部分,因为它不提供传统NOSQL数据库中的高级查询功能或数据建模选项。

流行斑点存储的示例

可用于存储非结构化二进制数据的一些流行的BLOB存储选项包括Minio,Google Cloud Storage,Azure Blob Storage和Amazon S3(简单存储服务)。

如果您需要在边缘设备上安装BLOB存储,则应考虑MinIO {:target =“ _ blank”}。它是一种开源,高性能的对象存储系统,旨在存储任何通常在记忆中的非结构化数据,例如照片,视频,备份和容器图像。

那么,有众所周知的云服务提供商:

  • Azure Blob Storage {:target =“ _ blank”}是Microsoft Azure提供的可扩展且高度可用的对象存储服务。它们提供各种存储层,因此您可以根据自己的要求优化成本和性能。他们还提供了生命周期管理,版本控制和数据加密等功能。

  • Google Cloud Storage {:target =“ _ blank”}是由Google Cloud Platform提供的全球分布式对象存储服务。它们为存储大量BLOB数据提供了可信赖和可扩展的数据库。他们还提供了一种通过不同的存储类和定价选项来优化成本和性能的方法。

  • Amazon S3 {:target =“ _ blank”}是一种广泛使用的对象存储服务,这要归功于其全局基础架构并与其他AWS服务集成。他们还提供了生命周期策略,版本控制和服务器端加密等功能。

关系数据库

关系数据库,例如MySQL,是在物联网项目中存储MQTT数据的另一种选择。这些数据库为数据存储提供了一种结构化和有条理的方法,使其适合需要强大的数据一致性和不同实体之间的复杂关系的项目。

关系数据库使用带有预定义模式的表来存储数据,从而有效地查询和索引。他们提供诸如交易之类的功能,这意味着您可以在数据库上执行多个操作作为单个工作单位,并且每个交易都遵循一组称为ACID (Atomicity, Consistency, Isolation, Durability) {:target =“ target =“ _ black”}的属性,以确保数据仍然一致,即使发生故障或崩溃。

流行关系数据库管理系统的示例

常用的一些流行的关系数据库管理系统(RDBMS)包括MySQL,PostgreSQL或Oracle数据库。

  • MySQL {:target =“ _ blank”}是一个开源RDBMS,由于其简单性,可靠性和可伸缩性,它在IoT项目中广泛使用。它提供了强大的数据一致性,并支持使用SQL的有效查询。

  • PostgreSQL {:target =“ _ blank”}是另一个流行的开源RDBMS,以其稳健性,可扩展性和对高级功能(如JSON数据类型和空间索引)的支持。

  • Oracle Database {:target =“ _ blank”}是一个商业rdbms,在处理多个数据库时具有良好的记录。它提供高级安全功能和分析功能。

结论

为您的项目选择正确的存储选项对于确保有效的数据管理和分析至关重要。诸如数据类型,可伸缩性需求和项目要求之类的因素应与您选择的数据库保持一致。

例如,如果您的项目涉及从各个设备的低频收集实时传感器数据,则分布在不同位置。在这种情况下,您需要一个时间序列数据库,例如InfluxDB,TimeScaledB或Prometheus,可以处理大量的时型数据。

另一方面,如果您的项目涉及以高频收集实时传感器数据或从相机捕获时间stamp的图像,则您可能需要一个解决方案,例如还原店。

NOSQL数据库,例如MongoDB,Amazon DynamoDB或Apache Cassandra,非常适合处理具有高扩展性和实时处理能力的大量非结构化或半结构化数据。

BLOB存储选项,例如Minio,Azure Blob存储,Google Cloud Storage和Amazon S3,是存储大量斑点数据的好选择,包括音频,图像或视频等多媒体文件。

最后,诸如MySQL,Oracle数据库或PostgreSQL西装项目之类的关系数据库需要强大的数据一致性,实体之间的复杂关系以及高级查询功能。


感谢您的阅读,我希望本文能够帮助您为您的IoT项目选择最合适的数据库。如果您有任何疑问或评论,请随时接触。