Flink PostgreSQL CDC配置和常见问题

部分内容来源:流计算 Oceanus 数据库 PostgreSQL CDC-SQL 开发指南-文档中心-腾讯云

介绍

Postgres 的 CDC 源表(即 Postgres 的流式源表)用于依次读取 PostgreSQL 数据库全量快照数据和变更数据,保证不多读也不少读一条数据。即使发生故障,也能采用 Exactly Once 方式处理。

使用范围

PostgreSQL CDC 只支持作为源表。支持的 PostgreSQL 版本为9.6及以上版本。

PostgreSQL 数据库配置准备

postgresql.conf 配置

# 更改wal发送最大进程数(默认值为10),这个值和上面的solts设置一样
max_wal_senders = 10    # max number of walsender processes
wal_keep_segments = 2   # in logfile segments; 0 disables
# 中断那些停止活动超过指定毫秒数的复制连接,可以适当设置大一点(默认60s)
wal_sender_timeout = 60s    # in milliseconds; 0 disables
#更改solts最大数量(默认值为10),flink-cdc默认一张表占用一个slots
max_replication_slots = 10   # max number of replication slots
#指定为logical
wal_level = logical         # minimal, replica, or logical
# - Archiving -
archive_mode = on
archive_command = 'test ! -f /var/lib/pgsql/11/arch/%f && cp %p /var/lib/pgsql/11/arch/%f'

pg_hba.conf

 添加

# IPv4 local connections:

host    all                 all              0.0.0.0/0               md5

host    replication         all              0.0.0.0/0               md5

FlinkCDC DDL 定义

CREATE TABLE postgres_cdc_source_table (
  id INT,
  name STRING,
  PRIMARY KEY (`id`) NOT ENFORCED -- 如果要同步的数据库表定义了主键, 则这里也需要定义
) WITH (
  'connector' = 'postgres-cdc',             -- 固定值 'postgres-cdc'
  'hostname' = 'yourHostname',              -- 数据库的 IP
  'port' = '5432',                          -- 数据库的访问端口
  'username' = 'yourUserName',              -- 数据库访问的用户名(需要提供 REPLICATION、LOGIN、SCHEMA、DATABASE、SELECT权限)
  'password' = 'yourPassWord',              -- 数据库访问的密码
  'database-name' = 'yourDatabaseName',     -- 需要同步的数据库
  'schema-name' = 'yourSchemaName',         -- 需要同步的数据表所属schema (支持正则表达式)
  'table-name' = 'yourTableName',           -- 需要同步的数据表名 (支持正则表达式)
  'debezium.slot.name' = 'customslotname'   -- 定义一个唯一slot名称,可以包含小写字母、数字和下划线字符
);

WITH 参数

参数 说明 是否必填 备注
connector 源表类型 固定值为 postgres-cdc
hostname Postgres 数据库的 IP 地址或者 Hostname -
username Postgres 数据库服务的用户名 有特定权限(包括 REPLICATION、LOGIN、SCHEMA、DATABASE、SELECT)的 Postgres 用户
password Postgres 数据库服务的密码 -
database-name Postgres 数据库名称 -
schema-name Postgres Schema 名称 Schema 名称支持正则表达式以读取多个 Schema 的数据
table-name Postgres 表名 表名支持正则表达式以读取多个表的数据
port Postgres 数据库服务的端口号 默认值为5432
decoding.plugin.name Postgres Logical Decoding 插件名称 根据 Postgres 服务上安装的插件确定。支持的插件列表如下:
  • decoderbufs(默认值)
  • wal2json
  • wal2json_rds
  • wal2json_streaming
  • wal2json_rds_streaming
  • pgoutput
debezium.* Debezium 属性参数 从更细粒度控制 Debezium 客户端的行为。例如'debezium.slot.name' = 'xxxx',以避免出现 PSQLException: ERROR: replication slot "dl_test" is active for PID 19997 详情请参见 配置属性

