异步流复制模式如何保证不丢数据?
栏目: 数据库 · 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
以上所述就是小编给大家介绍的《异步流复制模式如何保证不丢数据?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 【MySQL】主从异步复制配置
- Postgresql主从异步流复制方案
- MongoDB复制选举原理及复制集管理
- MySQL组复制MGR(二)-- 组复制搭建
- Redis系列(四):Redis的复制机制(主从复制)
- JavaScript中对象的浅复制和深复制 原 荐
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
CLR via C#
Jeffrey Richter / 周靖 / 清华大学出版社 / 2015-1-1 / CNY 109.00
《CLR via C#(第4版)》针对CLR和.NET Framework 4.5进行深入、全面的探讨,并结合实例介绍了如何利用它们进行设计、开发和调试。全书5部分共29章。第Ⅰ部分介绍CLR基础,第Ⅱ部分解释如何设计类型,第Ⅲ部分介绍基本类型,第Ⅳ部分以核心机制为主题,第Ⅴ部分重点介绍线程处理。 通过本书的阅读,读者可以掌握CLR和.NET Framework的精髓,轻松、高效地创建高性能......一起来看看 《CLR via C#》 这本书的介绍吧!