Notion的危机:他们如何解决数据库问题
2021年,Notion的流行程度飙升,但其服务变得极其缓慢。问题在于其独特的数据模型,其中所有内容都是一个块,可以是一段文本、一张图片,甚至是整个页面本身。这种结构允许令人难以置信的多功能性,但也意味着即使是简单的文档也可能导致数百或数千个数据库条目。
每个块都作为具有其自身唯一ID的Postgres数据库中的一行存储。庞大的数据量最终导致用户在请求页面数据时注意到延迟增加。Notion的单体数据库再也无法处理负载,它们的Postgres vacuum进程开始持续安装,导致表膨胀和性能下降。
解决方案:水平扩展和分片
Notion决定对其数据库进行分片,创建32个物理数据库实例,每个实例包含15个独立的逻辑模式。每个模式将拥有自己的表,例如块、工作区和评论,在32个物理数据库中总共有480个分片。路由机制是在应用程序级别确定的,以确定数据存储的位置。
挑战:数据迁移和连接限制
Notion必须将其现有数据迁移到新的分片,同时保持数据一致性。他们使用Postgres逻辑复制将新的更改持续应用到新的数据库。该过程涉及在每个现有数据库上设置三个Postgres发布,每个发布涵盖新数据库上的五个逻辑模式。创建订阅以使用三个发布中的一个,有效地覆盖相关的数据集。
然而,测试发现了一个关键问题:每个旧分片映射到三个新分片,这要求他们要么减少每个PG bouncer实例的连接数,要么将其增加3倍。他们选择增加连接限制,这使他们能够在将更改推出到生产环境之前保持适当数量的连接。
结果:增加容量和提高性能
重新分片项目对Notion来说是一个巨大的成功。一些关键成果包括:
- 增加了容量
- 提高了性能
- CPU和IOPS利用率大幅下降,在高峰流量期间,新的利用率徘徊在20%左右,而之前则为90%
- 这新的架构使Notion能够应对持续的用户增长和持续的数据需求。
总之,Notion的危机是通过水平扩展和分片、谨慎的数据迁移以及巧妙解决连接限制的组合来解决的。他们的新架构使他们能够持续增长和成功。