类型映射

Postgres CDC 和 Flink 字段类型对应关系如下:

Postgres CDC 字段类型 Flink 字段类型
SMALLINT SMALLINT
INT2
SMALLSERIAL
SERIAL2
INTEGER INT
SERIAL
BIGINT BIGINT
BIGSERIAL
REAL FLOAT
FLOAT4
FLOAT8 DOUBLE
DOUBLE PRECISION
NUMERIC(p, s) DECIMAL(p, s)
DECIMAL(p, s)
BOOLEAN BOOLEAN
DATE DATE
TIME [(p)] [WITHOUT TIMEZONE] TIME [(p)] [WITHOUT TIMEZONE]
TIMESTAMP [(p)] [WITHOUT TIMEZONE] TIMESTAMP [(p)] [WITHOUT TIMEZONE]
CHAR(n) STRING
CHARACTER(n)
VARCHAR(n)
CHARACTER VARYING(n)
TEXT
BYTEA BYTES

代码示例

CREATE TABLE postgres_cdc_source_table (
  id INT,
  name STRING,
  PRIMARY KEY (`id`) NOT ENFORCED -- 如果要同步的数据库表定义了主键, 则这里也需要定义
) WITH (
  'connector' = 'postgres-cdc',             -- 固定值 'postgres-cdc'
  'hostname' = 'yourHostname',              -- 数据库的 IP
  'port' = '5432',                          -- 数据库的访问端口
  'username' = 'yourUserName',              -- 数据库访问的用户名(需要提供 REPLICATION、LOGIN、SCHEMA、DATABASE、SELECT权限)
  'password' = 'yourPassWord',              -- 数据库访问的密码
  'database-name' = 'yourDatabaseName',     -- 需要同步的数据库
  'schema-name' = 'yourSchemaName',         -- 需要同步的数据表所属schema (支持正则表达式)
  'table-name' = 'yourTableName',           -- 需要同步的数据表名 (支持正则表达式)
  'debezium.slot.name' = 'customslotname'   -- 定义一个唯一slot名称,可以包含小写字母、数字和下划线字符
);

CREATE TABLE `print_table` (
  `id` INT,
  `name` STRING
) WITH (
 'connector' = 'print'
);
insert into print_table select * from postgres_cdc_source_table;

来源: 流计算 Oceanus 数据库 PostgreSQL CDC-SQL 开发指南-文档中心-腾讯云

注意事项

用户权限

用来同步的用户至少具有 REPLICATION、LOGIN、SCHEMA、DATABASE、SELECT 权限。

CREATE ROLE debezium_user REPLICATION LOGIN; 
GRANT USAGE ON SCHEMA schema_name TO debezium_user;
GRANT USAGE ON DATABASE schema_name TO debezium_user;
GRANT SELECT ON scheam_name.table_name, scheam_name.table_name TO debezium_user;

postgres CDC 遇到的错误:

1. number of requested standby connections exceeds max_wal_senders (currently 1)。

max_wal_senders 须大于 wal_keep_segments

2.org.postgresql.util.PSQLException: ERROR: could not access file "decoderbufs": No such file or directory。

如果是 table sql 方式,pgoutput是 PostgreSQL 10+ 中的标准逻辑解码输出插件。需要设置一下。添加如下配置

WITH(

       'decoding.plugin.name' = 'pgoutput'

)

3 .io.debezium.DebeziumException: Failed to start replication stream at LSN{0/1100AA50}; when setting up multiple connectors for the same database host, please make sure to use a distinct replication slot name for each.

org.postgresql.util.PSQLException: ERROR: replication slot "flink" is active for PID 26632

同一个数据源存在两个复制槽,因此需要为每个指定不同的名称。

WITH(

       'debezium.slot.name' = '自定义名称'

)

你可能感兴趣的:(大数据,postgresql,flinkcdc,postgresql,cdc)