本页简要介绍了 pglogical
扩展程序及其优势和限制。
概览
pglogical
扩展是一款专为 PostgreSQL 设计的强大且灵活的逻辑复制工具,还支持高可用性 (HA) 和灾难恢复 (DR)。
传统二进制复制(通常称为物理复制)会在文件系统和块级复制更改,从而在目标系统中生成物理镜像。虽然物理复制非常可靠,并且可保护整个数据库集群,但它只能单向复制,并且需要访问底层数据库数据文件和预写式日志 (WAL) 文件。
而 pglogical
扩展程序会从提供方数据库中提取 SQL 更改并进行复制,然后针对一个或多个订阅方数据库重放这些更改。这种复制称为逻辑复制。
使用 pglogical
扩展程序,您可以执行以下操作:
- 在多个 AlloyDB Omni 数据库之间复制数据。
- 在 AlloyDB Omni 和 Google Cloud AlloyDB 之间复制数据。
- 在 AlloyDB Omni 与其他 PostgreSQL 发行版(包括许多第三方云服务)之间复制数据。
优势
使用 pglogical
扩展程序的逻辑复制具有以下优势:
选择性复制:可灵活设置过滤条件和规则,以确定要复制哪些数据以及复制到何处。您可以选择要包含哪些表,以及如何处理新表(无论是否包含)。您还可以添加列和行过滤条件。如果您希望订阅者代表提供方的一些尾随时间点,则可以添加可选的
apply delay
。双向复制和多主复制:所有成员数据库均处于读写状态,并且完全可用。每个端点数据库既充当提供方又充当订阅方,支持创建高级复制场景,并支持在不同端点进行数据更新。
云服务提供商支持:Google 等云服务提供商认识到
pglogical
扩展程序的价值,并将其集成到其云服务(例如 Google Cloud SQL for PostgreSQL 和 AlloyDB)中。其他云服务提供商也将pglogical
扩展程序作为选项提供,支持多云或混合云配置。跨版本复制:由于 pglogical 会复制实际的 SQL 语句,因此它允许在 PostgreSQL 主要版本之间进行复制。尤其是当提供方源数据库的版本低于订阅方目标数据库的版本时,可以可靠地实现跨版本复制。
pglogical
扩展程序支持许多较低版本的 PostgreSQL,例如 9.4 及更高版本。因此,对于处理旧版系统并希望将数据复制到较新版本的 PostgreSQL(例如 AlloyDB Omni 和 Google Cloud AlloyDB 中使用的版本)的情况,它是最佳选择。
总而言之,pglogical
扩展程序提供了功能丰富的逻辑复制解决方案,可与旧版 PostgreSQL 和 Cloud 托管服务(包括 Google Cloud SQL for PostgreSQL 和 AlloyDB)兼容。
逻辑复制的限制
所有逻辑复制技术(包括与其他关系型数据库平台搭配使用的技术)都存在一些限制,任何管理不当都可能会破坏复制过程。
为了实现可靠的实现,请考虑以下几点:
- 关于如何处理复制范围之外的数据库级范围对象和集群级范围对象的注意事项。
pglogical
扩展程序在数据库级别运行,并且仅针对一组指定的表和序列运行。必须使用其他方法复制其他对象类型(例如函数和过程)。 - 建议所有复制表都必须具有主键。您可以使用表
REPLICA IDENTITY
功能告知pglogical
扩展程序哪些列可唯一标识行。请尽可能避免这种情况。没有主键的表属于静态表,绝不会是UPDATED
或DELETED
,并且仅支持INSERTS
。这类表不需要主键。 - 管理订阅者数据库中的触发器和序列。默认情况下,触发器会定义为
ORIGIN
或LOCAL
触发器,并且在行复制时不会在订阅者数据库中触发。应检查所有触发器,确保为所有触发器设置REPLICA
选项,以便在不需要时不会在订阅方触发。 - 通过
who wins
规则手动或自动处理冲突解决方案。 - 通过以下方式复制数据定义语言 (DDL) 命令:在所有端点上手动实现,或在提供方数据库上使用适当的
pglogical
API 函数自动将 DDL 复制到订阅方数据库。 - 确保新创建的表和序列会手动或自动添加到主数据库上的复制集。
- 确保复制拓扑中的所有端点之间存在强大、高性能、可靠且安全的 TCP 网络。
pglogical
扩展程序的其他限制包括:
pglogical
版本 2.4.3 目前需要超级用户权限。- 虽然大多数表和序列都可以复制,但
pglogical
扩展程序不会复制其他对象类型,也不会复制TEMPORARY
和UNLOGGED
表。 - 如需复制 DDL,必须使用 pglogical API 函数。系统不会复制原生 DDL 命令,但
TRUNCATE
命令除外。 - 在每个表和每个序列的对象级别上运行,并按数据库进行部署。这意味着,某些对象(包括
users
和roles
等集群级对象)会被排除在复制范围之外,并且必须单独管理。