掌握 Postgres 复制槽:防止 WAL 膨胀和其他生产问题

主要观点:作者在过去几年帮助众多用户和组织为 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 继续处理。
阅读 20
0 条评论