在了解逻辑复制过程的同时,我仍然不清楚一件事。
解码过程何时开始?
我的理解是,可以说我有一个出版物和一个广告位。但是没有订阅者。在这种情况下,插槽将只维护同步所需的 wal 信息,但实际的 wal 数据在订阅者启动之前不会被解码。
一旦订阅者被激活,槽就会知道来自哪个墙 lsn,然后实际的解码处理就会开始。
表述有误请指正。
在了解逻辑复制过程的同时,我仍然不清楚一件事。
解码过程何时开始?
我的理解是,可以说我有一个出版物和一个广告位。但是没有订阅者。在这种情况下,插槽将只维护同步所需的 wal 信息,但实际的 wal 数据在订阅者启动之前不会被解码。
一旦订阅者被激活,槽就会知道来自哪个墙 lsn,然后实际的解码处理就会开始。
表述有误请指正。
我已经用一个小的设置对其进行了分析。解码过程将在消费者连接并且状态处于活动状态后开始。
为了重现这一点,我只是禁用了订阅并开始插入一些随机的批量数据。然后在几分钟后启用订阅。
开启订阅后可以看到CPU消耗和IOPS消耗。
在逻辑解码中,一个复制槽决定了逻辑解码插件、一个重启日志序列号(LSN)和解码所需的最小事务ID。这些对应于列
plugin
、restart_lsn
、xmin
和catalog_xmin
inpg_replication_slots
。复制槽本身什么也不做,除了这些数据之外什么也不存储。它是一个标记,告诉 PostgreSQL 不要丢弃任何比 the 更新的 WAL 并且不要删除比and
restart_lsn
更新的VACUUM
任何数据。xmin
catalog_xmin
解码仅在建立复制连接并且备用服务器发送复制命令时发生。
START_REPLICATION SLOT slot_name LOGICAL
所以是的,你是对的。虽然在物理流复制中由备用数据库决定从何处进行复制,但在逻辑复制的情况下,起点由复制槽确定。