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
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;
CREATE ROLE <name> REPLICATION LOGIN;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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>;
CREATE ROLE <replication_group>;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将表的原始所有者添加到组中。
GRANT REPLICATION_GROUP TO <original_owner>;
GRANT REPLICATION_GROUP TO <original_owner>;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 Debezium 复制用户添加到组中。
GRANT REPLICATION_GROUP TO <replication_user>;
GRANT REPLICATION_GROUP TO <replication_user>;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将表的所有权传送到 <
replication_group>。ALTER TABLE <table_name> OWNER TO REPLICATION_GROUP;
ALTER TABLE <table_name> OWNER TO REPLICATION_GROUP;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要使 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 host replication <youruser> 127.0.0.1/32 trust host replication <youruser> ::1/128 trust
local replication <youruser> trust1 host replication <youruser> 127.0.0.1/32 trust2 host replication <youruser> ::1/128 trust3 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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> 复制,即在服务器机器上进行复制。 - 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_lsnlags 的值,则数据库需要回收空间。数据库通常在批处理块中回收磁盘空间。这是预期的行为,用户不需要操作。
-
数据库中有多个正在跟踪的更新,但只有少量更新与连接器捕获更改的表和模式相关。这种情况可以通过定期心跳事件轻松解决。设置
heartbeat.interval.ms连接器配置属性。 PostgreSQL 实例包含多个数据库,其中一个是高流量数据库。与其他数据库相比,Debezium 捕获另一个数据库中的更改。然后 Debezium 无法确认 LSN 作为复制插槽可以按数据库工作,并且不会调用 Debezium。由于 WAL 由所有数据库共享,使用的数量往往会增大,直到事件由 Debezium 捕获更改的数据库发出。要解决这个问题,需要:
-
使用
heartbeat.interval.ms连接器配置属性启用定期心跳记录生成。 - 从捕获更改的数据库定期发出更改事件。
然后,单独的进程会通过插入新行或重复更新同一行来定期更新表。然后,PostgreSQL 调用 Debezium,它会确认最新的 LSN,并允许数据库回收 WAL 空间。此任务可以通过
heartbeat.action.query连接器配置属性自动执行。-
使用