PG的synchronous_commit

简介: PG的synchronous_commit

PostgreSQL复制中有个很重要的参数:synchronous_commit。它决定何时向客户端确认事务提交成功。这个参数不仅仅关于主备同步,还有更广泛的含义,对于单机PG实例也很有用。为了更好地理解,需要了解WAL记录的整个传播过程以及可以接受提交确认的各个阶段。这使得我们能够为每个事务选择不同级别的持久性。持久性的级别越低,确认越快,从而提高系统整体吞吐量和性能。


WAL传播


首先看下WAL传播过程。

PG内部函数pg_write()将WAL日志写入WAL段文件内,内部使用write()系统调用,并不保证数据刷写到磁盘。为了完成刷写,需要调用issue_xlog_fsync(),根据GUC参数wal_sync_method发出适当类型的fsync:

上图显示了所有的5个阶段:

1)WAL记录插入本地WAL BUFFERWAL记录首先在WAL缓冲区中创建。由于多个后台进程将并发创建WAL,因此需要锁来包含。不同的后台进程将WAL BUFFER中的WAL持续写入WAL段文件。如果sychronous_commit设置为off,则不会立即刷写,而是依赖于wal_writer_delay的设置。

2)WAL writeWAL flush。对本地磁盘上的WAL段文件进行刷写是一个繁重的操作之一。PG在这方面做了很多优化,以避免频繁刷写。

3)远程写入。WAL记录写入远程操作系统缓存,但并没有刷新。数据可能会在操作系统缓存保留一段时间。除非需要解决主备同时崩溃的情况,否则可以考虑使用这种级别的持久性保护。

4)远程刷新。这个阶段,数据才真正写入远程备机的磁盘。所以此时崩溃也可以保证备机的数据是可用的。

5)远程应用。这个阶段,WAL记录在远程备机回放,并且正在运行的会话可以访问。

这样再看该参数的可用值意义:

1)off:关闭synchronous_commit可以使用off,0,false或者no。顾名思义,提交确认可以在将记录刷新到磁盘之前进行。通常称为异步提交。如果PG崩溃,最后几个异步提交可能会丢失。

2)localWAL记录写入并刷写到本地磁盘。这种情况下,将本地WAL日志写入和刷写完成后才提交。

3)remote_writeWAL记录成功发送给备机,远程备机确认写入(不是刷写)

4)on:这个是默认值。可以使用on,true,yes或者1.根据是否有复制含义可能有所不同。若有复制,则导致等等“远程刷新”

5)remote_apply:直到备机接收到的事务回放了,才返回主机确认可以提交了。

如果没有同步备机synchronous_standby_names为空,则synchronous_commitonremote_applyremote_writelocal的设置都提供相同级别的同步级别:事务提交只等待本地刷新到磁盘。不同值对性能的影响:

off (async) > on (async) > remote_write (sync) > on|local (sync)  > remote_apply (sync)

那么当选择完全异步提交synchronous_commit=off时,会丢失多少数据呢?

这依赖于wal_writer_delay的设置。默认是200ms。也就是每隔wal_writer_delayWAL writer都会被唤醒并调用XLogBackgroundFlush(),将WAL刷写到磁盘。他会检查完全填充的WAL页,如果可用,则将WAL write到这个点。在良好负载下,WAL writer会将整个WAL BUFFERwrite。在没有找到full pages的低负载情况下,仅刷写到上一个异步提交的位置。

如果超过wal_writer_delay或者自上次刷新以来写入的块超过wal_writer_flush_after,则WAL 被刷新到当前位置。这种安排保证了异步提交记录在事务完成后最多两次wal_writer_delay后到达磁盘。但是,PostgreSQL 以灵活的方式写入/刷新完整缓冲区,这是为了减少在每个 WAL writer周期填充多个 WAL 页面时在高负载下发出的写入次数。从概念上讲,这使得最坏情况延迟最多三个wal_writer_delay 周期。


在大多数情况下,损失将小于 wal_writer_delay 的两倍。但在最坏的情况下,它可能高达三倍。

目录
相关文章
|
SQL
记一次不常见到主从延迟问题
Slave_SQL_Running_State: Waiting for dependent transaction to commit 导致的主从延迟
8224 1
|
SQL 关系型数据库 数据库
PostgreSQL性能飙升的秘密:这几个调优技巧让你的数据库查询速度翻倍!
【10月更文挑战第25天】本文介绍了几种有效提升 PostgreSQL 数据库查询效率的方法,包括索引优化、查询优化、配置优化和硬件优化。通过合理设计索引、编写高效 SQL 查询、调整配置参数和选择合适硬件,可以显著提高数据库性能。
2195 2
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
通用人工智能的标准是什么,与大模型有何区别?发展到什么程度了?
本文深入解析2025年迅猛发展的通用人工智能(AGI),梳理其核心概念、关键技术与现实应用,对比当前主流大模型的差异,并探讨普通人如何在日常生活与工作中体验和应用这一颠覆性技术,展望AGI带来的社会变革与伦理挑战。
|
SQL 关系型数据库 数据库
手把手教你管理PostgreSQL数据库及其对象
手把手教你管理PostgreSQL数据库及其对象
852 0
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真
本项目展示了使用MATLAB 2022a和USB摄像头识别显示器上不同水果图片的算法。通过预览图可见其准确识别效果,完整程序无水印。项目采用GoogleNet(Inception-v1)深度卷积神经网络,利用Inception模块捕捉多尺度特征。代码含详细中文注释及操作视频,便于理解和使用。
|
监控 安全 搜索推荐
新手指南:Google邮箱注册全过程步骤教学
对于从事外贸、需要与外国客户或朋友沟通的小伙伴来说,拥有一个Google账号(也就是Gmail账号,下文统一用Google邮箱来表述)至关重要!
在Linux中,Rsync 同步时,如果要同步的源中有软连接,如何把软连接的目标文件或者目录同步?
在Linux中,Rsync 同步时,如果要同步的源中有软连接,如何把软连接的目标文件或者目录同步?
|
JavaScript 前端开发 数据安全/隐私保护
【好用】推荐10套后端管理系统前端模板
选择合适的模板可以大大提高开发效率,减少重复劳动,让开发者能够专注于业务逻辑的实现和功能的优化。开发者应根据项目的具体需求、团队的技术栈熟悉度以及产品的长远规划来选择最合适的模板,问题来了,这10款模板你更喜欢用哪个呢,欢迎交流。
1467 0
|
SQL 分布式计算 运维
面向未来的开源 OLAP 技术架构探讨以及选型实践
本文详细介绍了开源大数据OLAP的演化过程和最佳实践。
10428 57
|
SQL 监控 关系型数据库
MySQL 8.0不再担心被垃圾SQL搞爆内存
MySQL 8.0.28开始,新增一个特性,支持监控统计并限制各个连接(会话)的内存消耗,避免大量用户连接因为执行垃圾SQL消耗过多内存,造成可能被OOM kill的风险。 首先,需要先设置系统选项 global_connection_memory_tracking = 1,之后可以通过系统状态变量 Global_connection_memory 查看当前所有连接消耗的内存总量:
896 0