在 Debezium 数据变更事件中回填 Postgres TOAST 列

主要观点:Postgres 逻辑复制可实时捕获和传播数据变化,但 TOAST 列在特定情况下值可能在数据变化事件中缺失,Debezium 通过内置 reselect 后处理器解决,还可利用 Apache Flink 进行有状态流处理,包括 Flink SQL 和全新的 Flink 2.1 过程表函数(PTFs)。
关键信息

  • TOAST 用于处理大列值,逻辑复制处理 TOAST 列方式受副本标识影响,Debezium 变化事件中会用特殊标记值表示未更改的 TOAST 列。
  • Debezium 的 reselect 后处理器可查询源数据库获取更改字段的当前值,但存在数据竞争和性能影响问题。
  • Apache Flink 的 DataStream API 可通过自定义处理函数管理 TOAST 列值的状态存储,Flink SQL 的 OVER 聚合可实现 TOAST 列回填,但存在一些限制,如无法灵活控制状态保留时间等。
  • Flink 的 PTFs 是新的用户定义函数,更强大且具有多种特性,可用于实现 Postgres TOAST 列回填,其定义和调用方式较为特殊。
    重要细节
  • Debezium 连接器配置中添加后处理器可实现列重选,如"reselector.type": "io.debezium.processors.reselect.ReselectColumnsPostProcessor"等。
  • Flink 的 DataStream API 中自定义处理函数ToastBackfillFunction通过KeyedProcessFunction管理状态存储,根据不同操作更新状态。
  • Flink SQL 的 OVER 聚合通过LAST_VALUE()函数和CASE语句处理 TOAST 列回填,需注意合适的回溯期。
  • Flink 的 PTFs 需创建子类ProcessTableFunction并实现eval()方法来管理状态和处理数据,可通过反射或注解指定参数语义,其输出类型可动态确定。
  • 总结了各种方法的优缺点,如 Debezium 后处理器简单但有问题,Flink 多种方式各有特点,PTFs 平衡较好等,还提出 Debezium 可进一步提供可靠解决方案并记录相关问题。
阅读 12
0 条评论