设想
我有一个数据管道正在流式传输到 postgres 集群。我无法控制流数据源,但拥有目的地的完全所有权。我打算让进程轮询数据库以查找自上次运行以来已更改的任何相关数据,并同步其他系统(不同的系统,而不是数据库)。
问题
不幸的是,写入这些记录的管道不提供修改日期的准确时间戳,或者任何可以跟踪自上次轮询进程同步以来记录已更改的随机数。
一些额外的注意事项:
- 记录软删除
- 该管道正在复制数据湖,因此始终存在大量数据和变化
- 轮询同步过程不要错过任何更改,这一点至关重要
我尝试过的
我想出了一些可能解决这个问题的方法,但不确定对于这个用例来说最好的方法是什么。
方法 1date_modified
:向每个目标表添加一列和一个触发器,以便在发生更新时更新时间戳。这看起来轻量且简单。
方法 2:逻辑复制很有吸引力,但似乎没有办法添加任何有帮助的元数据(例如复制的时间)。
方法 3:使用审计表和触发器来捕获和分配事件 ID 是可行的,但性能的权衡令人担忧,而且对于这个特定用例,我看不出使用方法 1有什么区别。
我希望得到的答复
基于上述,答案似乎是简单地使用方法 1。然后,我可以跟踪使用轮询进程同步的最后一个时间戳,并简单地从表中提取具有较晚时间戳的记录。
方法 1 是否有我没有看到的缺点?或者,还有其他更好的途径来实现这一目标吗?
也许我们对 Postgres 逻辑复制在这种情况下的作用有不同的设想。在对 Postgres 数据库进行更改之后,我看到它被用在“流式传输到 Postgres 集群的数据管道”的末端,因为这就是您最终需要的:将数据库中的更改复制到“其他系统” ”。
您可以设置一个逻辑解码器(例如 )
pg_recvlogical
来捕获、预处理并进一步发送更改。例如,前面提到的pg_recvlogical
与类似 的插件一起wal2json
,可以生成连续的 JSON 对象流,这些对象实时表示 Postgres 数据库发生的更改,而不是轮询更改。如果由于某种原因您必须使用轮询,您可以将更改流保存到文件中,并在轮询过程完成后简单地截断该文件。
在任何一种情况下,都不需要将任何额外的元数据注入到变更流中。