7.5. 设置 PostgreSQL 以运行 Debezium 连接器


这个 Debezium 发行版本只支持原生 pgoutput 逻辑复制流。要设置 PostgreSQL 以便使用 pgoutput 插件,您必须启用复制插槽,并配置具有足够特权的用户来执行复制。

详情包括在以下主题中:

7.5.1. 为 Debezium pgoutput 插件配置复制插槽

PostgreSQL 的逻辑解码使用复制插槽。要配置复制插槽,请在 postgresql.conf 文件中指定以下内容:

wal_level=logical
max_wal_senders=1
max_replication_slots=1

这些设置指示 PostgreSQL 服务器,如下所示:

  • wal_level - 使用带有 write-ahead 日志的逻辑解码。
  • max_wal_senders - 使用最多一个独立进程来处理 WAL 更改。
  • max_replication_slots - 允许创建最多一个复制插槽来流传输 WAL 更改。

复制插槽可以保证保留 Debezium 所需的所有 WAL 条目,即使在 Debezium 中断期间也是如此。因此,务必要密切监控复制插槽以避免:

  • 磁盘消耗太多
  • 任何条件,如目录 bloat,当复制插槽的用时过长时可能会发生。

如需更多信息,请参阅有关 复制插槽的 PostgreSQL 文档

注意

熟悉 PostgreSQL write-ahead 日志 的机制和配置有助于使用 Debezium PostgreSQL 连接器。

7.5.2. 为 Debezium 连接器设置 PostgreSQL 权限

将 PostgreSQL 服务器设置为运行 Debezium 连接器需要能够执行复制的数据库用户。复制只能由具有适当权限的数据库用户执行,并且仅对配置的主机执行。

虽然默认情况下,超级用户具有必要的 REPLICATIONLOGIN 角色,如 安全 所述,最好不要为 Debezium 复制用户提供升级的特权。相反,创建一个具有最低所需特权的 Debezium 用户。

先决条件

  • PostgreSQL 管理权限。

流程

  1. 要为用户提供复制权限,请定义一个 至少具有 REPLICATIONLOGIN 权限的 PostgreSQL 角色,然后将该角色授予该用户。例如:

    CREATE ROLE <name> REPLICATION LOGIN;

7.5.3. 设置特权,使 Debezium 能够创建 PostgreSQL 出版物

来自为表创建的 publications 的 PostgreSQL 源表的 Debezium 流改变事件。出版物包含从一个或多个表生成的一组已过滤的更改事件。每个发布中的数据会根据发布规格过滤。规格可由 PostgreSQL 数据库管理员或 Debezium 连接器创建。要允许 Debezium PostgreSQL 连接器创建发布并指定要复制到它们的数据,连接器必须使用数据库中的特定权限进行操作。

有几个选项可用于确定如何创建发布。通常,最好在设置连接器前为您要捕获的表手动创建发布。但是,您可以以允许 Debezium 自动创建发布的方式配置您的环境,并指定添加到它们中的数据。

Debezium 使用 list 和 exclude list 属性来指定在发布中插入数据的方式。有关启用 Debezium 创建发布选项的更多信息,请参阅 publication.autocreate.mode

要使 Debezium 创建 PostgreSQL 发布,它必须以具有以下权限的用户运行:

  • 在数据库中复制特权,将表添加到发布中。
  • 数据库的 CREATE 特权来添加发布。
  • 对表的 SELECT 特权,以复制初始表数据。表所有者自动具有表的 SELECT 权限。

要为发布添加表,用户必须是表的所有者。但是,由于源表已存在,您需要一种与原始所有者共享所有权的机制。要启用共享所有权,您可以创建一个 PostgreSQL 复制组,然后将现有的表所有者和复制用户添加到组中。

流程

  1. 创建复制组。

    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;

要使 Debezium 指定捕获配置,必须将 publication.autocreate.mode 的值设置为 filtered

7.5.4. 配置 PostgreSQL 以允许使用 Debezium 连接器主机复制

要启用 Debezium 复制 PostgreSQL 数据,您必须配置数据库,以允许与运行 PostgreSQL 连接器的主机进行复制。要指定允许使用数据库复制的客户端,请在基于 PostgreSQL 主机的身份验证文件 pg_hba.conf 中添加条目。有关 pg_hba.conf 文件的更多信息,请参阅 PostgreSQL 文档。

流程

  • pg_hba.conf 文件中添加条目,以指定可通过数据库主机复制的 Debezium 连接器主机。例如,

    pg_hba.conf 文件示例:

    local   replication     <youruser>                          trust   1
    host    replication     <youruser>  127.0.0.1/32            trust   2
    host    replication     <youruser>  ::1/128                 trust   3

    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    指示服务器在本地允许 < youruser& gt; 复制,即在服务器机器上进行复制。
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    指示服务器允许 localhost 上的 & lt;youruser > 使用 IPV4 接收复制更改。
    3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    指示服务器允许 localhost 上的 & lt;youruser > 使用 IPV6 接收复制更改。
注意

有关网络掩码的更多信息,请参阅 PostgreSQL 文档

7.5.5. 配置 PostgreSQL 来管理 Debezium WAL 磁盘空间消耗

在某些情况下,WAL 文件消耗的 PostgreSQL 磁盘空间可能会激增或增加通常的比例。这种情况有几个可能的原因:

  • 连接器已接收数据的 LSN 位于服务器的 pg_replication_slots 视图的 confirmed_flush_lsn 列中。比这个 LSN 旧的数据不再可用,数据库负责回收磁盘空间。

    另外,在 pg_replication_slots 视图中,restart_lsn 列包含连接器可能需要的最旧的 WAL 的 LSN。如果定期增加 confirmed_flush_lsn 的值,并且 restart_lsn lags 的值,则数据库需要回收空间。

    数据库通常在批处理块中回收磁盘空间。这是预期的行为,用户不需要操作。

  • 数据库中有多个正在跟踪的更新,但只有少量更新与连接器捕获更改的表和模式相关。这种情况可以通过定期心跳事件轻松解决。设置 heartbeat.interval.ms 连接器配置属性。
  • PostgreSQL 实例包含多个数据库,其中一个是高流量数据库。与其他数据库相比,Debezium 捕获另一个数据库中的更改。然后 Debezium 无法确认 LSN 作为复制插槽可以按数据库工作,并且不会调用 Debezium。由于 WAL 由所有数据库共享,使用的数量往往会增大,直到事件由 Debezium 捕获更改的数据库发出。要解决这个问题,需要:

    • 使用 heartbeat.interval.ms 连接器配置属性启用定期心跳记录生成。
    • 从捕获更改的数据库定期发出更改事件。

    然后,单独的进程会通过插入新行或重复更新同一行来定期更新表。然后,PostgreSQL 调用 Debezium,它会确认最新的 LSN,并允许数据库回收 WAL 空间。此任务可以通过 heartbeat.action.query 连接器配置属性自动执行。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.