异步流复制模式如何保证不丢数据?

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

标签

PostgreSQL , 流复制 , 异步 , 2PC , 3PC


背景

PostgreSQL支持多种事务commit模式,以一主多备的同步流复制为例,事务的REDO信息持久化是怎样的呢?

配置synchronous_commit参数如下,以及对应的含义:

local:表示REDO本地持久化。

on:表示本地持久化,以及一个备库持久化。

remote_write:表示本地持久化,以及备库异步WRITE完成。

off:表示本地写wal buffer完成。

quorum:表示本地持久化,同时加上备库已持久化的个数,需要超过半数节点。

很显然,如果只有一个备库,并且synchronous_commit使用local模式的话,在发生HA时,不能保证不丢数据。

但是有什么方法能做到只有一个备库,并且synchronous_commit使用local模式,还能不丢数据呢?

2PC与LSN栅栏

两阶段提交(2PC),在很多分布式数据库中,被用于确保分布式事务的一致性。

在单个数据库中,也可以被业务用于多个事务之间的依赖保证。

实际上,如果你要保证事务提交后,在异步的备库也提交,也可以使用2PC来实现。

备库延迟的判断

首先我们要了解如何判断备库的延迟.

查看当前数据库的LSN位置。

# select pg_current_xlog_insert_location();  
 pg_current_xlog_insert_location   
---------------------------------  
 3F7/517DE940  
(1 row)  

查看备库接收并持久化的WAL LSN位置。

# select flush_location from pg_stat_replication ;  
 flush_location   
----------------  
 3F7/51EAE058  
(1 row)  

当 "备库的LSN >= 当前主库的LSN" 时,说明你前面提交的事务都已经同步到备库了。

例子

主库

产生一个2PC事务

postgres=# create table test(id int);  
CREATE TABLE  
postgres=# begin;  
BEGIN  
postgres=# insert into test values (1);  
INSERT 0 1  
postgres=# prepare transaction '2pctest';  
PREPARE TRANSACTION  

查看备库LSN是否大于等于主库当前的LSN

postgres=# select flush_location from pg_stat_replication ;  
 flush_location   
----------------  
 81/A601E170  
(1 row)  
  
postgres=# select pg_current_xlog_insert_location();  
 pg_current_xlog_insert_location   
---------------------------------  
 81/A601E170  
(1 row)  

确保 备库LSN是否大于等于主库当前的LSN 后,关闭主库(模拟主库DOWN机)

pg_ctl stop -m fast  
waiting for server to shut down.... done  
server stopped  

查看备库现在有没有未结束的2pc事务,当前还没有激活,所以看不到

postgres=# select * from pg_prepared_xacts ;  
 transaction | gid | prepared | owner | database   
-------------+-----+----------+-------+----------  
(0 rows)  

激活备库

pg_ctl promote  
server promoting  

再次查看备库,未提交的2PC出现了。

psql  
psql (9.4.1)  
Type "help" for help.  
  
postgres=# select * from pg_prepared_xacts ;  
 transaction |   gid   |           prepared           |  owner   | database   
-------------+---------+------------------------------+----------+----------  
   115258352 | 2pctest | 2017-05-04 19:42:51.32323+08 | postgres | postgres  
(1 row)  

你要做的是提交或回滚这些2PC事务即可。

使用这种方式,我们在异步的流复制节点中,也可以做到不丢事务。(虽然这么做比较繁琐。)

对于非常关键的事务,你可以通过以上方式来实现异步复制也不丢数据。

事务级同步级别

实际上PostgreSQL的同步级别(synchronous_commit)可以配置在事务中,也就是说,可以对可靠性要求高的事务,设置为同步模式。

对于可靠性要求低的事务,设置为异步模式。

例子,设置事务为同步模式。

begin;  
set local synchronous_commit=on;  -- 同步模式  
....  
end;  

例子,设置事务为异步模式。

begin;  
set local synchronous_commit=local;  -- 异步模式  
....  
end;  

参考

《PostgreSQL 10.0 preview 功能增强 - slave支持WAITLSN 'lsn', time;用于设置安全replay栅栏》

https://www.postgresql.org/docs/9.6/static/sql-prepare-transaction.html

https://www.postgresql.org/docs/9.6/static/sql-commit-prepared.html

https://www.postgresql.org/docs/9.6/static/sql-rollback-prepared.html

https://www.postgresql.org/docs/9.6/static/view-pg-prepared-xacts.html

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
5月前
|
消息中间件 安全 Kafka
Kafka保证消息不丢失不重复
Kafka保证消息不丢失不重复
76 6
|
22天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
3月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之全量和增量同步数据的一致性、不丢失和不重复读取可以通过什么方式保证
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
JavaScript 前端开发 Java
流的概念,怎么处理
流的概念,怎么处理
|
5月前
|
消息中间件 存储 NoSQL
[Kafka 常见面试题]如何保证消息的不重复不丢失
[Kafka 常见面试题]如何保证消息的不重复不丢失
195 0
|
存储 XML Java
何为消息持久化?
持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
107 0
|
存储 数据库
数据复制系统设计(2)-同步复制与异步复制
复制的重要可选项: 同步复制,synchronously 异步复制,asynchronously
178 0
|
分布式数据库 数据库
复制延迟案例(1)-最终一致性
该案例违反因果律。 想象先生和夫人之间的对话: Mr Mrs,你能看到多远未来? Mrs 通常约10s,Mr.
87 0
|
消息中间件 存储 监控
MQ的作用及如何解决消息队列的丢失、重复和积压问题
引入 MQ 消息中间件最直接的目的是:做系统解耦合流量控制,追其根源还是为了解决互联网系统的高可用和高性能问题。 系统解耦:用 MQ 消息队列,可以隔离系统上下游环境变化带来的不稳定因素,比如京豆服务的系统需求无论如何变化,交易服务不用做任何改变,即使当京豆服务出现故障,主交易流程也可以将京豆服务降级,实现交易服务和京豆服务的解耦,做到了系统的高可用。
183 0
|
安全 关系型数据库 MySQL
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
114 0