|
| 1 | +## 一起学PolarDB - 第6期 - 为什么failover后逻辑复制会丢数据? |
| 2 | + |
| 3 | +### 作者 |
| 4 | +digoal |
| 5 | + |
| 6 | +### 日期 |
| 7 | +2021-12-30 |
| 8 | + |
| 9 | +### 标签 |
| 10 | +PostgreSQL , PolarDB |
| 11 | + |
| 12 | +---- |
| 13 | + |
| 14 | +## 背景 |
| 15 | +懂PostgreSQL, 学PolarDB不难, 就好像有九阳神功护体, 可以快速融会贯通. |
| 16 | +对于DBA只要学会PolarDB精髓即可. |
| 17 | +对于开发者来说不需要学习, 使用PolarDB和PostgreSQL一样. |
| 18 | + |
| 19 | +#### 为什么failover后逻辑复制会丢数据? |
| 20 | +社区版本: |
| 21 | +逻辑复制需要解析WAL日志的信息, 解析后的内容发送给下游接受逻辑日志的客户端. 通过slot记录解析位置, 这部分信息被存储在pg_logical目录中, 这部分内容的变化不会产生wal, 在standby也无法接收pg_logical的信息, 因此基于wal复制与回放的HA架构一旦发生failover, 从库上没有SLOT的信息, 导致逻辑复制的位点丢失. |
| 22 | +HA后 需要重建slot, 什么情况下不会丢失逻辑复制的数据? |
| 23 | +- 通常只能是计划HA才能确保不丢失 |
| 24 | + - HA前停止业务操作数据库(写) |
| 25 | + - 等待slot的逻辑复制消费完所有的wal |
| 26 | + - 切换到新的主库 |
| 27 | + - 在新的主库上创建slot |
| 28 | + - 允许业务操作数据库(写) |
| 29 | + |
| 30 | +PolarDB: |
| 31 | +PolarDB把pg_logical存储在共享存储中, 发生failover不会导致pg_logical丢失, 也不需要重新创建slot, 不影响逻辑复制. |
| 32 | + |
| 33 | +本期问题1: |
| 34 | +为什么基于流复制的HA架构, 在发生failover后逻辑复制会丢数据? |
| 35 | +- a. 从库没有slot的信息 |
| 36 | +- b. 主从采用了异步复制模式 |
| 37 | +- c. 从库的slot位点有延迟 |
| 38 | +- d. 逻辑复制为异步模式 |
| 39 | + |
| 40 | +答案: |
| 41 | +- a |
| 42 | + |
| 43 | +解释: |
| 44 | +- 逻辑复制需要解析WAL日志的信息, 解析后的内容发送给下游接受逻辑日志的客户端. 通过slot记录解析位置, 这部分信息被存储在pg_logical目录中, 这部分内容的变化不会产生wal, 在standby也无法接收pg_logical的信息, 因此基于wal复制与回放的HA架构一旦发生failover, 从库上没有SLOT的信息, 导致逻辑复制的位点丢失. |
| 45 | + |
| 46 | +本期问题2: |
| 47 | +为什么PolarDB在发生failover后逻辑复制不会丢数据? |
| 48 | +- a. 切换时会先同步slot信息到从库 |
| 49 | +- b. PolarDB采用wal同步slot信息给从库 |
| 50 | +- c. PolarDB的slot信息保存在共享存储内, 发生failover后不会丢失逻辑同步位点 |
| 51 | +- d. PolarDB的逻辑同步位点没有使用slot保存, 所以不依赖slot信息的同步 |
| 52 | + |
| 53 | +答案: |
| 54 | +- c |
| 55 | + |
| 56 | +解释: |
| 57 | +- PolarDB把pg_logical存储在共享存储中, 发生failover不会导致pg_logical丢失, 也不需要重新创建slot, 不影响逻辑复制. |
| 58 | + |
| 59 | + |
| 60 | +#### [期望 PostgreSQL 增加什么功能?](https://github.com/digoal/blog/issues/76 "269ac3d1c492e938c0191101c7238216") |
| 61 | + |
| 62 | + |
| 63 | +#### [PolarDB for PostgreSQL云原生分布式开源数据库](https://github.com/ApsaraDB/PolarDB-for-PostgreSQL "57258f76c37864c6e6d23383d05714ea") |
| 64 | + |
| 65 | + |
| 66 | +#### [PostgreSQL 解决方案集合](https://yq.aliyun.com/topic/118 "40cff096e9ed7122c512b35d8561d9c8") |
| 67 | + |
| 68 | + |
| 69 | +#### [德哥 / digoal's github - 公益是一辈子的事.](https://github.com/digoal/blog/blob/master/README.md "22709685feb7cab07d30f30387f0a9ae") |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | + |
0 commit comments