热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PostgreSQL鱼与熊掌可兼得多副本0丢失与高性能兼得事务级异步、同步开关

digoal德哥专栏PostgreSQL-鱼与熊掌可兼得-多副本0丢失与高性能兼得-

作者

digoal


日期

2017-12-07


标签

PostgreSQL , synchronous_commit , redo , local , remote_write , remote_apply , on , off




背景

大多数的数据库属于IO密集型应用,特别是写繁忙的TP系统,例如账户系统。

为了保证数据的可靠性,事务提交时,需要确保事务产生的REDO落到持久化的存储中。

为了提高响应时间,除了数据库软件本身的优化,例如分组提交(降低IO频次)。还可以通过购买高IOPS能力的硬件来实现RT时延的降低。

当然,将来硬盘的IO延迟如果能和内存到一个级别,实际上就没有REDO什么事了。

实际上,还有一种折中的方法,异步提交。

PostgreSQL的异步提交模式非常多,(PG的异步提交不会导致数据的不一致,并且是专门的进程在调度写出,所以即使异步,基本上涉及事务RECORD丢的可能性也非常少)。 例如:

```

synchronous_commit

local, remote_write, remote_apply, on, off.

```

解释

```

local, 本地fsync

remote_write, 本地fsync + 超阈值个数的 sync standby write (quorum based sync standby)

on, 本地fsync + 超阈值个数的 sync standby fsync (quorum based sync standby)

remote_write, 本地fsync + 超阈值个数的 sync standby apply (quorum based sync standby)

off, 本地write

```

同时PostgreSQL支持事务级修正synchronous_commit提交模式。

例如,对可靠性要求高的事务,可以设置高等级的模式,可靠性要求低的事务可以使用低等级模式,提高性能。

pic


例子

即使在同一个事务中,我们也能根据涉及金额的大小来修正synchronous_commit.

例如涉及金额低于10 RMB时,继续使用异步提交,即使真的丢失几笔,赔偿来解决也是没有问题的。有些时候硬件成本远远比赔偿金额还要高。

1、开启事务

postgres=# begin;
BEGIN

2、执行一些事务内的SQL

```

postgres=# select 2;

?column?



2

(1 row)

```

3、涉及金额小于10,不改变默认的异步模式

```

postgres=# insert into tbl_charge values (3,1,now());

INSERT 0 1

postgres=# show synchronous_commit ;

synchronous_commit



off

(1 row)

```

4、当程序发现涉及金额大于10时,主动设置当前事务的模式为同步模式。确保事务提交后,绝对不丢失。

```

postgres=# set local synchronous_commit = on;

SET

postgres=# show synchronous_commit ;

synchronous_commit



on

(1 row)

postgres=# insert into tbl_charge values (4,10000000,now());

INSERT 0 1

```

5、结束事务,由于使用了同步模式,绝对不可能丢事务。

postgres=# end;
COMMIT

6、当前会话当前模式又回到了默认的异步模式。

```

postgres=# show synchronous_commit ;

synchronous_commit



off

(1 row)

```


模式可设置的范围

1、系统级

2、库级

3、用户级

4、会话级

5、事务级

根据不同的需求,在不同的层级设置即可。


小结

通过提交模式的多种组合,可以达到多种可靠性要求。

通过事务级的设置,可以在不同的事务间,在性能、可靠性方面自由的选择。

使用较低成本的硬件,实现业务对高可靠和高可用的混合需求。


参考

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

《PG多节点(quorum based), 0丢失 HA(failover,switchover)方案》

《PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别》


PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.


9.9元购买3个月阿里云RDS PostgreSQL实例


PostgreSQL 解决方案集合


德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat


推荐阅读
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
author-avatar
姓赵的妖女
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有