标签 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
相关推荐
3. **数据丢失风险**:异步复制可能导致少量数据丢失,需要根据业务需求权衡同步与异步复制的利弊。 4. **扩展与优化**:可以结合其他高可用技术,如负载均衡和仲裁节点,进一步提高系统的可用性。 通过深入理解...
如果没有从服务器的确认,则主服务器会进行超时等待,并在超时后回退到异步复制模式。半同步复制在性能和一致性之间寻求平衡,但仍然可能因为故障而导致数据不一致。 无损复制(Lossless Replication)是MySQL ...
相比之下,异步复制则不等待从节点的确认,主节点完成写操作后立即返回结果,从节点会在后台异步地复制数据。这种方式牺牲了一定的数据一致性,但提高了系统性能,降低了延迟。在大多数情况下,异步复制能满足业务...
Oracle ADG(Active Data Guard)异步复制技术是Oracle数据库的一种高级高可用性和灾难恢复解决方案。ADG结合了Data Guard的功能,确保在主数据库发生故障时,能够快速、透明地切换到远程同步副本,以最小化数据丢失...
在构建高可用性和负载均衡的数据库集群时,PostgreSQL数据库系统常采用pgpool作为中间件来实现数据的异步复制和负载分配。本文将详细介绍如何在CentOS 6.5环境下,通过pgpool与PostgreSQL结合,配置一个包含主库和多...
异步CDC_HOTLOG模式是一种用于实时数据复制的技术,它基于Oracle数据库的Change Data Capture (CDC)功能和HotLog模式。这种模式允许系统在不影响主业务性能的情况下,高效地捕获和传输数据库中的变更数据到其他目标...
数据库复制系统通常用于单向同步数据变更,速度快,数据量轻,但不支持复杂的交互;消息中间件则提供异步通信的网络层通道,实现透明网络编程,但它的服务层次较低,仅限于数据传输。 接下来,文章详细阐述了面向...
要异步复制文件,可以使用`File.CopyAsync`方法(虽然C#标准库并未提供此方法,但可以通过扩展方法实现)。同样,异步复制目录则需要自定义实现,通常涉及递归复制子目录和文件。 3. **自定义异步文件复制** ...
总结,Percona Replication Manager结合Pacemaker,为MySQL异步复制提供了强大的自动化管理能力,确保了数据库的高可用性和数据一致性。通过支持文件和基于GTID的复制方式,PRM能够适应不同的环境需求,为Linux...
### MySQL异步复制延迟解决的架构设计与运维架构 #### 一、MySQL主从同步基本流程及延迟原因 在MySQL数据库系统中,主从复制是一种常见的数据同步方式,用于实现数据冗余和读写分离等功能。然而,在实际应用中,...
MySQL异步复制是一种数据库复制模式,它允许主服务器(Master)和从服务器(Slave)之间的数据传输不保证实时同步。这种复制方式具有简单、高效的特点,但可能导致短暂的数据不一致。 在MySQL异步复制的基本流程中...
通过Oracle的流复制实现数据库之间的同步,是一种高效的数据同步机制,尤其在企业级应用中,对于数据一致性和实时性有着极高的要求。Oracle Streams作为Oracle数据库的一项重要特性,自Oracle9i版本开始引入,取代了...
MySQL主从复制模式是数据库领域内一种重要的数据同步机制,它能够让一台主数据库服务器(master)的数据实时复制到一个或多个从数据库服务器(slave)上。这种机制在数据库的高可用性、数据备份、读写分离以及负载...
MySQL主从复制是一种重要的数据库高...异步复制注重性能,半同步复制兼顾数据安全性,而GTID复制则提供了更加灵活和可靠的复制管理方式。正确理解和运用这些复制策略,能够有效地提高数据库系统的可用性和数据完整性。
同步复制与异步复制是两种不同的复制实现方式,同步复制能够实时地存取和更新数据,保证数据和副本的一致性,但对网络带宽和站点规模有较高要求。异步复制则会延迟数据存取和传播,具有性能良好、通信量低、可用性强...
MySQL的半同步复制模式(Semi-Synchronous Replication)是一种增强型的复制策略,旨在解决传统异步复制中数据丢失的问题。在半同步复制中,主库确保至少有一个从库接收到并写入了事务日志(二进制日志,binlog)后...
4. **异步复制**:与实时复制相对,异步复制允许一定时间的数据延迟。源数据库的更改在某个预定义的时间间隔后才被应用到目标数据库。这种模式适用于对延迟容忍度较高的场景。 5. **云服务复制**:在云环境中,很多...
流复制有两种同步模式:同步复制(synchronous replication)和异步复制。同步复制确保主库上的事务在被确认之前,其对应的WAL日志已经安全地到达备库。这种方式能保证数据的一致性,但可能会影响写性能。而异步复制...
在深入了解半同步复制模式之前,我们首先回顾一下MySQL中的异步复制模式——MySQL的默认复制选项。在异步复制模式下,Master数据库将二进制日志(binlog)发送给Slave数据库后,不再关心这些日志是否已经被成功处理。...