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 和云端管理服务(包括 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
)会从复制中排除,且必须单独管理。