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日志文件即可向客户端返回成功。
2. synchronous_commit=local
含义同上,表示提交事务时需等待相应WAL数据写入本地WAL日志文件后才向客户端返回成功。
3. synchronous_commit=remote_write
当流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入备节点操作系统缓存中,才向客户端返回成功。
简单地说 remote write 表示本地WAL已落盘,备库的WAL还在备库操作系统缓存中,也就是只有一份持久化的WAL。这个选项带来的事务响应时间较低,但安全性也相对较低——这种情况下备库实例出现异常关闭时己传送的WAL日志不会有丢失风险,但备库操作系统异常宕机就有已传送的WAL丢失风险了,因为此时WAL可能还没完全写人备节点WAL文件中。
4. synchronous_commit=on
on跟单实例下含义不同,表示流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入WAL文件,之后才向客户端返回成功。
简单地说 on 表示本地和备库的WAL都已落盘,有两份持久化的WAL,但备库此时还没有完成apply,这个选项带来的事务响应时间较高 。
5. synchronous_commit=remote_apply
表示流复制主库提交事务时 ,需等待备库完成相应部分apply才向客户端返回成功。
简单地说 remote_apply 表示本地和备库的WAL都已落盘且备库完成相应部分apply,这个设置保证了拥有两份持久化的 WAL,同时备库也完成了重做,这个选项带来的事务响应时间最高 。
三、 性能对比
参考
《赵振平--太阳塔--PostgreSQL 可否用在银行核心交易系统》
《PostgreSQL实战》