无需重新同步,将PostgreSQL逻辑复制从库切换至新主库
PostgreSQL跨数据中心主备切换与全球从库同步问题
当前架构
一个PostgreSQL主库DB1,搭配全球分布式PostgreSQL从库,采用**Logical Replication(逻辑复制)**进行数据同步。主库为读写模式,从库为只读模式,主库通过虚拟化特性实现高可用,但当整个数据中心故障时会出现问题。
Data Center 1 Global Slaves +-----------+ +-----------+ | DB1 | | | | Master DB |--------------------| Slave 1 | | |-----\ | | +-----------+ \ +-----------+ \ \ \ \ +-----------+ \ | | --------| Slave 50 | | | +-----------+
灾备切换计划
因此,我们计划在第二个数据中心新增一台PostgreSQL从库DB2,当数据中心1故障时,将DB2提升为新主库(读写模式),并将全球从库重新配置为同步至该新主库。
Data Center 1 Global Slaves +-----------+ +-----------+ | DB1 | | | | Master DB | /-------| Slave 1 | | DOWN | / | | +-----------+ / +-----------+ | / | / V / +-----------+ / +-----------+ | New |-----/ | | | Master DB |--------------------| Slave 50 | | DB2 | | | +-----------+ +-----------+ Data Center 2
核心疑问
- 我理解无论在数据中心1和2之间采用流式复制还是逻辑复制,全球从库都需要从新主库重新同步,这个理解是否正确?如果不正确,如何实现无需重新同步所有全球从库的数据中心迁移?
- 如果PostgreSQL原生无法实现,使用pgedge或pglogical这类插件是否可行?我考虑过使用Veeam Replication在数据中心间同步,但这可能会在迁移时导致更多数据丢失。
- 当DB1和DB2间采用流式复制且DB2被提升为主库后,若在DB2上用
pg_create_logical_replication_slot()创建新的复制槽,然后修改全球从库订阅连接字符串的host参数,从库能否在正确的位置继续同步?
个人初步分析结论
- 数据中心1和2间采用流式复制:复制槽不会同步至从库。从PG16开始可让全球从库订阅DB2,通过数据中心2中继复制可避免DC1故障问题,但DC2故障时会出现类似问题。将全球从库重新订阅至DB2会触发重新同步,若禁用初始同步则从库会失去同步。
- 数据中心1和2间采用逻辑复制:复制槽同样不会同步至从库,且DB2的LSN(日志序列号)和时间线完全不同,DB1的LSN无法与DB2的关联。
内容的提问来源于stack exchange,提问作者KlausD
相关产品推荐
相关产品推荐

