暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一起学PolarDB - 第6期 - 为什么failover后逻辑复制会丢数据?

原创 digoal 2022-01-20
336

作者

digoal

日期

2021-12-30

标签

PostgreSQL , PolarDB


懂PostgreSQL, 学PolarDB不难, 就好像有九阳神功护体, 可以快速融会贯通.
对于DBA只要学会PolarDB精髓即可.
对于开发者来说不需要学习, 使用PolarDB和PostgreSQL一样.

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

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

社区版本:
逻辑复制需要解析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, 不影响逻辑复制.

期望 PostgreSQL 增加什么功能?

PolarDB for PostgreSQL云原生分布式开源数据库

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论