数据库

数据库复制

数据库复制和变更数据捕获 (CDC) 简介。


复制是将更改从数据库复制到另一个位置的过程。它也被称为变更数据捕获 (CDC):捕获数据中发生的所有更改。

用例#

您可能会将数据库复制用于

  • 分析和数据仓库:将您的业务数据库复制到分析平台进行复杂分析,而不会影响应用程序的性能。
  • 数据集成:保持技术栈中不同系统和服务之间的数据同步。
  • 备份和灾难恢复:在不同地点维护数据的最新副本。

复制方法#

Supabase 支持三种将数据库复制到外部目的地的方法

只读副本 (Read Replicas)#

与主数据库保持同步的额外数据库。这些只读数据库可以部署在多个区域,以降低延迟并实现更好的资源管理。

复制 (Replication)#

Supabase ETL 驱动的复制功能会自动将数据复制到支持的系统。

手动复制#

使用外部工具和 Postgres 原生的逻辑复制来配置您自己的复制。这让您可以完全控制复制过程,并允许使用任何支持 Postgres 逻辑复制的工具。

根据您的用例选择数据同步方法

  • 有关实时功能和同步数据到客户端(浏览器、移动应用)的信息,请参阅 Realtime
  • 有关在多个区域部署只读数据库的信息,请参阅 只读副本 (Read Replicas)

概念和术语#

预写日志 (WAL)#

Postgres 使用一种称为预写日志 (WAL) 的系统来管理对数据库的更改。当您进行更改时,它们会被追加到 WAL 中。WAL 是一系列文件(也称为“段”),其文件大小可以指定。一旦一个段写满,Postgres 就会开始追加到新段。经过一段时间后,会发生检查点 (checkpoint),Postgres 会将 WAL 与您的数据库同步。检查点完成后,WAL 文件就可以从磁盘中删除并释放空间。

逻辑复制和 WAL#

逻辑复制是一种复制方法,Postgres 利用 WAL 文件并将这些更改传输到另一个 Postgres 数据库或支持读取 WAL 文件的系统。

LSN#

LSN 是日志序列号 (Log Sequence Number),用于标识 WAL 文件在 WAL 目录中的位置。它通常用于确定订阅者的复制进度并计算复制槽 (replication slot) 的延迟。

逻辑复制架构#

设置逻辑复制时,涉及三个关键组件

  • publication (发布) - 主数据库上一组将被“发布”的表
  • replication slot (复制槽) - 用于从单个发布中复制数据的槽位。创建槽位时,将指定更改的输出格式
  • subscription (订阅) - 订阅是从外部系统(即另一个 Postgres 数据库)创建的,并且必须指定 publication 的名称。如果您没有指定复制槽,系统会自动创建一个

逻辑复制输出格式#

逻辑复制通常以 2 种形式输出:pgoutputwal2json。输出方法是 Postgres 向任何活动复制槽发送更改的方式。

逻辑复制配置#

使用逻辑复制时,Postgres 会配置为将 WAL 文件保留比其自身需求更长的时间。如果文件删除过快,您的 replication slot 将变得不可用;如果数据库在短时间内收到大量更改,replication slot 可能会因为无法跟上进度而丢失。

为了缓解这种情况,Postgres 提供了许多选项和设置,可以进行微调以有效管理 WAL 的使用。并非所有这些设置都可由用户配置,因为它们会影响数据库的稳定性。对于可配置的设置,应将其视为高级配置,在不了解它们可能导致额外磁盘空间和资源占用以及产生额外费用的情况下,不应轻易更改。

设置描述面向用户的配置默认
max_replication_slots允许的复制槽最大数量
wal_keep_size为复制保留的 WAL 文件最小大小
max_slot_wal_keep_size复制槽可以预留的最大 WAL 大小
checkpoint_timeoutWAL 检查点之间的最大时间