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

栏目: 数据库 · PostgreSQL · 发布时间: 6年前

内容简介:异步流复制模式如何保证不丢数据?

标签

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


以上所述就是小编给大家介绍的《异步流复制模式如何保证不丢数据?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编程语言实现模式

编程语言实现模式

Terence Parr / 李袁奎、尧飘海 / 华中科技大学出版社 / 2012-3-20 / 72.00元

《编程语言实现模式》旨在传授开发语言应用(工具)的经验和理念,帮助读者构建自己的语言应用。这里的语言应用并非特指用编译器或解释器实现编程语言,而是泛指任何处理、分析、翻译输入文件的程序,比如配置文件读取器、数据读取器、模型驱动的代码生成器、源码到源码的翻译器、源码分析工具、解释器,以及诸如此类的工具。为此,作者举例讲解已有语言应用的工作机制,拆解、归纳出31种易于理解且常用的设计模式(每种都包括通......一起来看看 《编程语言实现模式》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具