主要观点:作者在过去几年帮助众多用户和组织为 Postgres 数据库构建变更数据捕获(CDC)管道,重点关注设置和管理复制槽,介绍了最佳实践以防止相关问题,包括使用pgoutput
逻辑解码输出插件、定义最大复制槽大小、启用心跳、使用表级发布、使用列和行过滤器、启用故障转移槽、考虑使用副本标识 FULL 以及监控等方面。
关键信息:
pgoutput
插件:可用作 Postgres 10+的标准解码插件,使用高效二进制格式,可细粒度控制复制表等,手动创建槽可调用pg_create_logical_replication_slot()
函数。- 最大复制槽大小:Postgres 13 起可限制复制槽保留的最大 WAL 大小,超过限制数据库会使槽无效并丢弃旧 WAL 段。
- 启用心跳:在多逻辑数据库且流量模式不同的情况下,可通过
pg_logical_emit_message()
函数在低流量数据库中产生“假”流量以推进复制槽,Debezium 中需设置相关配置并授予执行权限。 - 使用表级发布:
pgoutput
插件可通过发布定义要发布的更改类型,Debezium 可自动创建或根据配置创建表级发布,应遵循最小权限原则创建发布。 - 使用列和行过滤器:Postgres 15 起可通过列列表和行过滤器进一步精简复制流内容,Debezium 中需确保连接器的列列表与发布的列列表匹配,快照时也应使用相同的过滤器表达式。
- 启用故障转移槽:Postgres 16 起可在副本上创建复制槽,17 年起支持故障转移槽,需在主从服务器进行相应配置,通过代理可使复制消费者在故障转移后继续处理事件。
- 考虑使用副本标识 FULL:将表的副本标识从
DEFAULT
改为FULL
可使完整的行图像写入 WAL,便于处理变更事件,但需考虑对磁盘利用率和 CPU 消耗的影响。 - 监控:通过 Prometheus 和 Grafana 等工具监控复制槽的相关指标,如总 WAL 大小、每个槽保留的 WAL 大小等,还可监控 Debezium 的
MilliSecondsBehindSource
指标,根据具体情况设置警报阈值。 - 删除未使用的复制槽:停止和删除 Debezium 连接器时,其在 Postgres 中的复制槽不会自动删除,Postgres 18 起
idle_replication_slot_timeout
选项可使空闲槽在一段时间后失效。
重要细节:
- 创建表级发布示例:
CREATE PUBLICATION mypublication FOR TABLE customers, purchase_orders;
,可指定特定模式的表CREATE PUBLICATION mypublication FOR TABLES IN SCHEMA inventory;
。 - 故障转移槽配置细节:主服务器创建槽时传递
failover=true
,设置synchronized_standby_slots
,从服务器设置sync_replication_slots
、添加槽的数据库名到连接字符串、设置hot_standby_feedback
。 - 监控指标获取方式:总 WAL 大小可通过
pg_ls_waldir()
函数求和得到,槽相关指标可从pg_replication_slots
视图获取,磁盘剩余空间需从操作系统等获取,Postgres 14 起可通过pg_stat_replication_slots
视图查看磁盘溢出情况。 - 处理复制滞后问题:若活动复制消费者跟不上源数据库的变化,可使用多个复制槽,通过
pg_copy_logical_replication_slot()
复制槽,让第二个连接器从相同 LSN 继续处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。