为RDI准备PostgreSQL

准备PostgreSQL数据库以与RDI一起工作

PostgreSQL 支持多种 逻辑解码插件 以实现 CDC。如果您不想使用原生的 pgoutput 逻辑复制流支持, 则必须在 PostgreSQL 服务器中安装您首选的插件。完成此操作后, 您必须启用一个复制槽,并配置一个具有执行复制权限的用户。

如果您使用像Heroku Postgres这样的服务来托管您的数据库,那么这可能会限制您可以使用的插件。如果您无法使用您首选的插件,那么如果您使用的是PostgreSQL 10或更高版本,可以尝试pgoutput解码器。如果这也不适合您,那么您将无法在您的数据库中使用RDI。

Amazon RDS for PostgreSQL

按照以下步骤启用Amazon RDS for PostgreSQL的CDC功能:

  1. 将实例参数 rds.logical_replication 设置为 1。

  2. 检查wal_level参数是否设置为logical,可以通过运行查询SHOW wal_level作为数据库RDS主用户。在多区域复制设置中,此参数可能没有此值。您不能手动更改此值,但当您将rds.logical_replication参数设置为1时,它应该会自动更改。如果它没有更改,那么您可能只需要重新启动数据库实例。您可以手动重新启动,或者等待在维护窗口期间发生重新启动。

  3. 将Debezium的plugin.name参数设置为pgoutput

  4. 从具有rds_replication角色的AWS账户启动逻辑复制。该角色授予管理逻辑槽和使用逻辑槽流式传输数据的权限。默认情况下,只有AWS上的主用户账户在Amazon RDS上具有rds_replication角色,但如果您具有管理员权限,您可以使用如下查询将该角色授予其他账户:

    GRANT rds_replication TO <my_user>
    

    为了使非主账户能够创建初始快照,您必须授予这些账户对要捕获的表的SELECT权限。有关更多信息,请参阅关于PostgreSQL逻辑复制的安全性的文档。

安装逻辑解码输出插件

截至PostgreSQL 9.4,读取预写日志更改的唯一方法是 安装逻辑解码输出插件。 这些插件是使用PostgreSQL特定的API用C语言编写的,如 PostgreSQL文档中所述。 PostgreSQL连接器使用Debezium支持的一个逻辑解码插件,以默认的 pgoutput格式(由PostgreSQL提供)或 Protobuf格式从数据库接收更改事件。 有关如何编译以及其要求和限制的更多详细信息,请参阅 decoderbufs Protobuf插件文档

为了简化操作,Debezium 还提供了一个容器镜像,该镜像在上游的 PostgreSQL 服务器镜像基础上编译并安装了插件。将此镜像作为安装步骤的示例使用。

注意:
Debezium 逻辑解码插件已在 Linux 机器上进行了测试,但如果您使用的是 Windows 或其他操作系统,安装步骤可能与此处列出的步骤不同。

插件差异

插件并不都以完全相同的方式运行。当它们检测到数据库模式发生变化时,所有插件都会刷新有关数据库模式的信息,但pgoutput插件比其他一些插件更“急切”地执行此操作。例如,pgoutput在检测到列默认值的变化时会刷新,而其他插件直到发生更显著的变化(例如添加新表列)时才会注意到这一点。

Debezium 项目维护了一个 Java 类,用于跟踪插件之间的已知差异。

配置 PostgreSQL 服务器

如果你想使用默认的pgoutput以外的逻辑解码插件,那么你必须首先在postgresql.conf文件中配置它。设置shared_preload_libraries参数以在启动时加载你的插件。例如,要加载decoderbufs插件,你需要添加以下行:

# MODULES
shared_preload_libraries = 'decoderbufs'

添加以下行以配置复制槽(适用于任何插件)。 这指示服务器使用预写日志进行逻辑解码。

# REPLICATION
wal_level = logical            

如果需要,您还可以设置其他PostgreSQL流复制参数。 例如,您可以使用max_wal_sendersmax_replication_slots来增加 可以同时访问发送服务器的连接器数量, 并使用wal_keep_size来限制复制槽保留的最大WAL大小。 配置参数 文档描述了您可以使用的所有参数。

