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 连接器需要能够执行复制的数据库用户。复制只能由具有适当权限的数据库用户执行,并且仅对配置的主机执行。
虽然默认情况下,超级用户具有必要的 REPLICATION
和 LOGIN
角色,如 安全 所述,最好不要为 Debezium 复制用户提供升级的特权。相反,创建一个具有最低所需特权的 Debezium 用户。
先决条件
- PostgreSQL 管理权限。
流程
要为用户提供复制权限,请定义一个 至少具有
REPLICATION
和LOGIN
权限的 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 复制组,然后将现有的表所有者和复制用户添加到组中。
流程
创建复制组。
CREATE ROLE <replication_group>;
将表的原始所有者添加到组中。
GRANT REPLICATION_GROUP TO <original_owner>;
将 Debezium 复制用户添加到组中。
GRANT REPLICATION_GROUP TO <replication_user>;
将表的所有权传送到 <
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
上的 <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
上的 <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
连接器配置属性自动执行。-
使用