Postgres:物联网的新基础?

导语: 物联网是新一代信息技术的重要组成部分,也是“信息化”时代的重要发展阶段。对于物联网来说,时序数据库是满足其需求的基础设施之一。本文作者分析了物联网数据库的一般需求,并且结合PostgreSQL实现了自己的时序数据库TimescaleDB。本文是作者对TimescaleDB设计和实现的简要介绍。

PostgreSQL是如何突然成为了物联网应用程序和服务的理想平台。

注:这是基于我们2月份印度PGConf主题演讲(完整视频)[1]。今年5月,我们将在物联网世界[2]发表类似的演讲。(我们现在正在泽西城的PostgresConf——来打个招呼吧!)[3]

像时尚和音乐潮流一样,计算跟随着潮流不断演进。(或者你更加喜欢用软件开发的语言来比喻:计算通过大大小小的版本迭代发展和演进。)

从大型机(1950-1970)到个人电脑(80-90年代),再到智能手机(2000-现在),每一次浪潮都带给我们更小,却更强大的机器,在商业和社会中日益丰富和普及。

我们现在正处在另一个关键点的风口浪尖上,计算设备如此之小,如此普遍,以至于它变得几乎像我们呼吸的空气一样普遍。有人称之为“物联网”、“联网设备”或“普适计算”。

随着每个潮流的出现,软件开发者和企业都在努力寻找合适的软件基础设施来开发他们的应用程序,很快像Unix,windows,LAMP技术栈,ios/android的常见的平台出现。

今天基于物联网的应用开发者正在问自己一个重要的问题:新的服务应该采用什么什么样的合适的基础设施呢?

现在声称某个物联网服务的平台获胜还为时过早,但不管它是什么,我们相信它的底层结构,它的基础数据层,将是Postgres。

下面介绍为什么这么说。

物联网数据的详细探查

流行的科幻小说通常描绘的是充满机器的未来。

但事实证明,机器已经包围了我们,事实上,去年是连接设备(不包括电脑和智能手机)在数量上超过人类数量的第一年。

因此,大量的机器(或物联网)数据已出现在越来越多的地方:

  • 工业机器:制造我们大部分的东西。
  • 运输和物流:我们周围的人和物品是如何转移的。
  • 建筑管理和智能家居:我们如何生活和保护我们的家和企业
  • 农业:我们如何养活这个星球
  • 能源与公共事业:我们如何为我们的世界提供动力
  • (还有更多)

但是机器数据是什么?让我们看一个简单的例子:

这里有来自三个数据源的数据:一个建筑物,一个农场和一个工厂。数据按时间排序定期到达。当一个新的数据点出现,我们将它加到现有的数据集中。

如你所见,当我们收集机器数据,我们建立一个时间序列数据集[4]。

让我们用另外一个例子深入了解一些: 这里我们看到数据集是一组随时间收集的数据。同样,数据集本质上是时间序列的。

但是也有一些额外的元数据描述这些测量的来源(无论是传感器、设备还是其他“物体”)。如果我们仔细观察,看来每次阅读中记录的元数据看起来都是相关的。实际上,可以很容易地将数据集规范化,每一行都包含了分隔元数据表的外键。(在我们的示例中,我们可以创建额外的“设备”、“位置”或甚至“维护”表)。

换句话说,物联网数据是时间序列和关系数据的组合。关系数据只是描述生成时间序列的东西。

这表明对于物联网我们可能需要一个类似Postgres的关系数据库。

为什么物联网选用Postgres?

