PostgreSQL Failover slot - 支持将slot信息发送给物理备库

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

标签

PostgreSQL , slot , 备库 , failover


背景

PostgreSQL主库创建的slot(物理或逻辑的都算),在备库是否存在?

目前的版本,PG在主库创建的SLOT,备库是没有的(不会通过流复制协议复制到备库)

(但是,2ND提出的failover slot,就是来解决这个问题的,在主库创建的slot,会通过流复制协议,发送给物理备库。)

测试

主库

1、创建slot

postgres=# select pg_create_physical_replication_slot('a');  
 pg_create_physical_replication_slot   
-------------------------------------  
 (a,)  
(1 row)  

2、查看SLOT信息

postgres=# select * from pg_replication_slots;  
 slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn   
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------  
 a         |        | physical  |        |          | f         | f      |            |      |              |             |   
(1 row)  

3、查看slot在PGDATA中的信息

cd $PGDATA  
  
cd pg_replslot/  
ll  
total 4.0K  
drwx------ 2 postgres postgres 4.0K May 16 10:46 a  

备库

备库,pg_replslot这个目录是空的。

postgres=# select * from pg_replication_slots;  
 slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn   
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------  
(0 rows)  

主库创建了SLOT后,如果将备库recovery.conf配置如下

primary_slot_name = 'a'  

到主库查看,可以看到,slot激活,并开始记录restart_lsn

postgres=# select * from pg_replication_slots;  
 slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn  | confirmed_flush_lsn   
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+--------------+---------------------  
 a         |        | physical  |        |          | f         | t      |       3670 |      |              | 118/EC000060 |   
(1 row)  

为什么主库的slot信息没有同步给备库呢?

1、首先,目前slot的信息没有记录WAL,不会传递给备库。

2、另一方面,备库也可以创建slot,备库创建的SLOT与主库创建的SLOT毫无关系,自己记录自己的restart_lsn。

postgres=# select pg_create_physical_replication_slot('a');  
 pg_create_physical_replication_slot   
-------------------------------------  
 (a,)  
(1 row)  
  
postgres=# select * from pg_replication_slots;  
 slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn   
-----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------  
 a         |        | physical  |        |          | f         | f      |            |      |              |             |   
(1 row)  

slot信息的主备同步有什么应用场景呢?

1、HA后,使用slot的应用,不受影响。

例如,逻辑订阅、使用slot的逻辑备库

2nd提出了一个概念slot failover。

Failover slots

当使用pg_create_logical_replication_slot创建slot时,如果指定failover参数为true,则表示创建的是failover slot,那么这个slot的信息会同步给备库。同时备库上也可以看到这个slot的信息。

对于主库的逻辑订阅者,当上游发生了HA时,逻辑订阅者可以连到新的主库,并继续接收变更,不会导致逻辑订阅的中断。

Failover slots address these issues by synchronizing slot creation, deletion and position updates to replica servers. This is done through the WAL stream like everything else. If a slot is created as a failover slot using the new failover boolean option to pg_create_logical_replication_slot then its creation is logged in WAL. So are subsequent position updates when the client tells the server it can free no-longer-needed resources.

If the master fails and a standby is promoted, logical decoding clients can just reconnect to the standby and carry on as if nothing had happened. If a DNS update or IP swap is done along with the promotion the logical decoding client might not even notice it’s anything more than a master restart.

2nd的设计中,physical和logical 都可以创建failover slot,

A physical failover slot can be created, just like a logical failover slot.

physical slot

https://www.postgresql.org/docs/devel/static/warm-standby.html#STREAMING-REPLICATION-SLOTS-MANIPULATION

1、防止WAL被删,SLOT restart_lsn之后的WAL文件都不会删除。(wal_keep_segments则是一个人为设定的边界,slot是自动设定的边界(无上限),所以使用slot并且下游断开后,可能导致数据库的WAL堆积爆满)

