pglogical 扩展程序简介

选择文档版本:

本页面简要介绍了 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 扩展程序告知哪些列可唯一标识行。请尽可能避免这种情况。没有主键的表本质上是静态的,永远不会是 UPDATEDDELETED,且仅支持 INSERTS。这些类型的表不需要主键。
  • 管理订阅方数据库中的触发器和序列。默认情况下,触发器会定义为 ORIGINLOCAL 触发器,且在复制行时不会在订阅方数据库上触发。应检查所有触发器,以确保为任何触发器设置 REPLICA 选项,以便除非需要,否则它不会在订阅方端触发。
  • 通过 who wins 规则手动或自动处理冲突问题。
  • 复制数据定义语言 (DDL) 命令,方法是:在所有端点上手动实施,或使用提供方数据库中的相应 pglogical API 函数自动将 DDL 复制到订阅方数据库。
  • 确保新创建的表和序列已手动或自动添加到主数据库中的复制集。
  • 确保复制拓扑中的所有端点之间存在强大、高效、可靠且安全的 TCP 网络。

pglogical 扩展程序的其他限制和局限包括以上内容:

  • 目前,pglogical 2.4.3 版需要超级用户权限。
  • 虽然大多数表和序列都可以复制,但其他对象类型不会被 pglogical 扩展程序复制,TEMPORARYUNLOGGED 表也不会被复制。
  • 如需复制 DDL,必须使用 pglogical API 函数。系统不会复制原生 DDL 命令(除了 TRUNCATE 命令)。
  • 针对每个表和每个序列的对象级别进行操作,并按数据库进行部署。这意味着,某些对象(包括集群级对象,例如 usersroles)会从复制中排除,且必须单独管理。

后续步骤