PostgreSQL 双节点流复制如何同时保证可用性、可靠性(rpo,rto) - (半同步,自动降级方法实践)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 标签 PostgreSQL , 同步 , 半同步 , 流复制 背景 两节点HA架构,如何做到跨机房RPO=0(可靠性维度)?同时RTO可控(可用性维度)? 半同步是一个不错的选择。 1、当只挂掉一个节点时,可以保证RPO=0。如下: 主 -> 从(挂) 主(挂) -> 从 2、当一个节点挂掉后,在另一个节点恢复并开启同步模式前,如果在此期间(

标签

PostgreSQL , 同步 , 半同步 , 流复制


背景

两节点HA架构,如何做到跨机房RPO=0(可靠性维度)?同时RTO可控(可用性维度)?

半同步是一个不错的选择。

1、当只挂掉一个节点时,可以保证RPO=0。如下:

主 -> 从(挂)    
  
主(挂) -> 从  

2、当一个节点挂掉后,在另一个节点恢复并开启同步模式前,如果在此期间(当前)主节点也挂掉,(虽然此时从库活了(但由于还未开启同步模式)),则RPO>0。 如下:

主(挂) -> 从(OPEN,但是之前从挂过,并且还还未转换为同步模式)  
  
与两个节点同时挂掉一样,RPO>0   

3、如何保证RTO时间可控?

我们知道,在同步模式下,事务提交时需要等待sync STANDBY的WAL复制反馈,确保事务wal落多个副本再反馈客户端(从动作上来说,先持久化主,然后同步给sync从,并等待sync从的WAL 同步位点的反馈),当STANDBY挂掉时,等待是无限期的,所以两节点的同步复制,无法兼顾可用性(RTO)。那么怎么兼顾可用性呢?

可以对(pg_stat_activity)等待事件的状态进行监测,如果发现同步事务等待超过一定阈值(RTO阈值),则降级为异步模式。

降级不需要重启数据库。

3.1 改配置

3.2 reload (对已有连接和新建连接都会立即生效)。

3.3 cancel 等待信号(针对当前处于等待中的进程)。

4、降级后,什么情况下恢复为同步模式?(升级)

同样可以对(pg_stat_replication)状态进行监测,当sync standby处于streaming状态时,则可以转换为同步模式。

升级不需要重启数据库。

4.1 改配置

4.2 reload。立即生效 (对已有连接和新建连接都会立即生效)。

涉及技术点

1、事务提交参数

synchronous_commit    
    
on, remote_apply, remote_write, local    

2、同步配置参数

synchronous_standby_names     
    
[FIRST] num_sync ( standby_name [, ...] )    
ANY num_sync ( standby_name [, ...] )    
standby_name [, ...]    
    
    
ANY 3 (s1, s2, s3, s4)    
    
FIRST 3 (s1, s2, s3, s4)    
    
*  表示所有节点    

3、活跃会话,查看事务提交时,等待事件状态

pg_stat_activity    

等待事件

https://www.postgresql.org/docs/11/monitoring-stats.html#MONITORING-STATS-VIEWS

wait_event='SyncRep'  

4、流状态,pg_stat_replication

 sync_state='sync'  
state     
    text      
    Current WAL sender state. Possible values are:    
    
startup: This WAL sender is starting up.    
    
catchup: This WAL sender's connected standby is catching up with the primary.    
    
streaming: This WAL sender is streaming changes after its connected standby server has caught up with the primary.    
    
backup: This WAL sender is sending a backup.    
    
stopping: This WAL sender is stopping.    

实践

环境

1、主

postgresql.conf    
    
synchronous_commit = remote_write    
wal_level = replica    
max_wal_senders = 8    
synchronous_standby_names = '*'    

2、从

recovery.conf    
    
restore_command = 'cp /data01/digoal/wal/%f %p'    
primary_conninfo = 'host=localhost port=8001 user=postgres'     

同步降级、升级 - 实践

关闭standby,模拟备库异常。看如何实现半同步。

模拟STANDBY恢复,看如何模拟升级为同步模式。

1、监测 pg_stat_activity,如果发现事务提交等待超过一定阈值(RTO保障),降级

select max(now()-query_start) from pg_stat_activity where wait_event='SyncRep';     

2、查看以上结果等待时间(RTO保障)

当大于某个阈值时,开始降级。

注意NULL保护,NULL表示没有事务处于 SyncRep 等待状态。

3、降级步骤1,修改synchronous_commit参数。改成WAL本地持久化(异步流复制)。

alter system set synchronous_commit=local;    

4、降级步骤2,生效参数,RELOAD

select pg_reload_conf();    

5、降级步骤3,清空当前等待队列(处于SyncRep等待状态的进程在收到CANCEL信号后,从队列清空,并提示客户端,当前事务本地WAL已持久化,事务正常结束。)

select pg_cancel_backend(pid) from pg_stat_activity where wait_event='SyncRep';    

6、收到清空信号的客户端返回正常(客户端可以看到事务正常提交)

postgres=# end;    
WARNING:  01000: canceling wait for synchronous replication due to user request    
DETAIL:  The transaction has already committed locally, but might not have been replicated to the standby.    
LOCATION:  SyncRepWaitForLSN, syncrep.c:264    
    
COMMIT    

事务的redo信息已在本地WAL持久化,提交状态正常。

当前会话后续的请求会变成异步流复制模式(WAL本地持久化模式(synchronous_commit=local))。

如何升级?:

7、升级步骤1,监测standby状态,sync_state='sync'状态的standby进入streaming状态后,表示该standby与primary的wal已完全同步。

select * from pg_stat_replication where sync_state='sync' and state='streaming';    

有结果返回,表示standby已经接收完primary的wal,可以进入同步模式。

8、升级步骤2,将事务提交模式改回同步模式( synchronous_commit=remote_write ,事务提交时,等sync standby接收到wal,并write。)

alter system set synchronous_commit=remote_write;    

9、升级步骤3,生效参数,RELOAD (所有会话重置synchronous_commit=remote_write,包括已有连接,新建的连接)

select pg_reload_conf();    

小结

1、在不修改PG内核的情况下,通过外部辅助监测和操纵(例如5秒监控间隔)),实现了两节点的半同步模式,在双节点或单节点正常的情况下,保证RPO=0,同时RTO可控(例如最长wait_event='SyncRep'等待时间超过10秒)。