为物联网选择Postgres[5]有很多理由:

  • 关系模型+JOINs: 正如我们刚才看到的,关系模型非常适合于物联网。
  • 可靠性: 数十年的软件开发和生产部署导致了一个坚如磐石的数据库。
  • 易用性: 开发人员和业务分析人员已经知道如何使用的查询语言(SQL),以及dba已经知道如何操作的数据库。
  • 广泛的生态系统:最大的兼容可视化工具的生态系统,后端系统,操作实用工具(例如,备份,复制),等等。
  • 灵活的数据类型(包括JSON):一组广泛的数据类型,包括(但不限于)数字、字符串、数组、JSON/JSONB。
  • 地理空间支持:通过PostGIS[6],增加了对地理对象和位置特定查询的支持。
  • 趋势:Postgres可能是目前所有开源数据库中最强大的一个(这就是为什么数据库引擎被命名为Postgres,它是2017年的顶级数据库管理系统[7])。

但是为什么Postgres目前没有被用于物联网?

有些人已经开始使用Postgres。如果您的写入速度很低,并且只存储了几百万行时间序列数据,Postgres可能会满足您的需求。

Postgres不是这些应用服务默认的数据库的一个主要原因是:它不具备良好的扩展性。

随着数据集的增长,插入性能急剧下降。(插入吞吐量作为PostgreSQL 9.6.2的表大小的函数,在Azure标准DS4 v2(8核)机器上运行10个工作线程,使用基于ssd的(高级LRS)存储。)

物联网工作负载通常具有高插入率,从而导致大型数据集。正如上图所示,随着数据集的增长,在Postgres上插入性能急剧下降,这就不太合适了。

这个下降反应了内存超过一定的大小,数据和索引不再适合存放在内存里,需要Postgres进行磁盘交换。(这里不再更多解释[8]。)

(事实证明Postgres 10也没有解决这个问题[9]。)

那么,如何在保留所有好处的同时,为物联网数据提供一个可扩展的Postgres呢?

我们作为物联网平台的前身

对于我们来说,为物联网的工作负载扩展Postgres不仅仅是一个学术问题,而且是我们公司在以前所面临的一个实际问题。 早期版本的TimescaleDB。

我们公司最初是从iobeam,一个物联网数据分析平台开始的。我们取得了一定的成功,为我们的客户收集了大量的机器时间序列和关系数据。我们需要把数据存储在某个地方。

然而,我们发现当时业界数据库只提供两种选择: 1.关系数据库(例如PostgreSQL, MySQL)是可靠的、易于使用和性能的,但是伸缩性很差。 2.非关系型(也称为“NoSQL”)数据库(例如Cassandra, InfluexDB),它的伸缩性更好,但不可靠,性能更差,更难以使用,也不支持关系数据。

但是鉴于我们的物联网工作负载由时间序列和关系数据组成,我们唯一的选择是同时使用两种数据库。这导致了其他问题:它将我们的数据集分割成孤岛,导致应用层需要做复杂的连接,并要求我们维护和操作两个不同的系统。

我们真正想要的是汇集两种数据库的最好部分:一些像Postgres一样工作的东西,但却能达到时序数据库的可扩展性。鉴于我们的工程团队是由普林斯顿大学的计算机科学教授[10]领导的,我们决定自研。

然后,在听取了许多面临同样问题的开发人员的意见后,我们从物联网平台转向开源的时间序列数据库公司,并于2017年4月[11]推出了该产品,并且在2018年1月[12]融资了1600万美元来扩大业务。

针对物联网扩展Postgres

对于物联网的工作负载,我们是如何扩展Postgres的: 1.我们确定了主要的瓶颈:数据集的内存/磁盘交换时间。 2.然后我们认识到时间序列的工作负载与传统的数据库(或OLTP)工作负载有非常不同的特性:

正如我们所看到的,传统的数据库工作负载倾向于对随机位置进行更新,而更新通常需要复杂的事务。

这里的典型的银行账户转账为例子:如果Alice发送Bob 10美元,那么数据库需要自动为借方和贷方两个无关的其他账户记录。

但是,另一方面,时间序列的工作负载往往是插入频繁的,主要是顺序的,具有简单的事务。我们还是以上文的银行转账为例子:插入一行,表示从Alice到Bob的$10转账,时间戳则是现在。