PostgreSQL的逻辑解码使用复制槽。这些复制槽保证保留Debezium所需的所有WAL段,即使Debezium发生故障。您应仔细监控复制槽,以避免过多的磁盘消耗和其他情况,如目录膨胀,如果复制槽使用不频繁,可能会发生这种情况。有关更多信息,请参阅PostgreSQL文档中的复制槽。 如果您使用的synchronous_commit设置不是on,那么您应将wal_writer_delay设置为大约10毫秒的值,以确保变更事件的低延迟。如果您不设置此值,则默认值约为200毫秒。

注意:
本指南总结了PostgreSQL预写日志的操作,但我们强烈建议您查阅PostgreSQL预写日志文档以获得更好的理解。

设置权限

Debezium连接器需要一个具有REPLICATION和LOGIN角色的数据库用户,以便它能够执行复制操作。默认情况下,超级用户拥有这些角色,但出于安全考虑,您应该为Debezium用户提供最低必要的权限,而不是完全的超级用户权限。

如果您拥有管理员权限,那么您可以使用如下查询为您的Debezium用户创建一个角色。请注意,这些是用户执行复制所需的最低权限,但您可能还需要授予其他权限。

CREATE ROLE <name> REPLICATION LOGIN;

为Debezium设置权限以使用pgoutput创建PostgreSQL发布

Debezium用户需要特定的权限来使用pgoutput插件。 该插件从PostgreSQL为您选择的源表生成的 publications 中捕获变更事件。一个publication包含来自一个或多个表的变更事件,这些事件使用publication specification中的标准进行过滤。

如果您拥有管理员权限,您可以手动创建发布规范,或者您可以授予Debezium用户自动创建发布规范的权限。所需的权限是:

  • 在数据库中的复制权限,用于将表添加到发布中。
  • CREATE 数据库上的权限以添加发布。
  • SELECT 权限用于复制初始表数据。表所有者自动拥有表的 SELECT 权限。

要将表添加到出版物中,用户必须是表的所有者。然而,在这种情况下,源表已经存在,因此您必须使用PostgreSQL复制组在Debezium用户和原始所有者之间共享所有权。使用以下命令配置复制组:

  1. 创建复制组(这里的名称replication_group只是一个示例):

    CREATE ROLE replication_group;
    
  2. 将表的原始所有者添加到组中:

    GRANT replication_group TO original_owner;
    
  3. 将Debezium复制用户添加到组中:

    GRANT replication_group TO replication_user;
    
  4. 将表的所有权转移到 replication_group:

    ALTER TABLE table_name OWNER TO replication_group;
    

您还必须将publication.autocreate.mode参数的值设置为filtered,以允许Debezium指定发布配置。请参阅Debezium文档中的publication.autocreate.mode以了解更多关于此设置的信息。

配置PostgreSQL以与Debezium连接器主机进行复制

您必须配置数据库以允许与运行PostgreSQL Debezium连接器的主机进行复制。为此,您需要在基于主机的认证文件pg_hba.conf中为每个需要使用复制的客户端添加一个条目。例如,要在服务器机器上本地为启用复制,您可以添加如下一行:

local   replication     <youruser>                          trust

要允许本地主机上的使用IPV4接收复制更改,请添加以下行:

host    replication     <youruser>  127.0.0.1/32            trust

允许本地主机上的使用IPV6接收复制更改,添加以下行:

host    replication     <youruser>  ::1/128                 trust 

从PostgreSQL页面了解更多关于 pg_hba.conf网络地址类型的信息。

支持的PostgreSQL拓扑结构

您可以将Debezium PostgreSQL连接器与独立的PostgreSQL服务器或服务器集群一起使用。 对于12及以下版本,PostgreSQL仅支持在主服务器上的逻辑复制槽。 这意味着Debezium只能连接到主服务器进行CDC,如果此服务器发生故障,连接将停止。如果同一服务器在服务恢复时被提升为主服务器,那么您可以简单地重新启动Debezium连接器。然而,如果不同的服务器被提升为主服务器,则必须在重新启动之前重新配置Debezium以使用新服务器。此外,请确保新服务器具有适用于Debezium的正确插件和配置。

RATE THIS PAGE
Back to top ↑