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

从 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 将数据从 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(一种基于 Spark 的摄取作业)来读取 Kafka 消息并将数据写入 S3。
  • 大多数数据处理工作都是用 PySpark 编写的。
  • 他们使用 Scala Spark 处理更复杂的工作。Notion 还利用多线程和并行处理来加快 480 个分片的处理速度。

回报

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

-------------The End-------------

本文标题:Notion 如何处理 2000 亿个数据实体?

文章作者:cloud sjhan

发布时间:2024年08月21日 - 15:08

最后更新:2024年08月21日 - 15:08

原始链接:https://cloudsjhan.github.io/2024/08/21/Notion-如何处理-2000-亿个数据实体?/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

cloud sjhan wechat
subscribe to my blog by scanning my public wechat account
坚持原创技术分享,您的支持将鼓励我继续创作!
0%
;