由于边缘计算需要存取多种数据模型,但是计算资源受限,我们在DB-Engine上所有数据库排名清单上排名前30的数据库中找了一圈,找到的轻量级的非商业的支持多模型(注意:有的数据库的多模型实际上只支持两种数据模型,不能满足边缘计算的需求)的数据库Redis。
作者:与子同袍
首发:物联网前沿技术观察
1.边缘计算的数据存取需求
在物联网边缘计算的复杂环境中,应用程序不可避免地需要多个数据模型:
- 内存数据库存储采集的实时设备数据。
- 现场会断网,所以需要把待发送到云端的数据存储到时间序列数据库中。同时边缘侧需要对历史数据进行聚合分析,例如计算温度一段时间内平均值。
- 现场采集的数据需要转发给一个或多个消费者进行处理。
- 边缘侧需要人工智能学习能力,来支持视频流分析,图像识别,故障诊断等低延迟响应业务。
- 边缘侧进行类似MapReduce的计算。
- 运行占用空间小,以能在性能受限的边缘计算计算节点上运行。
由于边缘计算需要存取多种数据模型,但是计算资源受限,我们要是把DB-Engine上的专用的文档数据库MongoDB、图数据库Neo4J、搜索引擎ElasticSearch,时间序列数据库InfluxDB加上内存数据库Redis自己都塞到一块NXP 飞思卡尔ARM A7的内存只有512MB,FLASH只有8GB的千把块RMB的嵌入式网关上,根本就跑不起来,得买更贵的研华工控机才行。
既然这样做不可行,我们去DB-Engine这个数据库排名网站上逛逛,看看到底有没有能满足边缘计算这种苛刻要求的数据库。
2.Redis的解决之道
我们的目标是,找到一种轻量级的非商业的支持边缘计算所需的多种数据模型的数据库。
在DB-Engine上所有数据库排名清单上排名前30的数据库中找了一圈,轻量级的非商业的支持多模型(注意:有的数据库的多模型实际上只支持两种数据模型,不能满足边缘计算的需求)的数据库,就只有Redis了。
Redis的全名是REmote DIctionary Server,远程字典服务器,看上去只是一个可以远程存放字典类型的内存数据库。实际上由于Redis的架构设计,它可以开发新的数据结构和模块,正如Postgresql可以让开发人员开发新的数据库数据结构和扩展一样。因此它实际上和Memcached不同,不只是KV键值对数据库,还是多模型(Multi-model)数据库。
那什么是多模型数据库呢?我们把鼠标光标移到Redis的Multi-model右边的信息图标上,会弹出对Redis数据库的Multi-model多模型的解释。我们可以看到,Redis在完成本职工作Key-value键值对数据库的同时,还可以当做文档数据库、图数据库、搜索引擎和时间序列数据库使用。
Redis这个定位用到边缘计算就有点无敌了。为什么这么说?
我们要是把那些重量级数据库比作加农炮、榴弹炮这些“大炸哔”,就会发现它有两个缺点,一是用来对付小目标杀鸡用牛刀成本太高;二是重量大很难由步兵携带,对连排级的这种”边缘侧战斗”火力支援响应慢。反观RedisEdge可以比作迫击炮,正好是弥补了这几位大块头的缺点,便携,易用,不存在射击死角,可以很方便的为步兵提供曲射火力支援。
虽然Redis的多模型数据库功能肯定没有专门的文档数据库MongoDB、专门的时间序列数据库InfluxDB、专门的图数据库Neo4J那么强大,但是我们要知道,在边缘计算这种应用场景,Redis提供的那些数据模型功能已经够用了。
Redis 只需要添加边缘计算所需的数据结构和模块,就可以满足边缘计算所需的功能,适用于物联网边缘计算的苛刻条件。
按照这个思路形成的软件,套上现在时髦的Edge这个Buzzword,那就叫RedisEdge吧。
RedisEdge将开源版本Redis(带有Redis Streams的5.0版本)与RedisAI和RedisTimeSeries、RedisGears这三个模块一起打包,就可以提供边缘计算所需的数据模型了:
- Redis 5.0版本,内置的Set、List、Hash等数据结构可用作实时内存数据库,用来存储边缘网关采集到的设备实时数据。
- Redis 5.0版本的Redis Streams数据结构,可用做消息中间件,把采集到的设备实时数据转发给其他边缘计算软件组件。
- RedisTimeSeries是Redis的一个模块,可用作时间序列数据库,在边缘计算网关断网的情况下,能够离线保存需要上传到云端的设备历史数据。同时也有历史数据降采样、压缩、聚合的功能。
- RedisGears也是Redis的一个模块,类似MapReduce的分布式动态执行框架,可以用来在分布式的边缘计算节点或者雾计算节点上运行Serverless无服务程序代码。
- RedisAI也是Redis的一个模块,用于执行深度学习模型,在边缘侧调用PyTorch、Tensorflow和ONNXRuntime等深度学习工具。
有了RedisEdge,就可以优雅地处理边缘计算所需的各种数据模型,消除了在边缘计算节点安装多种数据库的复杂性。RedisEdge不是部署五个不同的数据库来支持这些需求,而是在Redis上添加特定的数据结构和特定功能的Redis模块,从而极大地简化了系统架构和部署复杂度。
可能有的开发人员还是不太放心,担心性能问题。其实这个担心是多余的。Redis每秒可以写入上百万条数据,延迟<1ms,占用空间非常小(<5MB),因此很容易运行在受限制的计算环境中。
它可以在各种边缘设备上运行,范围从ARM嵌入式处理器到基于x64的硬件。因此它非常适合在物联网设备、边缘网关设备、雾节点上使用。
3.边缘计算中的应用场景
既然RedisEdge是用在边缘计算的,我们来看下RedisEdge官方提供的两个边缘计算应用场景。第一个是把RedisEdge嵌入到EdgeX Foundry中。第二个是把RedisEdge嵌入到Azure IoT Edge平台中。
EdgeX Foundry是一个拥有70多家成员公司的Linux基金会项目。它是一个开源的物联网边缘计算微服务框架,使任何人都可以轻松开发物联网边缘应用程序。EdgeX Foundry参考实现中的核心服务数据库用的是MongoDB这个文档数据库。虽然用MongoDB也可以存储实时数据和历史数据,也可以用中间表来传递消息。但是它不够轻量级,适用场景就会受到很大限制。
在下图中,RedisEdge运行在EdgeX Foundry的核心服务层。RedisEdge作为内存数据库、时间序列数据库、元数据存储、配置文件存储。
在导出服务层,RedisEdge作为导出客户端注册信息的数据库。
RedisEdge还可用作Azure IoT Edge的模块,使Azure IoT服务的物联网应用程序开发人员可以轻松利用Redis的强大功能。
4.其他类似方案
那除了RedisEdge之外,边缘计算数据库是否还有其他可选方案呢?
一个方案是用开源多模型数据库Postgresql + 扩展插件(连接第三方数据库postgres-fdw + PG时间序列数据库扩展timescale + REST接口暴露PostgREST + 实时流分析pipelinedb) + PL/Python函数或SPI接口。
其中Postgresql作为核心数据库,提供关系型数据模型和文档数据模型。
postgres-fdw扩展,用于与第三方数据库进行集成。
timescale这个Postgresql的时间序列数据库扩展,给Postgresql添加了时间序列数据库功能,用于存储设备历史数据和历史数据降采样、聚合。
pipelinedb这个Postgresql实时流分析扩展,用于对采集的设备数据进行实时分析。
PostgREST用于将数据库暴露为RESTful API接口,用于给边缘计算应用程序调用访问。
PL/Python或C语言的SPI接口,可以用来调用人工智能库如PyTorch(libtorch)或Tensorflow(libtensorflow)等,然后将其封装为Postgresql的函数,这样边缘计算应用开发人员通过调用数据库函数即可实现在边缘侧运行深度学习模型。
这种方式比RedisEdge更重量级一点,适合在边缘计算侧需要更复杂计算的地方。这个方案的缺点是其中有商业软件。当然,我们也可以借鉴RedisEdge的Streams数据结构和RedisTimeseries模块,开发Postgresql的对应的扩展。
另外一个方案就是北京涛思科技的TDengine。这个项目要解决的问题和RedisEdge也是类似的,只不过是自己从头开发的。而RedisEdge是Redis+Redis模块的方式组合起来的。
往期精彩:
更多物联网,边缘计算相关技术干货请关注我的专栏物联网前沿技术观察