PostgreSQL quorum based同步复制模式在极端情况下的0丢失破坏问题

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

标签

PostgreSQL , quorom based sync replication , 2PC , 0丢失


背景

PostgreSQL 9.6开始支持了quorum based 同步复制机制,当客户端发起事务结束请求时,必须要等这笔事务对应的redo日志复制到了指定副本,主库才响应客户端。

从而保证客户端正常收到主库反馈后,WAL日志一定已经有了多个副本,保证数据的0丢失。

但是在极端情况下,可能无法保障0丢失,为什么呢?

因为WAL日志先落主库,然后等备库复制,最后反馈客户端。

比如用户提交事务前,备库挂了,实际上主库本地的WAL已经写了,数据在本地已经持久化。只是主库要等符合quorum based个数备库那边接收到WAL的位点反馈,才反馈给客户端提交成功。

因此,当客户端在等待过程中,如果连接中断,就会造成本地已提交,但是有可能某些备库没有收到WAL的情况。

客户端如果重新与主库建立连接,它可以看到已提交的数据。

在pg_shardman的介绍中,也提到了类似的问题

https://github.com/postgrespro/pg_shardman

The trade-off is well-known: asynchronous replication is faster, but allows replica to lag arbitrary behind the primary, which might lead to loss of a bunch of recently committed transactions (if primary holder fails), or WAL puffing up in case of replica failure. Synchronous replication is slower, but committed transaction are typically not dropped. Typically, because it is actually still possible to lose them without kind of 2PC commit. Imagine the following scenario:

  • Primary's connection with replica is teared down.
  • Primary executes a transaction, e.g. adds some row with id 42, commits it locally and blocks because there is no connection with replica.
  • Client suddenly loses connection with primary for a moment and reconnects to learn the status of the transaction, sees the row with id 42 and thinks that it has been committed.
  • Now primary fails permanently and we switch to the replica. Replica has no idea of that transaction, but client is sure it is committed.

2PC可以保证一次客户端连接丢失带来的问题

预提交成功    
    
2PC提交    
    
备库挂    
    
主库2PC提交成功    
    
客户端丢失连接    
    
客户端重新发起连接,发现主库已经2PC提交成功,可以看到数据    
    
主库挂掉    
    
切换到备库,客户端重新发起连接,发现备库还没有数据,因为2PC还没有结束,可以人为介入处理,不会丢数据。    

2PC不可以保证超过一次客户端连接丢失带来的问题

预提交    
    
备库挂    
    
主库预提交成功    
    
客户端丢失连接    
    
客户端重新发起连接,发现主库已经预提交成功,发起2PC提交    
    
客户端丢失连接    
    
客户端重新发起连接,发现主库已经2PC提交成功,可以看到数据    
    
主库挂掉    
    
切换到备库,客户端重新发起连接,发现备库还没有数据,丢数据。    

小结

当备库挂掉,无法满足quorum时,客户端提交事务后,会处于等待状态,但是如果客户端丢失连接,再次发起请求,可以看到仅仅在主库提交的数据。对于2PC事务,只要多次丢失连接,同样会造成问题。

参考

《PG多节点(quorum based), 0丢失 HA(failover,switchover)方案》

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

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
3月前
|
监控 物联网 关系型数据库
使用PostgreSQL触发器解决物联网设备状态同步问题
在物联网监控系统中,确保设备状态(如在线与离线)的实时性和准确性至关重要。当设备状态因外部因素改变时,需迅速反映到系统内部。因设备状态数据分布在不同表中,直接通过应用同步可能引入复杂性和错误。采用PostgreSQL触发器自动同步状态变化是一种高效方法。首先定义触发函数,在设备状态改变时更新管理模块表;然后创建触发器,在状态字段更新后执行此函数。此外,还需进行充分测试、监控性能并实施优化,以及在触发函数中加入错误处理和日志记录功能。这种方法不仅提高自动化程度,增强数据一致性与实时性,还需注意其对性能的影响并采取优化措施。
|
4月前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之使用连接串模式新增PostgreSQL数据源时遇到了报错"not support data sync channel, error code: 0001",该怎么办
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何使用PostgreSQL2.4.1从指定时间戳同步数据
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 关系型数据库 数据库
实时计算 Flink版产品使用合集之同步PostgreSQL数据时,WAL 日志无限增长,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在使用 DataWorks 数据集成同步 PostgreSQL 数据库中的 Geometry 类型数据如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
86 0
|
6月前
|
分布式计算 关系型数据库 大数据
MaxCompute产品使用合集之怎么才可以将 PostgreSQL 中的 geometry 空间类型字段同步到 MaxCompute 或另一个 PostgreSQL 数据库
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
SQL 存储 Oracle
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
快速学习19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
|
SQL 存储 关系型数据库
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
快速学习PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
|
存储 关系型数据库 Java
知识分享之PostgreSQL——数据库中的模式(Schema)
日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。 同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。
381 0
知识分享之PostgreSQL——数据库中的模式(Schema)
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 模式(SCHEMA)
PostgreSQL 模式(SCHEMA)
120 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版