pg 之 synchronous_commit参数

synchronous_commit参数是WAL相关配置参数,用于指定当数据库提交事务时是否需要等待WAL日志写入硬盘后才向客户端返回成功,这个参数可选值多(on、off、local、remote_write、remote_apply 五种),参数值在单实例和主从复制场景下含义也不尽相同。恰好看pg大会ppt的时候发现有描述参数含义不错的图,结合之前看过的文章整理学习学习。

 

一、 单实例

单实例下因为没有远程节点,所以只有三个值可以设(on、off、local),并且此时设为on和local基本是一个意思,相当于只有on、off两种值,下面分别来看。

 

1. synchronous_commit=on / local

单实例下设置成 on或local 均表示提交事务时需等待相应WAL数据写入本地WAL日志文件后才向客户端返回成功。设置成on非常安全,但数据库性能有损耗 。

 

2. synchronous_commit=off

与上面相反,设置成off表示提交事务时不需等待相应WAL数据写入本地WAL日志文件即可向客户端返回成功。当数据库宕机时最新提交的少量事务可能丢失,但数据库重启后会认为这些事务异常中止。设置成off能够提升数据库性能,因此对于数据准确性没有精确要求同时追求数据库性能的场景建议设置成off。

 

二、 主从复制

主从复制场景下五种值都可以设置,并且由于有了远程节点,on和local的含义也不再相同。

 

1. synchronous_commit=off

含义同上,表示提交事务时不需等待本地相应WAL数据写入本地WAL日志文件即可向客户端返回成功。

pg 之 synchronous_commit参数_第1张图片

 

2. synchronous_commit=local

含义同上,表示提交事务时需等待相应WAL数据写入本地WAL日志文件后才向客户端返回成功。

pg 之 synchronous_commit参数_第2张图片

 

3. synchronous_commit=remote_write

当流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入备节点操作系统缓存中,才向客户端返回成功。

简单地说 remote write 表示本地WAL已落盘,备库的WAL还在备库操作系统缓存中,也就是只有一份持久化的WAL。这个选项带来的事务响应时间较低,但安全性也相对较低——这种情况下备库实例出现异常关闭时己传送的WAL日志不会有丢失风险,但备库操作系统异常宕机就有已传送的WAL丢失风险了,因为此时WAL可能还没完全写人备节点WAL文件中。

pg 之 synchronous_commit参数_第3张图片

 

4. synchronous_commit=on

on跟单实例下含义不同,表示流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入WAL文件,之后才向客户端返回成功。

简单地说 on 表示本地和备库的WAL都已落盘,有两份持久化的WAL,但备库此时还没有完成apply,这个选项带来的事务响应时间较高 。

pg 之 synchronous_commit参数_第4张图片

 

5. synchronous_commit=remote_apply

表示流复制主库提交事务时 ,需等待备库完成相应部分apply才向客户端返回成功。

简单地说 remote_apply 表示本地和备库的WAL都已落盘且备库完成相应部分apply,这个设置保证了拥有两份持久化的 WAL,同时备库也完成了重做,这个选项带来的事务响应时间最高 。

pg 之 synchronous_commit参数_第5张图片

 

三、 性能对比

pg 之 synchronous_commit参数_第6张图片

 

参考

《赵振平--太阳塔--PostgreSQL 可否用在银行核心交易系统》

《PostgreSQL实战》

你可能感兴趣的:(灾备,PostgreSQL,性能)