背景与原理
Debezium 是一个开源的 CDC(Change Data Capture)平台,能够以低延迟的方式捕获数据库变更。它通过监控数据库事务日志,将行级别的更改转换为流式事件。对于应用而言,这意味着可以消费每一个已提交的变更,而无需担心事务回滚或复杂的数据库差异。由于采用持久化日志记录历史,服务重启后也能保证不丢失事件。
PostgreSQL 作为成熟的开源关系型数据库,在事务安全性和一致性方面表现优异,支持多种高级数据类型和存储过程。其强大的扩展性使其成为 CDC 场景的理想选择。
环境准备与配置
我们使用 Docker 快速搭建测试环境。首先拉取 PostgreSQL 10.6 镜像:
docker pull postgres:10.6
启动容器时,需将端口 5432 映射到主机 30028,并加载 pgoutput 插件以支持逻辑复制:
docker run -d -p 30028:5432 --name postgres-10.6 -e POSTGRES_PASSWORD=postgres postgres:10.6 -c 'shared_preload_libraries=pgoutput'
进入容器编辑 postgresql.conf 文件,关键配置如下:
# 开启逻辑复制模式
wal_level = logical
# 增加最大复制槽数量,避免 Flink-CDC 等工具占用过多资源
max_replication_slots = 20
# 增加 WAL 发送进程数
max_wal_senders = 20
# 设置复制连接超时时间,防止误断
wal_sender_timeout = 180s
修改后重启容器,执行 SHOW wal_level 确认返回值为 logical。
接下来创建业务库和用户。我们需要一个具备复制权限的用户来订阅变更:
CREATE DATABASE test_db;
\c test_db
CREATE TABLE "public"."t_user" (
"id" int8 NOT NULL,
"name" varchar(255),
"age" int2,
PRIMARY KEY ("id")
);
CREATE USER test1 WITH PASSWORD 'test123';
ALTER ROLE test1 replication;
GRANT CONNECT ON DATABASE test_db TO test1;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO test1;
为了让 Debezium 能捕获更新和删除操作,必须设置表的复制标识为 FULL:
CREATE PUBLICATION dbz_publication FOR TABLES;
t_user REPLICA ;

