将Postgres转变为快速OLAP数据库


pg_analytics 是一个扩展,可将任何 Postgres 数据库的本地分析性能提高 94 倍。安装 pg_analytics 后,Postgres 的速度比 Elasticsearch 快 8 倍,在分析基准测试中几乎与 ClickHouse 不相上下。

如今,在 Postgres 中存储数十亿数据点的开发人员都在为查询速度慢和数据压缩能力差而苦恼。即使对数据库进行了调整,复杂的分析查询(如计数、窗口函数、字符串聚合)也需要数分钟到数小时不等。因此,许多企业转而使用 Elasticsearch 等外部分析数据存储。这增加了操作的复杂性,因为数据变得孤立,工程师必须学会使用新的数据库。

pg_analytics直接在Postgres内部加速分析查询,是在Postgres中进行分析的即插即用解决方案,无需将数据提取、转换和加载(ETL)到另一个系统中。这篇博文的目的是分享pg_analytics是如何构建的,以及为什么现在是构建基于Postgres的分析型数据库的空前时机。

工作原理
普通 Postgres 表(称为堆表)按行组织数据。虽然这对操作数据来说是合理的,但对分析查询来说却效率低下,因为分析查询经常要从表中的子集列扫描大量数据。

deltalake 表的行为与普通 Postgres 表类似,但通过 Apache Arrow 使用面向列的布局,并利用 Apache DataFusion(一个针对面向列的数据进行了优化的查询引擎)。这意味着用户可以在创建表格时选择面向行还是面向列的存储方式。

Arrow 和 Datafusion 通过 Postgres API 的两个功能与 Postgres 集成:表访问方法和执行器钩子。

  • 表访问方法将 deltalake 表注册到 Postgres 目录中,并处理插入等数据操作语言(DML)语句。
  • 执行器钩子会拦截查询并将其转发给 DataFusion,DataFusion 会解析查询、构建最佳查询计划、执行查询并将结果返回给 Postgres。

数据通过 Parquet 保存到磁盘,这是一种高度压缩的面向列数据的文件格式。得益于 Parquet,ParadeDB 压缩数据的能力是普通 Postgres 和 Elasticsearch 的 5 倍。

最后一个依赖项是 delta-rs,它是 Delta Lake 基于 Rust 的实现。该库为 Parquet 存储添加了 ACID 事务、更新和删除以及文件压缩功能。它还支持通过 S3 等数据湖进行查询,这为未来将 Postgres 表连接到云数据湖提供了可能。

为什么选择 DataFusion
在 Postgres 中建立最先进的分析型数据库是一项既昂贵又难以完成的任务。

首批基于 Postgres 的分析数据库之一 Greenplum 于 2005 年发布。此后,Citus 和 Timescale 等几家公司也开发了类似的产品。然而,这些数据库与非 Postgres OLAP 对应数据库之间的性能差距很大。这也是 Elasticsearch 等系统即使在偏好 Postgres 的公司中也很受欢迎的原因之一。

最近,像 DataFusion 这样的可嵌入式查询引擎改变了游戏规则,其查询速度超过了许多 OLAP 数据库。DataFusion 从包括 Postgres 在内的任何数据库中获得了卓越的分析性能。

卡内基梅隆大学数据库教授安迪-帕夫洛(Andy Pavlo)说得没错。如今,在数据库中从头构建查询引擎已经毫无意义。相反,下一代分析型数据库应该集成现有的、可嵌入的查询引擎,如 DataFusion,它可以随着引擎本身的改进而不断改进数据库。


网友讨论:
如果将 Postgres 用于 OLTP 工作:

  • 1.根据 Clickbench 的结果,pg_analytics 还远远达不到顶级性能。如果你正在寻找高性能的 OLAP 数据库,你应该考虑排名靠前的产品。
  • 2.Clickbench 测试的查询非常简单,与真实的数据分析场景相去甚远。您必须了解 TPC-DS 和 TPC-H 基准,因为 ClickHouse 根本无法运行这些测试套件,所以他们的 Clickbench 不包括这些数据集。

如果你的企业有一定规模,将 OLTP 和 OLAP 分为两个数据库是正确的选择,因为你将有两个不同的团队负责两个不同的任务。顺便说一下,我使用 StarRocks 进行 OLAP 工作。

用于 OLAP 工作负载的 Postgres fork 有很多,例如

  • - Greenplum;
  • - Citus with cstore_fdw;
  • - IMCS (Konstantin Knizhnik);
  • - Hydra;
  • - AlloyDB;