2、内核修改建议,

降级:可以在等待队列中加HOOK,wait_event='SyncRep'等待超时后降级为异步。

升级:在wal_sender代码中加hook,监测到standby恢复后,改回同步模式。

参考

《PostgreSQL 一主多从(多副本,强同步)简明手册 - 配置、压测、监控、切换、防脑裂、修复、0丢失 - 珍藏级》

https://www.postgresql.org/docs/11/monitoring-stats.html#MONITORING-STATS-VIEWS

《PostgreSQL 时间点恢复(PITR)在异步流复制主从模式下,如何避免主备切换后PITR恢复走错时间线(timeline , history , partial , restore_command , recovery.conf)》

 

免费领取阿里云RDS PostgreSQL实例、ECS虚拟机

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
SQL 关系型数据库 Linux
在CentOS 6上安装和使用PostgreSQL的方法
在CentOS 6上安装和使用PostgreSQL的方法
17 2
|
2月前
|
Ubuntu 关系型数据库 数据库
在Ubuntu 18.04上安装和使用PostgreSQL的方法
在Ubuntu 18.04上安装和使用PostgreSQL的方法
39 1
|
2月前
|
Ubuntu 关系型数据库 Linux
在Ubuntu 14.04上安装和使用PostgreSQL的方法
在Ubuntu 14.04上安装和使用PostgreSQL的方法
20 1
|
2月前
|
监控 物联网 关系型数据库
使用PostgreSQL触发器解决物联网设备状态同步问题
在物联网监控系统中,确保设备状态(如在线与离线)的实时性和准确性至关重要。当设备状态因外部因素改变时,需迅速反映到系统内部。因设备状态数据分布在不同表中,直接通过应用同步可能引入复杂性和错误。采用PostgreSQL触发器自动同步状态变化是一种高效方法。首先定义触发函数,在设备状态改变时更新管理模块表;然后创建触发器,在状态字段更新后执行此函数。此外,还需进行充分测试、监控性能并实施优化,以及在触发函数中加入错误处理和日志记录功能。这种方法不仅提高自动化程度,增强数据一致性与实时性,还需注意其对性能的影响并采取优化措施。
|
2月前
|
关系型数据库 Linux 数据库
在CentOS 7上安装和使用PostgreSQL的方法
在CentOS 7上安装和使用PostgreSQL的方法
90 0
|
4月前
|
自然语言处理 关系型数据库 数据库
技术经验解读:【转】PostgreSQL的FTI(TSearch)与中文全文索引的实践
技术经验解读:【转】PostgreSQL的FTI(TSearch)与中文全文索引的实践
35 0
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何使用PostgreSQL2.4.1从指定时间戳同步数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
SQL 关系型数据库 数据库
实时计算 Flink版产品使用合集之同步PostgreSQL数据时,WAL 日志无限增长,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在使用 DataWorks 数据集成同步 PostgreSQL 数据库中的 Geometry 类型数据如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
79 0
|
5月前
|
分布式计算 关系型数据库 大数据
MaxCompute产品使用合集之怎么才可以将 PostgreSQL 中的 geometry 空间类型字段同步到 MaxCompute 或另一个 PostgreSQL 数据库
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
下一篇
无影云桌面