物联网 IoT 数据是海量、时序的,大部分应用的大部分数据是低价值的,市面上有 TimescaleDB InfluxDB 国产的各种数据库,数据库如何选型,如何选择适合自己物联网应用的数据库?本文以 EMQ X 为例浅谈一下物联网平台中不同数据库的选型,特点优势等。
从分类选 IoT 数据库
关系数据库
采用了关系模型来组织数据的数据库,历史最久、最成熟、使用最广的数据库,通用的 SQL 语句也使得操作非常方便。
优点:基于数据库的ACID 属性,大大降低了复杂数据冗余,严格保证数据数据一致性,使得数据更易用,也更易理解。
缺点:高并发下 IO 压力大,性能上限较低;为维护数据一致性付出的代价大;难以水平扩展,非常规的水平扩展后来的种种问题难处理;表结构扩展不方便,数据量大的情况下效率和速度会有一定下降。
适用场景:关系数据库一般用以存储重要的、需要保证一致性的数据,比如认证数据用户名密码、订单数据、客户端在线状态等。
以上,可以从以下数据库中选型:MySQL、PostgreSQL;
非关系型数据库
此处不包含缓存型数据库如 Redis、分析型数据库 ClickHouse 等。
非关系型数据库是对关系型数据库的一种补充,二者各有优劣,取长补短。在合适的场景下选择合适的存储引擎是正确的做法。
优点:非关系数据库一般不保证 ACID,通常是弱一致性(最终一致),更能保证用户的访问速度;数据大多能分散在多个服务器上,使得处理海量数据、模糊处理、数据获取效率变的更强大;字段结构变更方便,非关系数据库数据库更多是针对一些特性应用需求而产生。
缺点:不能像关系型数据库提供事务性、一致性等复杂的数据处理。
可以从以下数据库中选型:
Cassandra:高写入性能,面向列数据处理表现出色,当涉及大量数据,速度优化和查询执行时,Cassandra可以被视为实现最佳的数据库;
MongoDB:文档存储表现卓越,支持丰富的数据结构,可以低成本进行字段结构变更。
时序数据库
时序数据库尤其适合时间序列数据的存储,基于时间的一系列的数据,适用于展现历史趋势、周期规律、异常性等进一步对未来做出预测分析的业务,时序数据库可以支持平稳、持续、高并发、高吞吐地写多读少场景,对海量数据有比较好的压缩能力。
以上,可以从以上数据库中选型:OpenTSDB、InfluxDB、TimescaleDB;
缓存/内存数据库
此处仅推荐 Redis,Redis 本质上上一个KEY-VALUE 类型的内存数据库,整个数据库都加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因此它是纯内存操作,Redis 的性能非常出色,MBP 2020 上每秒都可以处理超过 10万 次读写操作。虽然是内存数据库,但是其数据可以持久化,而且支持丰富的数据类型。
Redis 主要的缺点是受到物理内存限制,不能用作海量数据的高性能读写,而且它没有原生的可扩展机制,不具有扩展能力,要依赖客户端来实现分布式读写,因此其适合的应用场景主要局限在较小数据量的高性能操作和运算上。
最佳应用场景:适用于数据变化快且数据库大小可遇见(内存大小)的应用程序,比如 EMQ X 里面的 ACL、高频离线消息存储、订阅关系存储等。
分析数据库
主要是 ClickHouse,国内腾讯、携程、字节跳动等均不同程度使用 ClickHouse 来做分词查询,这里根据实际业务场景需要来选择。ClickHouse 是一个很棒的大数据实时计算平台,在不固定的查询条件,不固定的汇总维度,数据量日益增长的情况下仍然能够保证高可用并秒出分析查询数据。
还有一些特点是数据压缩比高,存储成本低,支持常用的 SQL 语法,写入速度非常快,适用于大量的数据更新;不支持高并发频繁查询写入(EMQ X 已经优化了批量写入能力)。
行业数据库
TDengine 一款开源的专为物联网、车联网、工业互联网、IT 运维等设计和优化的大数据平台。除提供时序数据库功能外,还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的复杂度。
DolphinDB 特别适用于对速度要求极高的低延时或实时性任务,如基于海量历史数据的交互式查询与计算、高频交易策略研发与实施、实时数据处理与监控等。其查询和计算速度,是常用大数据系统的 10 到 1000 倍。
从 EMQ X 功能方面选型
认证、ACL
认证对数据库性能以及存储容量要求不高,但是对数据一致性、数据安全性要求比较高。速度:客户端连接的时候才会使用认证功能,默认客户端连接按接速度是每秒1000次;数量:即使客户端数量到达千万级也远远未达到关系数据库上限。
ACL 对数据库读写性能要求比较高,每次订阅、每条消息发布都会触发 ACL查询,尽管 EMQ X 提供了 ACL 缓存可以大大缓解数据库压力。
认证推荐使用关系数据库如 MySQL、PostgreSQL,其余 MongoDB、Redis 以及 Cassandra 也可以根据情况选用;
ACL 推荐使用 内置Mnesia 认证、Redis、MySQL、PostgreSQL等数据库,MongoDB、Cassandra 也可以根据情况选用。
保存离线消息、获取订阅关系
在 EMQ X 中,离线消息、订阅关系会被频繁读写(每条消息发布会读写数据库1-4次不等)这里推荐处理速度快、数据安全性高的数据库。
数据需要长期存储:根据性能,使用关系数据库、非关系数据库,可选的有 MySQL、PostgreSQL、Cassandra、MongoDB;
数据短期存储:使用 Redis;
合理规划离线消息的 Topic 可以有效减少离线消息数量,提升性能。
长期保存物联网数据
保存传感器上报的数据、处理设备上报的数据、控制设备操作记录等消息可以根据自己的业务需要来选择。
保存传感器上报的数据:如有复杂的分析需求,可根据情况选择时序数据库、分析数据库,如果只是单纯的数据存储以备未来只需,可选时序数据库、非关系数据库、关系数据库等。时序数据库据用户反馈,十分推荐 TimescaleDB。
处理设备上报的数据,比如告警分析等,可以使用 Kafka 等消息系统进行连接;