作者
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 - 公益是一辈子的事.





