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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
34 1
|
7月前
|
SQL 关系型数据库 分布式数据库
PolarDB在尝试同步DDL任务时出现了问题
PolarDB在尝试同步DDL任务时出现了问题
69 1
|
安全 关系型数据库 数据库
Postgresql 数据库用户权限授权(用户角色分配模式)
为了更方面和安全地管理数据库用户账号权限安全,实现通过用户角色代理的模式,实现用户账号功能授权的模式
15036 2
Postgresql 数据库用户权限授权(用户角色分配模式)
|
25天前
|
关系型数据库 MySQL OLAP
PolarDB +AnalyticDB Zero-ETL :免费同步数据到ADB,享受数据流通新体验
Zero-ETL是阿里云瑶池数据库提供的服务,旨在简化传统ETL流程的复杂性和成本,提高数据实时性。降低数据同步成本,允许用户快速在AnalyticDB中对PolarDB数据进行分析,降低了30%的数据接入成本,提升了60%的建仓效率。 Zero-ETL特性包括免费的PolarDB MySQL联邦分析和PolarDB-X元数据自动同步,提供一体化的事务处理和数据分析,并能整合多个数据源。用户只需简单配置即可实现数据同步和实时分析。
|
28天前
|
关系型数据库 分布式数据库 数据库
PolarDB常见问题之PolarDB影响下游的binlogl同步如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
4月前
|
关系型数据库 Serverless 分布式数据库
PolarDB的Serverless模式支持自动纵向扩展
PolarDB的Serverless模式支持自动纵向扩展
|
4月前
|
关系型数据库 Serverless 分布式数据库
PolarDB的Serverless模式可以根据业务负载的变化
PolarDB的Serverless模式可以根据业务负载的变化
|
SQL 存储 Oracle
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
快速学习19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍
533 0
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
|
11月前
|
SQL 分布式计算 DataWorks
PolarDB同步到maxcompute
PolarDB同步到maxcompute
91 0
|
SQL 安全 关系型数据库
RDS SQL Server通过配置镜像为高性能模式提高写入性能
RDS SQL Server通过配置镜像为高性能模式提高写入性能

相关产品

  • 云原生数据库 PolarDB