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[1] 將數據從 Postgres 採集到 Snowflake,每小時使用 480 個連接器將 480 個分片寫入原始的 Snowflake 表。

然後,Notion 會將這些表合併成一個大表,用於分析和機器學習工作負載。

但當 Postgres 數據增長時,這種方法就會出現一些問題:

管理 480 個 Fivetran 連接器簡直就是一場噩夢。

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 連接器。

回報

參考資料

[1]

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

[2]

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/3gcXhTTR1OtDjw0MC82Prw