由 John Doe 十一月 13, 2025
AWS 从早期 BDR 的开源版本分叉出来一个组件 pgactive,并集成到了其云平台上 PostgreSQL 服务中。

概述
数据库复制是一种在多个数据库实例之间复制数据变更的方法,也是实现诸多应用场景的关键组件,例如保障高可用性、降低应用程序与源数据之间的延迟、在生产环境与测试环境等不同系统间迁移数据等。PostgreSQL 等关系型数据库通常支持“主-备”(active-standby)复制模式:一个数据库实例接收数据变更,并将这些变更同步到一个或多个只读数据库实例。由于“主-备”集群中的数据变更仅能在单个主实例上发生,构建适用于这种部署架构的应用程序会更简单直接,因为存在一个包含所有最新变更的“单一事实源”。
有时,用户更倾向于采用“双活”(active-active)复制架构的数据库集群:在同一集群中,多个实例均可写入数据。在异步“双活”复制部署模式下,集群中的多个数据库都能接收数据变更并同步到其他数据库,但这也意味着该数据库集群不存在“单一事实源”。这种架构的典型应用场景包括:运行跨多个区域的高可用数据库集群、降低应用程序与数据库之间的写入延迟、对应用程序进行灰度部署,以及在必须同时保持可写状态的两个系统间迁移数据。需要注意的是,适用于“双活”数据库集群的应用程序必须经过特殊设计,以应对该部署架构下可能出现的特殊情况,例如写入冲突、复制延迟,以及无法使用某些便捷的数据库特性(如自增整数序列)等问题。
逻辑复制是“双活”复制的核心组件。逻辑复制采用特定的数据格式,允许外部系统在将数据变更应用到目标数据库之前,先对这些变更进行解析。这使得目标系统能够执行额外操作,例如检测并解决写入冲突,或将变更语句转换为目标数据库软件支持的格式。PostgreSQL 早在 2017 年发布的 10 版本中就原生支持逻辑复制,但要完全支持“双活”复制架构,仍需补充更多功能。从 PostgreSQL 的设计来看,开发者可以通过扩展构建支持“双活”复制所需的组件;与此同时,PostgreSQL 开发社区也在持续推进相关功能向官方核心代码的集成。
pgactive 扩展的局限性
- 所有表均需设置主键(Primary Key),否则不允许执行更新(Update)和删除(Delete)操作。此外,主键列中的值不应被修改。
- 序列(Sequences)可能存在间隔,有时还可能不符合顺序规则,且序列不会被复制。
- 数据定义语言(DDL)和大对象(large objects)不会被复制。
- 二级唯一索引可能导致数据不一致(data divergence)。
- 集群中所有节点的排序规则(Collation)必须完全一致。
- 在节点间进行负载均衡属于反模式(在特定场景下会引发问题的不当设计模式)。
- 大型事务可能会引发复制延迟。
结论
主主复制是一种强大的数据传输技术,可用于在不同的数据库操作中保持可用性,并降低分布在多个区域中的应用程序的写入延迟。pgactive支持使用双主拓扑部署 PostgreSQL 实例,并提供管理主主复制的基础功能,例如冲突检测和解决。然而,尽管主主复制有助于最大限度地延长正常运行时间,但您必须设计应用程序以使其与双主架构兼容,并使用相关技术来最大限度地减少写入冲突。
参考
pgactive:https://github.com/aws/pgactive