Postgresql中的restart_lsn和confirmed_flush_lsn有什么区别?

10
根据文档restart_lsn是:

此插槽的使用者可能仍需要的最旧WAL的地址(LSN),因此在检查点期间不会自动删除该地址,除非该LSN比当前LSN大max_slot_wal_keep_size。如果此插槽的LSN从未被保留,则为NULL。

confirmed_flush_lsn是:

逻辑插槽的使用者已确认接收数据的地址(LSN)。早于此数据不再可用。物理插槽的值为NULL。

对我来说不清楚(针对逻辑插槽)的是这两个属性如何相互关联?confirmed_flush_lsn的描述表明旧日志已被删除,但restart_lsn似乎并非完全正确。如果在restart_lsnconfirmed_flush_lsn之间存在一些事务日志,则该数字可以是多少?它是某些预定义的、不可变的值,比如几MB,还是真正可以增加到max_slot_wal_keep_size?如何决定“使用者可能仍需要的WAL”和“不需要”的是什么?

请参阅max_slot_wal_keep_size。据我所读,restart_lsnmax_slot_wal_keep_size作为安全阀起作用。如果WAL的消费者落后太多,WAL开始堆积,那么一些WAL将根据这些值的组合开始被修剪。 - Adrian Klaver
1个回答

11

confirmed_flush_lsn 是逻辑解码器已经接收到解码数据的 WAL 中最新位置,因此逻辑解码器不会发射任何早于该位置的数据。

然而,逻辑解码仍然可能需要比那更久远的 WAL 来计算所需信息,即开始于 confirmed_flush_lsn 之前的事务的 WAL。因此有 restart_lsn,它标记了服务器必须保留哪个点的 WAL 才能继续解码。


如果消费者不断从插槽中读取数据,那么(confirmed_flush_lsn - restart_lsn)的值会保持相同还是会随着已经读取的日志数量而增加? - Egor
它会上升,但随着“restart_lsn”的推进,它将再次缩小。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接