Raouf Chebri:无服务器 Postgres 中的时间点恢复揭秘

💡 原文英文,约1700词,阅读约需6分钟。
📝

内容提要

Neon数据库中的Point-In-Time Restore(PITR)功能可帮助用户在数据丢失时恢复到之前的状态。PITR利用Write-Ahead Logging(WAL)和基本备份实现,用户可以定义恢复策略并通过回放WAL来恢复数据库。Neon通过引入灾难恢复工具Barman和存储引擎的优化来解决备份过程中的性能下降、存储容量有限和单点故障等问题。存储引擎将WAL存储在AWS S3中,使得Postgres成为无状态计算实例,实现了快速启动和无需备份的特点。通过创建临时分支来访问数据库的历史状态。Neon的PITR功能可靠且便捷,与Postgres的结合使用具有优势。

🔎

延伸解读

传统Postgres PITR的挑战

在标准Postgres中,实现PITR需要配置WAL归档和定期基础备份。恢复时需还原最新备份并回放WAL,这可能导致性能下降。此外,有限的存储容量要求设定保留期,限制了可恢复的时间范围。若备份和WAL存储在同一位置,还存在单点故障风险。这些因素增加了运维复杂性和成本。

Neon架构如何简化PITR

Neon将WAL流式传输到自定义存储引擎,并持久化到AWS S3,使Postgres成为无状态计算实例。这消除了对备用实例和传统备份的需求,因为存储引擎自动管理WAL和压缩。Pageservers累积WAL并创建不可变层文件,能根据LSN或时间戳重建任意时间点的数据状态,无需冗长的恢复过程。

临时分支与时间旅行查询

Neon的临时分支允许用户通过指定LSN或时间戳连接到数据库的历史状态,TTL仅为10秒。这支持时间旅行查询,使用户能在恢复前审查数据。该功能基于Pageservers的GetPage@LSN机制,是Neon PITR的一部分,为开发者提供了便捷的历史数据访问方式,并有望集成到开发工作流中。

❓

Q&A

Neon 的 PITR 功能是如何实现的?

Neon 的 PITR 基于其存储引擎,将 WAL 流式传输到自定义的 Rust 存储引擎,并存储在 AWS S3 中。存储引擎由 Safekeepers、Pageservers 和 S3 持久层组成。Pageservers 累积 WAL 记录并创建不可变层文件(Image layers 和 Delta layers),从而能够重建任意时间点的数据状态。用户可以通过创建临时分支指定 LSN 或时间戳来访问历史状态。

在传统 Postgres 中做 PITR 有哪些局限性?

传统 Postgres 的 PITR 存在三个主要局限性:1) 备份时可能出现性能下降;2) 存储容量有限,必须定义保留期(retention period),限制了可恢复的时间范围;3) 所有基础备份和 WAL 归档存储在同一位置,存在单点故障(SPOF)。

Neon 的存储引擎由哪些组件构成?

Neon 的存储引擎由三部分组成:1) Safekeepers:持久层,使用 Paxos 共识算法确保数据不丢失;2) Pageservers:多租户存储层,能从 WAL 重建数据并发送给 Postgres;3) 第二个持久层:将 WAL 持久存储在 AWS S3 中。

什么是 Neon 的临时分支(ephemeral branches)?

临时分支是 Neon 中一种短暂存在的分支,具有 10 秒的生存时间(TTL)。它允许用户通过指定 LSN 或时间戳连接到数据库的先前状态,实现时间旅行查询。这些分支是写时复制克隆,代表数据历史中任意时间点的状态,由 Pageservers 原生支持。

Neon 如何解决传统 Postgres 备份中的单点故障问题?

Neon 通过将 WAL 流式传输到自定义存储引擎,并将数据持久化在 AWS S3 中,避免了单点故障。此外,由于 Postgres 变为无状态计算实例,崩溃时可以快速启动新实例,无需备用节点(standby),从而消除了对传统备份和备用节点的依赖。

Neon 的 Pageservers 如何工作?

Pageservers 是 Neon 存储引擎中的多租户存储层。它累积 WAL 记录,当记录达到约 1GB 时,创建两种不可变层文件:Image layers(包含特定 LSN 下键范围的快照)和 Delta layers(包含键范围内的增量变化)。Pageservers 能根据任意 LSN 或时间线重建页面状态,支持 GetPage@LSN 函数。

🏷️

标签

➡️

继续阅读