2、防止备库出现recovery conflict,当备库配置了primary_slot_name,那么主库会保留备库需要查询的数据版本(注意,这样可能引起主库膨胀,vacuum worker频繁的扫描table,CPU升高,原理如下:)。

《PostgreSQL物理"备库"的哪些操作或配置,可能影响"主库"的性能、垃圾回收、IO波动》

logical slot

用于逻辑订阅

注意

2nd的failover slot设计中,仅仅适用于物理流复制的主备节点。逻辑复制的主备节点,不支持failover slot。

意思是说主库创建的failover slot,这个slot的信息可以复制到物理备库,但是不会复制到它的逻辑备库。

Failover slots do not aid logical replication solutions in supporting failover to a logical replica. They exist to allow logical replication to follow a physical failover.

Supporting failover to a logical replica is a completely unrelated matter. There are a number of limitations in PostgreSQL core that are relevant to it, like the currently missing support for logical decoding of sequence position advances. Failover slots will neither help nor hinder there. What they do is provide a way to integrate logical replication into HA solutions now, into existing mature and established infrastructure patterns.

小结

1、目前的PG版本(包括PG 11),暂时不支持failover slot,也就是说slot在主库,备库是独立的。当主备发送HA,使用slot的应用,无法漂移到新的主库。

2、2nd提出了failover slot的概念,将来物理备库可以接收上游主库创建的failover slot的信息,实现SLOT在物理主备之间的漂移 。

参考

https://www.postgresql.org/docs/devel/static/functions-admin.html

https://wiki.postgresql.org/wiki/Failover_slots

https://blog.2ndquadrant.com/failover-slots-postgresql/

《PostgreSQL 10.0 preview 功能增强 - 备库支持逻辑订阅,订阅支持主备漂移了》

《PostgreSQL物理"备库"的哪些操作或配置,可能影响"主库"的性能、垃圾回收、IO波动》

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
监控 数据可视化 关系型数据库
PostgreSQL主备库搭建
pg主备库的搭建,首先需在2个节点安装pg软件,然后依次在2个节点配置主备。 本文采用os为CentOS7.6,pg版本使用14.2,以下为详细部署步骤。
844 0
|
5月前
|
消息中间件 Java 关系型数据库
实时计算 Flink版操作报错合集之从 PostgreSQL 读取数据并写入 Kafka 时,遇到 "initial slot snapshot too large" 的错误,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
1013 0
|
4月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之如何查看PolarDB for PostgreSQL的备份信息
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
存储 关系型数据库 PostgreSQL
PostgreSQL TID及tuple slot
PostgreSQL TID及tuple slot
223 0
PostgreSQL TID及tuple slot
|
6月前
|
关系型数据库 数据库 PostgreSQL
PostgreSQL【应用 01】使用Vector插件实现向量相似度查询(Docker部署的PostgreSQL安装pgvector插件说明)和Milvus向量库对比
PostgreSQL【应用 01】使用Vector插件实现向量相似度查询(Docker部署的PostgreSQL安装pgvector插件说明)和Milvus向量库对比
583 1
|
6月前
|
存储 SQL 关系型数据库
postgresql从入门到精通 - 第37讲:postgres物理备份和恢复概述
postgresql从入门到精通 - 第37讲:postgres物理备份和恢复概述
204 1
|
6月前
|
SQL 关系型数据库 PostgreSQL
PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比
PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比
165 0
|
SQL 关系型数据库 Java
PostgreSQL统计信息的几个重要视图
PostgreSQL统计信息的几个重要视图
285 1
|
SQL 关系型数据库 数据库连接
PG技术大讲堂 - Part 3:PostgreSQL建库与使用
PG技术大讲堂 - Part 3:PostgreSQL建库与使用
227 1
|
存储 SQL Oracle
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
AnalyticDB PostgreSQL 7.0 新增了存储过程功能的支持,让用户在使用ADB PG时能够更方便高效地开发业务,并能够更好地兼容Oracle等传统数仓的业务。
495 1
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 下一篇
    无影云桌面