洞察# 1:合适大小的分块

我们可以根据时间来划分数据,这样每个分区或数据块都是合适大小的,这样的话可以使得所有的数据和索引都能在内存中运行。如果大小划分的恰到好处的话,内存磁盘间的数据交换将被最小化(或者即使是最近的或“热”的块也会被消失)。

但是,当数据严重分区时,会导致其他挑战:管理这些分区,跨分区边界查询(通常需要复杂的JOIN),插入正确的分区,根据需要创建新的分区等。这可能是一个令人头痛的问题。

洞察#2:Hypertable

Hypertable,跨所有分区的单个虚拟表,它运行起来就像一个普通的Postgres表,并隐藏了用户的所有复杂性。

从Hypertable中查询数据,它将会很好地识别包含数据的正确分区;将数据写入Hypertable,它会将元组路由到适当的分区(并在必要时创建新的分区);创建索引/约束/触发器,管理您的模式,所有这些都在Hypertable表级别,所有更改都将传播到对应的块。

现在,Hypertable的接口应该是什么样的呢?一开始我们尝试创建自己的查询语言。但是随后我们对这种方法的不切实际性感到震惊:我们必须为每个可视化工具,后端组件等创建全新的驱动,更不用说必须教育整个开发人员群体。

洞察# 3:支持SQL

但后来我们意识到有一条更简单的方法:支持SQL。每个人都知道SQL,有很多关于如何使用SQL查询的文献,还有大量的介绍SQL的资料和工具。对于目前不适合用来进行时间序列分析的SQL(和PostgresSQL),可以通过udf和查询-计划/查询-执行级别的优化来轻松地改进。(这有一些例子[13]。)

然后我们更进一步,通过把我们的工作打包成Postgres扩展。因此,现在任何与Postgres(例如可视化工具、管理工具、备份/恢复实用工具、数据基础组件等)相关的工具,都可以使用我们的新时间序列数据库。

在高层次上,这是我们构建的表征模型: 当然,问题的关键在于细节:块管理、可识别的查询、快速的元数据路由,执行Hypertable-as-a-vanilla-table保证还需要在C和PL/pgSQL级别上进行大量工作以获得正确的结果(查看更多[14])。

我们的结果:20x更高的插入,2000x更快的删除,1.2x- 14000x更快的查询

可以从结果中看到这种架构的好处: TimescaleDB可以支持每秒100k +行插入,或者每秒1M + metrics/秒。 我们的方法可以获得比普通Postgres高达10,000倍的查询速度和2000倍的快速删除

此外,由于这个体系结构,我们能够将一个Hypertable扩展到数十TB,同时在一个节点上实现每秒成千上万个插入。(更多关于我们的基准 vs Postgres和vs Postgres 10。[15])

这个设计也让我们保留了之前列出的Postgres的所有好处:

  • 关系模型+Joins:Hypertable和关系表共存
  • 可靠性、易用性、生态系统:我们的设计不会影响底层存储层,并且保持同样的SQL语法,所以它的操作就像和使用Postgres感觉一样。
  • 灵活的数据类型(包括JSON)、地理空间支持:类似地,这种方法与所有Postgres原生数据类型和扩展(如PostGIS)保持兼容。
  • 趋势:作为一个扩展,设计与Postgres相兼容,并将继续受益于Postgres的持续改进(也允许我们回馈社区)。

意外的物联网平台?

现在我们可以为物联网扩展Postgres,我们还可以在Postgres之上选择使用各种应用程序和工具:例如,Kafka、RabbitMQ、MQTT、Apache Spark、Grafana、Tableau、Rails、Django等等。

换句话说,即使Postgres是一个数十年的开源项目, 它已经不小心成为物联网的理想平台和成为计算的下一波潮流。

如果了解我们的历程是有帮助的,欢迎你用同样的方法扩展自己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最新技术。点击“阅读原文”了解大会更多详情。