PostgreSQL码农集散地

为什么failover后逻辑复制会丢数据?

文章开始前推荐2个学习环境: 

1、欢迎使用镜像快速体验PostgreSQL/DuckDB强大功能:《最好的PostgreSQL学习镜像》

2、欢迎使用云起实验室: 《免费体验PolarDB开源数据库》

3、PolarDB开源数据库内核、应用等学习图谱:  https://www.aliyun.com/database/openpolardb/activity 

为什么failover后逻辑复制会丢数据?

https://www.bilibili.com/video/BV1xm4y1D72e/

PG 17以前的社区版本:
逻辑复制需要解析WAL日志的信息, 解析后的内容发送给下游接受逻辑日志的客户端. 通过slot记录解析位置, 这部分信息被存储在pg_logical目录中, 这部分内容的变化不会产生wal, 在standby也无法接收pg_logical的信息, 因此基于wal复制与回放的HA架构一旦发生failover, 从库上没有SLOT的信息, 导致逻辑复制的位点丢失.
HA后 需要重建slot, 什么情况下不会丢失逻辑复制的数据?

  • 通常只能是计划HA才能确保不丢失

    • HA前停止业务操作数据库(写)

    • 等待slot的逻辑复制消费完所有的wal

    • 切换到新的主库

    • 在新的主库上创建slot

    • 允许业务操作数据库(写)

PolarDB:
PolarDB把pg_logical存储在共享存储中, 发生failover不会导致pg_logical丢失, 也不需要重新创建slot, 不影响逻辑复制.

本期问题1:
为什么基于流复制的HA架构, 在发生failover后逻辑复制会丢数据?

  • a. 从库没有slot的信息

  • b. 主从采用了异步复制模式

  • c. 从库的slot位点有延迟

  • d. 逻辑复制为异步模式

答案:

  • a

解释:

  • 逻辑复制需要解析WAL日志的信息, 解析后的内容发送给下游接受逻辑日志的客户端. 通过slot记录解析位置, 这部分信息被存储在pg_logical目录中, 这部分内容的变化不会产生wal, 在standby也无法接收pg_logical的信息, 因此基于wal复制与回放的HA架构一旦发生failover, 从库上没有SLOT的信息, 导致逻辑复制的位点丢失.

本期问题2:
为什么PolarDB在发生failover后逻辑复制不会丢数据?

  • a. 切换时会先同步slot信息到从库

  • b. PolarDB采用wal同步slot信息给从库

  • c. PolarDB的slot信息保存在共享存储内, 发生failover后不会丢失逻辑同步位点

  • d. PolarDB的逻辑同步位点没有使用slot保存, 所以不依赖slot信息的同步

答案:

  • c

解释:

  • PolarDB把pg_logical存储在共享存储中, 发生failover不会导致pg_logical丢失, 也不需要重新创建slot, 不影响逻辑复制.

欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号:

Image

文章中的参考文档请点击阅读原文获得.