内容提要
Lakebase Postgres将Postgres的WAL日志作为持久化数据源,使对象存储成为事务数据库的底层存储。通过将日志视为数据库,数据文件作为派生缓存,系统支持按LSN寻址历史数据,实现秒级分支、即时恢复和低成本副本。这使代理工作负载能安全操作数据库,并支持LTAP分析,无需复制数据。
延伸解读
WAL作为数据源:从恢复到历史查询
传统上,Postgres的WAL仅用于崩溃恢复,一旦数据落盘就会被清理。Lakebase Postgres将WAL视为持久化的事务日志,使数据库的历史状态可寻址。这意味着可以按LSN查询任意时间点的数据,而无需依赖备份或复制。这种设计将数据库从“当前状态的快照”转变为“完整的事务时间线”,为时间旅行查询和审计提供了基础。
分支与恢复:成本与规模无关
在Lakebase Postgres中,创建分支或进行时间点恢复不再需要复制数据,而是创建指向特定LSN的指针。分支采用写时复制,写入仅存储增量,因此即使数据库规模很大,操作也几乎瞬时完成且成本极低。这使代理可以安全地隔离测试,而恢复操作也只需指向之前的LSN,无需等待数据复制,显著降低了错误操作的成本。
对象存储的适用性:并非直接读取
常见的反对意见认为对象存储不适合OLTP,因为延迟高且不支持随机更新。但Lakebase Postgres的设计中,查询并不直接读取对象存储,而是通过本地缓存和页面服务器提供低延迟访问。对象存储仅作为持久化层,存储不可变的层文件,这恰好符合其特性。因此,关键在于架构设计,而非对象存储本身的性能。
LTAP:消除数据复制与同步
Lakebase Postgres的LTAP(Lake事务/分析处理)允许分析查询直接读取对象存储中的列式数据,而无需通过CDC或镜像复制数据。事务和分析共享同一份持久化数据,避免了数据不一致和同步延迟。分析查询仅需获取当前LSN,大部分数据从对象存储读取,减轻了事务系统的负载,实现了事务与分析工作负载的隔离。
Q&A
Lakebase Postgres如何实现对象存储作为事务数据库的底层存储?
Lakebase Postgres将Postgres的WAL日志作为持久化数据源,数据文件作为派生缓存。计算层运行标准Postgres,存储层负责正确性、持久性和历史,使用对象存储保存不可变的层文件,并通过GetPage@LSN操作按LSN提供页面版本。
Lakebase Postgres中的WAL日志有什么特殊作用?
WAL日志记录了数据库所有修改的字节级有序历史,每个记录有唯一的LSN。Lakebase Postgres将WAL视为数据库本身,数据文件只是派生缓存,从而使得历史数据可按LSN寻址,支持分支、恢复和低成本副本。
Lakebase Postgres如何实现秒级分支?
创建分支时,不是复制数据页,而是创建一个指向特定LSN的指针,分支从该点开始以写时复制语义分叉。写入分支的数据作为与父分支的差异存储,因此即使2TB的数据库也能在几秒内创建分支,且对父分支无额外负载。
Lakebase Postgres的即时恢复是如何工作的?
恢复即指向较早的LSN并从中断处继续,无需复制数据,成本不随数据库大小变化。可恢复的时间范围由保留设置决定。这使得代理的错误可以快速撤销,只需将分支指回错误发生前的LSN。
Lakebase Postgres如何支持低成本副本?
只读计算节点不是数据副本,它从同一存储层请求页面,因此添加只读节点只是元数据操作,无需等待数据同步。空闲计算节点可完全关闭,5分钟无活动后挂起,恢复只需几百毫秒,从而降低成本。
什么是LTAP,Lakebase Postgres如何实现它?
LTAP(Lake Transactional/Analytical Processing)是指事务和分析共享同一份数据,无需复制。Lakebase Postgres将页面物化到对象存储时转码为列式格式,分析查询通过获取当前LSN,从对象存储读取大部分数据,仅从pageserver获取最新未物化变更,从而避免分析负载影响事务。
Lakebase Postgres如何处理历史数据查询?
通过GetPage@LSN操作,存储层根据请求的LSN返回对应页面版本。系统使用持久化数据结构(层覆盖树)高效定位覆盖指定LSN的层,使得历史读取与当前读取成本相同。