Debezium为Postgress和WAL刷新



我在一个容器中有Debezium,用于捕获PostgeSQL数据库记录的所有更改。但我无法理解Debezium是如何工作的。如果Debezium是第一次启动,它会获取数据库的快照,然后根据Debezium文档基于WAL文件启动流。:

PostgreSQL通常会在一段时间后清除写前日志(WAL(段。这意味着连接器没有对数据库进行的所有更改的完整历史记录。因此,当PostgreSQL连接器第一次连接到特定的PostgreSQL数据库时,它首先对每个数据库模式执行一致的快照。连接器完成快照后,将从创建快照的确切点开始继续流式传输更改。这样,连接器从所有数据的一致视图开始,并且不会省略在拍摄快照时所做的任何更改。连接器可以容忍故障。当连接器读取更改并产生事件时,它会记录每个事件的WAL位置如果连接器因任何原因(包括通信故障、网络问题或崩溃(而停止,则在重新启动时,连接器将继续读取上次停止的WAL。这包括快照。如果连接器在快照期间停止,则连接器将在重新启动时开始新的快照

但这里有差距,也许没有。当数据库的快照完成,然后它从WAL文件流式传输时,如果连接器断开,直到它断开,WAL才会被清除/刷新,Debezium如何确保数据完整性?

由于Debezium在PG上使用复制插槽,因此Debezium不断向PG发送其消耗的LSN的信息,以便PG可以刷新WAL文件。现在,该信息被存储在表pg_replication_slots中。当Debezium再次启动时,它从该表中读取restart_lsn,并请求在该值之前发生的更改。这就是Debezium确保数据完整性的方式。这并不是说,如果由于某种原因,该LSN在WAL文件中不可用,就无法将其取回,这意味着数据丢失已经发生。

最新更新