`
骑猪逛街666
  • 浏览: 141804 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

标签 PostgreSQL , 流复制 , 异步 , 2PC , 3PC 背景 PostgreSQL支持多种事务commit模式,以一主多备的同步流复制为例,事务的REDO信息持久化是怎样的呢? 配置synchronous_commit参数如下,以及对应的含义: local:表示REDO本地持久化。

标签

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

分享到:
评论

相关推荐

    Postgresql主从异步流复制方案的深入探究

    3. **数据丢失风险**:异步复制可能导致少量数据丢失,需要根据业务需求权衡同步与异步复制的利弊。 4. **扩展与优化**:可以结合其他高可用技术,如负载均衡和仲裁节点,进一步提高系统的可用性。 通过深入理解...

    MySQL关于异步复制、同步复制半同步复制、无损复制的概念与区别

    如果没有从服务器的确认,则主服务器会进行超时等待,并在超时后回退到异步复制模式。半同步复制在性能和一致性之间寻求平衡,但仍然可能因为故障而导致数据不一致。 无损复制(Lossless Replication)是MySQL ...

    异步复制与同步复制 以及ehcache的小tips和我的配置

    相比之下,异步复制则不等待从节点的确认,主节点完成写操作后立即返回结果,从节点会在后台异步地复制数据。这种方式牺牲了一定的数据一致性,但提高了系统性能,降低了延迟。在大多数情况下,异步复制能满足业务...

    Oracle 白皮书 ADG 异步复制技术

    Oracle ADG(Active Data Guard)异步复制技术是Oracle数据库的一种高级高可用性和灾难恢复解决方案。ADG结合了Data Guard的功能,确保在主数据库发生故障时,能够快速、透明地切换到远程同步副本,以最小化数据丢失...

    pgpool postgresql异步流复制 数据库集群及负载的配置方法.doc

    在构建高可用性和负载均衡的数据库集群时,PostgreSQL数据库系统常采用pgpool作为中间件来实现数据的异步复制和负载分配。本文将详细介绍如何在CentOS 6.5环境下,通过pgpool与PostgreSQL结合,配置一个包含主库和多...

    异步CDC_HOTLOG模式(案例).doc

    异步CDC_HOTLOG模式是一种用于实时数据复制的技术,它基于Oracle数据库的Change Data Capture (CDC)功能和HotLog模式。这种模式允许系统在不影响主业务性能的情况下,高效地捕获和传输数据库中的变更数据到其他目标...

    异步数据同步技术

    数据库复制系统通常用于单向同步数据变更,速度快,数据量轻,但不支持复杂的交互;消息中间件则提供异步通信的网络层通道,实现透明网络编程,但它的服务层次较低,仅限于数据传输。 接下来,文章详细阐述了面向...

    C#异步完成文件夹和文件复制

    要异步复制文件,可以使用`File.CopyAsync`方法(虽然C#标准库并未提供此方法,但可以通过扩展方法实现)。同样,异步复制目录则需要自定义实现,通常涉及递归复制子目录和文件。 3. **自定义异步文件复制** ...

    linux-PerconaReplicationManager异步的MySQL复制管理器代理Pacemaker

    总结,Percona Replication Manager结合Pacemaker,为MySQL异步复制提供了强大的自动化管理能力,确保了数据库的高可用性和数据一致性。通过支持文件和基于GTID的复制方式,PRM能够适应不同的环境需求,为Linux...

    MySQL异步复制延迟解决的架构设计与运维架构

    ### MySQL异步复制延迟解决的架构设计与运维架构 #### 一、MySQL主从同步基本流程及延迟原因 在MySQL数据库系统中,主从复制是一种常见的数据同步方式,用于实现数据冗余和读写分离等功能。然而,在实际应用中,...

    MySQL 异步复制1

    MySQL异步复制是一种数据库复制模式,它允许主服务器(Master)和从服务器(Slave)之间的数据传输不保证实时同步。这种复制方式具有简单、高效的特点,但可能导致短暂的数据不一致。 在MySQL异步复制的基本流程中...

    通过Oracle的流复制实现数据库之间的同步

    通过Oracle的流复制实现数据库之间的同步,是一种高效的数据同步机制,尤其在企业级应用中,对于数据一致性和实时性有着极高的要求。Oracle Streams作为Oracle数据库的一项重要特性,自Oracle9i版本开始引入,取代了...

    MySQL 主从复制模式全面实践

    MySQL主从复制模式是数据库领域内一种重要的数据同步机制,它能够让一台主数据库服务器(master)的数据实时复制到一个或多个从数据库服务器(slave)上。这种机制在数据库的高可用性、数据备份、读写分离以及负载...

    MySQL主从复制原理 _ 异步复制 _ 半同步复制 _ GTID复制.pdf

    MySQL主从复制是一种重要的数据库高...异步复制注重性能,半同步复制兼顾数据安全性,而GTID复制则提供了更加灵活和可靠的复制管理方式。正确理解和运用这些复制策略,能够有效地提高数据库系统的可用性和数据完整性。

    分布式数据库数据复制技术.pdf

    同步复制与异步复制是两种不同的复制实现方式,同步复制能够实时地存取和更新数据,保证数据和副本的一致性,但对网络带宽和站点规模有较高要求。异步复制则会延迟数据存取和传播,具有性能良好、通信量低、可用性强...

    mysql 半同步复制模式

    MySQL的半同步复制模式(Semi-Synchronous Replication)是一种增强型的复制策略,旨在解决传统异步复制中数据丢失的问题。在半同步复制中,主库确保至少有一个从库接收到并写入了事务日志(二进制日志,binlog)后...

    数据库数据如何批量复制

    4. **异步复制**:与实时复制相对,异步复制允许一定时间的数据延迟。源数据库的更改在某个预定义的时间间隔后才被应用到目标数据库。这种模式适用于对延迟容忍度较高的场景。 5. **云服务复制**:在云环境中,很多...

    Postgres主从流复制+pgpool高可用方案.docx

    流复制有两种同步模式:同步复制(synchronous replication)和异步复制。同步复制确保主库上的事务在被确认之前,其对应的WAL日志已经安全地到达备库。这种方式能保证数据的一致性,但可能会影响写性能。而异步复制...

    mysql 5.6 半同步复制步骤

    在深入了解半同步复制模式之前,我们首先回顾一下MySQL中的异步复制模式——MySQL的默认复制选项。在异步复制模式下,Master数据库将二进制日志(binlog)发送给Slave数据库后,不再关心这些日志是否已经被成功处理。...

Global site tag (gtag.js) - Google Analytics