Notion 如何处理 2000 亿个数据实体?

文摘   2024-08-25 20:14   中国香港  

从 PostgreSQL → Data Lake

本文最初发表于 https://vutr.substack.com。

介绍

如果你用过 Notion,你就会知道它几乎可以让你做任何事情--记笔记、计划、阅读清单和项目管理。

Notion 非常灵活,可以定制用户喜欢的模板。Notion 中的一切都是块,包括文本、图像、列表、数据库行甚至页面。

这些动态单元可以转换成其他块类型,也可以在 Notion 中自由移动。

Blocks are Notion’s LEGOs.

PG 统治一切

最初,Notion 将所有数据块存储在 Postgres 数据库中。

2021 年,他们拥有超过 200 亿个区块。

现在,这些区块已经增长到两千多亿个实体,2021 年之前,他们将所有区块都放在一个 Postgres 实例中。现在,他们将数据库分割成 480 个逻辑分片,并将它们分布在 96 个 Postgres 实例上,每个实例负责 5 个分片。

在 Notion,Postgres 数据库负责处理从在线用户流量到离线分析和机器学习的所有事务。

认识到分析用例的爆炸性需求,特别是他们最近推出的 Notion AI 功能,他们决定为离线工作负载建立一个专用的基础架构。

Fivetrans 和 Snowflake

2021 年,他们开始了简单的 ETL 之旅,使用 Fivetran[1] 将数据从 Postgres 采集到 Snowflake,每小时使用 480 个连接器将 480 个分片写入原始的 Snowflake 表。

然后,Notion 会将这些表合并成一个大表,用于分析和机器学习工作负载。

但当 Postgres 数据增长时,这种方法就会出现一些问题:

管理 480 个 Fivetran 连接器简直就是一场噩梦。

  • Notions 用户更新数据块的频率高于添加新数据块的频率。这种大量更新的模式会降低 Snowflake 数据摄取的速度和成本。
  • 数据消耗变得更加复杂和繁重(人工智能工作负载)

Notion 开始建设内部数据湖。

The Lake

他们希望建立一个能提供以下功能的解决方案:

  • 可扩展的数据存储库,用于存储原始数据和处理过的数据。
  • 为任何工作负载提供快速、经济高效的数据摄取和计算。特别是对于更新量大的块数据。

2022 年,他们启用了内部数据湖架构,该架构使用 Debezium 将数据从 Postgres 增量摄取到 Kafka,然后使用 Apache Hudi 将数据从 Kafka 写入 S3。

对象存储将作为消费系统的终端,为分析、报告需求和人工智能工作负载提供服务。

他们使用 Spark 作为主要数据处理引擎,处理湖泊顶部的数十亿个数据块。从 Snowflake 迁移的数据摄取和计算工作负载可帮助他们大幅降低成本。Postgres 的变化由 Kafka Debezium Connector 捕捉,然后通过 Apache Hudi 写入 S3。

Notion 之所以选择这种表格格式,是因为它能很好地应对更新繁重的工作负载,并能与 Debezium CDC 报文进行本地集成。

下面简要介绍一下他们是如何实现该解决方案的:

每台 Postgres 主机一个 Debeizum CDC 连接器。

  • Notion 在托管的 AWS Kubernetes (EKS) 上部署了这些连接器
  • 该连接器可处理每秒数十 MB 的 Postgres 行更改。
  • 每个 Postgres 表有一个 Kafka 主题。
  • 所有连接器都将从所有 480 个分片中消耗数据,并将数据写入该表的同一主题。
  • 他们使用 Apache Hudi Deltastreamer[2](一种基于 Spark 的摄取作业)来读取 Kafka 消息并将数据写入 S3。
  • 大多数数据处理工作都是用 PySpark 编写的。
  • 他们使用 Scala Spark 处理更复杂的工作。Notion 还利用多线程和并行处理来加快 480 个分片的处理速度。

回报

  • 2022 年,将数据从 Snowflake 迁移到 S3 为 Notion 节省了 100 多万美元,2023 年和 2024 年节省的费用将更为可观。
  • 从 Postgres 到 S3 和 Snowflake 的总体摄取时间大幅缩短,小表的摄取时间从一天以上缩短到几分钟,大表的摄取时间则缩短到几个小时。
  • 新的数据基础设施可提供更先进的分析用例和产品,从而在 2023 年和 2024 年成功推出 Notion AI 功能。
参考资料
[1]

Fivetran: https://www.fivetran.com/

[2]

Apache Hudi Deltastreamer: https://hudi.apache.org/docs/0.10.0/hoodie_deltastreamer/


Go Official Blog
Golang官方博客的资讯翻译及独家解读
 最新文章