PostgreSQL是如何突然成为了物联网应用程序和服务的理想平台。
注:这是基于我们2月份印度PGConf主题演讲(完整视频)[1]。今年5月,我们将在物联网世界[2]发表类似的演讲。(我们现在正在泽西城的PostgresConf——来打个招呼吧!)[3]
流行的科幻小说通常描绘的是充满机器的未来。
因此,大量的机器(或物联网)数据已出现在越来越多的地方:
工业机器:制造我们大部分的东西。
运输和物流:我们周围的人和物品是如何转移的。
建筑管理和智能家居:我们如何生活和保护我们的家和企业
农业:我们如何养活这个星球
能源与公共事业:我们如何为我们的世界提供动力
(还有更多)
这里有来自三个数据源的数据:一个建筑物,一个农场和一个工厂。数据按时间排序定期到达。当一个新的数据点出现,我们将它加到现有的数据集中。
这里我们看到数据集是一组随时间收集的数据。同样,数据集本质上是时间序列的。
为物联网选择Postgres[5]有很多理由:
关系模型+JOINs: 正如我们刚才看到的,关系模型非常适合于物联网。
可靠性: 数十年的软件开发和生产部署导致了一个坚如磐石的数据库。
易用性: 开发人员和业务分析人员已经知道如何使用的查询语言(SQL),以及dba已经知道如何操作的数据库。
广泛的生态系统:最大的兼容可视化工具的生态系统,后端系统,操作实用工具(例如,备份,复制),等等。
灵活的数据类型(包括JSON):一组广泛的数据类型,包括(但不限于)数字、字符串、数组、JSON/JSONB。
地理空间支持:通过PostGIS[6],增加了对地理对象和位置特定查询的支持。
趋势:Postgres可能是目前所有开源数据库中最强大的一个(这就是为什么数据库引擎被命名为Postgres,它是2017年的顶级数据库管理系统[7])。
有些人已经开始使用Postgres。如果您的写入速度很低,并且只存储了几百万行时间序列数据,Postgres可能会满足您的需求。
随着数据集的增长,插入性能急剧下降。(插入吞吐量作为PostgreSQL 9.6.2的表大小的函数,在Azure标准DS4 v2(8核)机器上运行10个工作线程,使用基于ssd的(高级LRS)存储。)
对于我们来说,为物联网的工作负载扩展Postgres不仅仅是一个学术问题,而且是我们公司在以前所面临的一个实际问题。
我们公司最初是从iobeam,一个物联网数据分析平台开始的。我们取得了一定的成功,为我们的客户收集了大量的机器时间序列和关系数据。我们需要把数据存储在某个地方。
然而,我们发现当时业界数据库只提供两种选择:
关系数据库(例如PostgreSQL, MySQL)是可靠的、易于使用和性能的,但是伸缩性很差。
非关系型(也称为“NoSQL”)数据库(例如Cassandra, InfluexDB),它的伸缩性更好,但不可靠,性能更差,更难以使用,也不支持关系数据。
但是鉴于我们的物联网工作负载由时间序列和关系数据组成,我们唯一的选择是同时使用两种数据库。这导致了其他问题:它将我们的数据集分割成孤岛,导致应用层需要做复杂的连接,并要求我们维护和操作两个不同的系统。
对于物联网的工作负载,我们是如何扩展Postgres的:
我们确定了主要的瓶颈:数据集的内存/磁盘交换时间。
然后我们认识到时间序列的工作负载与传统的数据库(或OLTP)工作负载有非常不同的特性:
正如我们所看到的,传统的数据库工作负载倾向于对随机位置进行更新,而更新通常需要复杂的事务。
我们可以根据时间来划分数据,这样每个分区或数据块都是合适大小的,这样的话可以使得所有的数据和索引都能在内存中运行。如果大小划分的恰到好处的话,内存磁盘间的数据交换将被最小化(或者即使是最近的或“热”的块也会被消失)。
Hypertable,跨所有分区的单个虚拟表,它运行起来就像一个普通的Postgres表,并隐藏了用户的所有复杂性。
但后来我们意识到有一条更简单的方法:支持SQL。每个人都知道SQL,有很多关于如何使用SQL查询的文献,还有大量的介绍SQL的资料和工具。对于目前不适合用来进行时间序列分析的SQL(和PostgresSQL),可以通过udf和查询-计划/查询-执行级别的优化来轻松地改进。(这有一些例子[13]。)
当然,问题的关键在于细节:块管理、可识别的查询、快速的元数据路由,执行Hypertable-as-a-vanilla-table保证还需要在C和PL/pgSQL级别上进行大量工作以获得正确的结果(查看更多[14])。
可以从结果中看到这种架构的好处:
TimescaleDB可以支持每秒100k +行插入,或者每秒1M + metrics/秒。
我们的方法可以获得比普通Postgres高达10,000倍的查询速度和2000倍的快速删除
关系模型+Joins:Hypertable和关系表共存
可靠性、易用性、生态系统:我们的设计不会影响底层存储层,并且保持同样的SQL语法,所以它的操作就像和使用Postgres感觉一样。
灵活的数据类型(包括JSON)、地理空间支持:类似地,这种方法与所有Postgres原生数据类型和扩展(如PostGIS)保持兼容。
趋势:作为一个扩展,设计与Postgres相兼容,并将继续受益于Postgres的持续改进(也允许我们回馈社区)。
现在我们可以为物联网扩展Postgres,我们还可以在Postgres之上选择使用各种应用程序和工具:例如,Kafka、RabbitMQ、MQTT、Apache Spark、Grafana、Tableau、Rails、Django等等。
如果了解我们的历程是有帮助的,欢迎你用同样的方法扩展自己Postgres。但是如果你更想节省时间,你也可以使用TimescaleDB[16](开源,Apache 2)。这是您的选择。我们在这可以提供帮助[17]。
参考链接:
[1] https://www.youtube.com/watch?amp=&v=sFHZJ61DmZk
[2] https://tmt.knect365.com/iot-world/speakers/ajay-kulkarni#developers-conference-security-data-ai_the-inadvertent-iot-platform-postgresql
[3] https://twitter.com/TimescaleDB/status/986605501424259073
[4] https://blog.timescale.com/what-the-heck-is-time-series-data-and-why-do-i-need-a-time-series-database-dcf3b1b18563
[5] https://blog.timescale.com/choose-postgresql-for-iot-19688efc60ca
[6] http://postgis.net
[7] https://db-engines.com/en/blog_post/76
[8] https://blog.timescale.com/time-series-data-why-and-how-to-use-a-relational-database-instead-of-nosql-d0cd6975e87c
[9] https://blog.timescale.com/time-series-data-postgresql-10-vs-timescaledb-816ee808bac5
[10] http://www.timescale.com/about
[11] https://blog.timescale.com/when-boring-is-awesome-building-a-scalable-time-series-database-on-postgresql-2900ea453ee2
[12] https://blog.timescale.com/raised-16m-from-benchmark-nea-to-understand-machines-time-series-data-iot-9eff8213c15c
[13] http://docs.timescale.com/v0.9/api#analytics
[14] https://blog.timescale.com/time-series-data-why-and-how-to-use-a-relational-database-instead-of-nosql-d0cd6975e87c
[15] https://blog.timescale.com/timescaledb-vs-6a696248104e
[16] https://github.com/timescale/timescaledb
[17] http://slack-login.timescale.com
活动预告:
6 月 1 ~ 2 日,GIAC 全球互联网架构大会将于深圳举行。GIAC 是高可用架构技术社区推出的面向架构师、技术负责人及高端技术从业人员的技术架构大会。今年的 GIAC 已经有腾讯、阿里巴巴、百度、今日头条、科大迅飞、新浪微博、小米、美图、Oracle、链家、唯品会、京东、饿了么、美图点评、罗辑思维、ofo、LinkedIn, Pivotal 等公司专家出席。
本期 GIAC 大会上,IOT部分精彩的议题如下:
参加 GIAC,盘点2018最新技术。点击“阅读原文”了解大会更多详情。