Skip to content

Commit cfec4e0

Browse files
digoal zhoudigoal zhou
authored andcommitted
new doc
1 parent 307bb3d commit cfec4e0

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

202112/20211230_03.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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+
![digoal's wechat](../pic/digoal_weixin.jpg "f7ad92eeba24523fd47a6e1a0e691b59")
73+

202112/readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
### 文章列表
44
----
5+
##### 20211230_03.md [《一起学PolarDB - 第6期 - 为什么failover后逻辑复制会丢数据?》](20211230_03.md)
56
##### 20211230_02.md [《一起学PolarDB - 第5期 - 为什么PG有Double Cache?》](20211230_02.md)
67
##### 20211230_01.md [《一起学PolarDB - 第4期 - 为什么增加RO节点动则数小时?》](20211230_01.md)
78
##### 20211229_02.md [《一起学PolarDB - 第3期 - 为什么不能无限增加只读实例?》](20211229_02.md)

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ digoal's|PostgreSQL|文章|归类
8787

8888
### 所有文档如下
8989
----
90+
##### 202112/20211230_03.md [《一起学PolarDB - 第6期 - 为什么failover后逻辑复制会丢数据?》](202112/20211230_03.md)
9091
##### 202112/20211230_02.md [《一起学PolarDB - 第5期 - 为什么PG有Double Cache?》](202112/20211230_02.md)
9192
##### 202112/20211230_01.md [《一起学PolarDB - 第4期 - 为什么增加RO节点动则数小时?》](202112/20211230_01.md)
9293
##### 202112/20211229_02.md [《一起学PolarDB - 第3期 - 为什么不能无限增加只读实例?》](202112/20211229_02.md)

0 commit comments

Comments
 (0)